Gdzie umieścic najlepiej Randomize

0

Na końcu programu mam umieszczone:

initialization
  Randomize;

end.

Form jest wiele i w każdej z nich odwołuję się do do Randomize. Czy w głównej formie wystarczy użyć owego modułu czy też w każdej z nich przed wywołaniem random.

2

Procedurę Randomize możesz umieścić gdziekolwiek w kodzie byle w takim miejscu programu aby spełniło 2 warunki:

  1. Procedura wykonała się tylko raz
  2. Procedura wykonała się przed pierwszym wywołaniem funkcji Random
    Może to być np. OnCreate formy głównej, może to być właśnie sekcja initialization jej modułu lub plik projektu (DPR) w każdym razie wywołuje się ją tylko raz niezależnie ile masz modułów to w jednym.
0

kAzek

Mam wątpliwości co do tego czy randomize będzie ładowane na pozostałe formy, gdyż nie mam form w pliku dpr czyli

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2);
  Application.Run;
end. 

wywołuję pozostałe formy jak w tym przypadku dla formy2 poprzez unit1:

Unit1;

uses Unit2;

procedure wykonaj;
begin
 TForm2 := TTForm2.Create(Application);
  try
  TForm2.ShowModal;
 finally
  TForm2.Free;
  end;
end;
2

Ech, wiesz do czego służy sekcja initialization? Kod w tej sekcji wywołuje się jeszcze zanim cokolwiek się stanie. Oczywiście, jeśli w innym unicie będziesz miał w tej sekcji użyte Random(), to może to nie zadziałać, bo kolejność wywołania sekcji initialization jest raczej przypadkowa. W innym przypadku Twój kod MUSI zadziałać. I sposób tworzenia form nie ma tu żadnego znaczenia.

I powtórzę za @kAzek:

  • randomize ma być wywołane TYLKO RAZ w ciągu życia całej aplikacji.
  • randomize ma być wywołane PRZED pierwszym użyciem Random.

To są dwa warunki konieczne i wystarczające, żeby Random działało poprawnie.

0

@Bruno(M): wiesz w ogóle co robi procedura Randomize? No to patrz:

procedure Randomize();
begin
  RandSeed := GetTickCount();
end;

Dużo, prawda? :]


Według mnie najlepszym miejscem na wywołanie tej procedury jest główny plik projektu, czyli plik .dpr dla Delphi lub plik .lpr dla Lazarusa. Głównie dlatego, że kod tego modułu wykonywany jest tylko raz, więc wywołując omawianą procedurę na jego początku (tuż po begin otwierającym główny blok kodu) ma się pewność, że wywołana zostanie tylko raz.

A w przypadku gdy nie wiemy czy procedurę tę wywołaliśmy czy nie, wystarczy kuknąć do tego modułu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1