Witam,
Od kilku dni próbuję napisać aplikację w delphi 7, która zmieniłaby captiony 3 labeli ale w 3 osobnych wątkach (label1.caption zmienia się w pierwszym wątku, label2.caption zmienia się w drugim i label3.caption zmienia się w 3 wątku). Ale chciałbym by wszystkie captiony zmieniły się w dokładnie tym samym momencie.
Na 4programmers znalazłem taki, kod, losuje on jakąś maksymalna wartość progressbaru i przypisuje do każdego wartość licznika "i" w pętli aż do wylosowanej maksymalnej wartosci. Pierwszy problem jaki zauważyłem, to to że nie dzieje się to synchronicznie, zawsze jest jakaś przerwa między "przeskakiwaniem tych kresek". A drugi problem jest taki, że gdy na formę wrzucę jakiś label i chcę zmienić jego caption w procedurze Execute to wywala mi:
[Pascal Error] Unit1.pas(1): Unable to invoke Code Completion due to errors in source code
Ciekawa też rzecz jest taka, że jak z menu wybiorę stworzenie nowego wątku to tworzy mi jakby drugi plik z kodem "Unit2", a cała forma jest na Unit1 i co bym nie wrzucił (button, edit, label, memo) to stworzony wątek już go nie rozpozna :P
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls;
type
TForm1 = class(TForm)
btnGo: TButton;
ProgressBar1: TProgressBar;
ProgressBar2: TProgressBar;
ProgressBar3: TProgressBar;
procedure btnGoClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TGoThread = class(TThread)
private
FV : Integer; // wylosowana liczba
FCounter : Integer; // numer wątku
pozycja : Integer;
procedure SetProprties;
protected
procedure Execute; override;
public
constructor Create(Counter : Integer);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.btnGoClick(Sender: TObject);
begin
{ utworzenie trzech wątków }
TGoThread.Create(1);
TGoThread.Create(2);
TGoThread.Create(3);
end;
constructor TGoThread.Create(Counter: Integer);
begin
inherited Create(False); // wywołanie wątku
FCounter := Counter; // przypisanie wartości do zmiennej
end;
procedure TGoThread.Execute;
var
i : Integer;
begin
FreeOnTerminate := True; // zwolnij po zakończeniu wątku
Randomize;
FV := Random(1000);
{ odnalezienie komponentu na formularzu }
TProgressBar(Form1.FindComponent('ProgressBar' + InttoStr(FCounter))).Max := FV;
for i := 0 to FV do
begin
Sleep(10);
pozycja := i;
Synchronize(SetProprties);
end;
end;
procedure TGoThread.SetProprties;
begin
TProgressBar(Form1.FindComponent('ProgressBar' + IntToStr(FCounter))).Position := pozycja;
end;
end.