Delphi бесконечный цикл - PullRequest
       0

Delphi бесконечный цикл

0 голосов
/ 19 января 2020

Программа должна прочитать список и извлечь случайную строку из списка. У меня проблема, когда у меня есть больше извлечений, чем строки списка. Программа вылетает. Как я могу заставить его повторять строки в случайной последовательности и не создавать sh?

Вот ссылка на файлы:

https://drive.google.com/open?id=1TVx4cEGhdd0OiM60fq7FkykyBx496Fo-

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Button2: TButton;
    Edit2: TEdit;
    Edit3: TEdit;
    Button3: TButton;
    Edit4: TEdit;
    Memo2: TMemo;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

{procedura de salvare a fisierului cu subiecte extrase}
procedure TForm1.Button2Click(Sender: TObject);
begin
  Memo2.Lines.SaveToFile(Edit2.Text);
end;

{procedura de incarcare a fisierelor}
procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
begin
  {incarc din fisierul cu subiecte a carui nume este dat in edit1}
  Memo1.Lines.LoadFromFile(Edit1.Text);
  {incarc din fisierul cu subiecte extrase deja, a carui nume este dat in edit2}
  Memo2.Lines.LoadFromFile(Edit2.Text);
  {depun numarul de ordine al subiectului in memo1}
  for i := 0 to Memo1.Lines.Count-1 do
    Memo1.Lines[i] := IntToStr(i+1) + '. ' + Memo1.Lines[i];
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  s: string;
  i: integer;
  atribuit: boolean;
begin
  Randomize; {pornesc generatorul de numere aleatoare}
  atribuit := true; {indicator al atribuirii anterioare a unui subiect}
  while atribuit = true do
  begin
    {citesc aleator o linie din fisierul cu subiecte}
    s := Memo1.Lines[Random(Memo1.Lines.Count-1)];
    atribuit := false;
    for i := 0 to Memo2.Lines.Count do
      if Pos(s, Memo2.Lines[i]) > 0 then
        atribuit := true;    {subiectul a fost atribuit anterior}
  end;
  {am gasit un subiect neatribuit}
  Edit4.Text := Edit3.Text + ': ' + s;
  Memo2.Lines.Add(Edit4.Text); {il adaug la memo2 impreuna cu numele stud.}
end;

end.

1 Ответ

0 голосов
/ 19 января 2020

Я думаю, что нашел решение.

Теперь он просто выдает случайные строки из списка, даже если они повторяются.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Button2: TButton;
    Edit2: TEdit;
    Edit3: TEdit;
    Button3: TButton;
    Edit4: TEdit;
    Memo2: TMemo;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

{procedura de salvare a fisierului cu subiecte extrase}
procedure TForm1.Button2Click(Sender: TObject);
begin
  Memo2.Lines.SaveToFile(Edit2.Text);
end;

{procedura de incarcare a fisierelor}
procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
begin
  {incarc din fisierul cu subiecte a carui nume este dat in edit1}
  Memo1.Lines.LoadFromFile(Edit1.Text);
  {incarc din fisierul cu subiecte extrase deja, a carui nume este dat in edit2}
  Memo2.Lines.LoadFromFile(Edit2.Text);
  {depun numarul de ordine al subiectului in memo1}
  for i := 0 to Memo1.Lines.Count-1 do
    Memo1.Lines[i] := IntToStr(i+1) + '. ' + Memo1.Lines[i];
end;

procedure TForm1.Button3Click(Sender: TObject);
var
  s: string;
  i: integer;
  atribuit: boolean;
begin
  {pornesc generatorul de numere aleatoare}
  i := Memo1.Lines.Count-1;
  {citesc aleator o linie din fisierul cu subiecte}
  s := Memo1.Lines[Random(i)];

  {am gasit un subiect neatribuit}
  Edit4.Text := Edit3.Text + ': ' + s;
  Memo2.Lines.Add(Edit4.Text); {il adaug la memo2 impreuna cu numele stud.}
end;

end.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...