@pol2013: dlaczego najprościej nie zrobisz tego na CreateThread
skoro się motasz z klasami. WinAPI rulez ;P Zawsze będę to powtarzał :) Na MSDNie masz opis co i jak. Natomiast jeżeli chcesz się bawić w okienko a'la dialogowe w stylu Delphiowatym. To nie wiem jak pod Lazarusem, ale powinno ze względu na wsteczną kompatybilnośc działać coś takiego jak poniżej. Oczywiście kod sobie możesz dostosować. Może oczywiście jeżeli ma się większe doświadczenia niż ja kombinować z sekcjami krytycznymi, ale skoro na StackOverFlow polecają metodę komunikatów dla wątku głownego to czemu by nie. Proste i skuteczne.
Zresztą jeżeli nie MessageDlg
oparty o VCL, to zawsze możesz zapodać MessageBoxA/W
i odpowiednio dobrać się do jego elementów, jak również w razie potrzeb cudować z funkcją obsługi komunikatów, ale już w kodzie WinAPI. Na Google znajdziesz na pewno przykład, bo sam patrzyłem jak na przykład podmdinić teksty na przyciskach MessageBoxa systemowego, który powinien być odporny na cudowanie w wątku. Jedno masz pokazane poniżej, to poszukaj sobie drugiego rozwiązania. I proszę w przyszłości pamiętaj. Najpierw googlujemy. Kombinujemy SAMI do BÓLU, a dopiero w ostateczności piszemy na forum.
Bo widzę, że Ty się chyba od razu poddałeś i jeb łubudu na forum do ludu ;) A przecież na pewno to co chcesz zrobić już nie jedna osoba kombinowała wcześniej i się z wiedzą podzieliła za pewne. Trzeba tylko po prostu chcieć pozyskiwać wiedzę metodami konwencjonalnymi czyli google i z zainstalowanym TBrain
nawet pod Lazarusem idzie pracować ;) Tylko podkreślam, ja na szybko klepałem to w Delphi 7. I pewnie można jeszcze inaczej poza VCL, ale to może ktoś coś jeszcze tutaj doradzi. Ja zrobiłem tak, jak widzisz i działa ok.
//...
const
Max_Secs = 5;
WM_SHOWDLG = WM_USER + 666;
WM_UPDATEDLG = WM_USER + 997;
Dialog_Text = 'Czekamy - mineło: %d / %d sekund';
type
TForm1 = class(TForm)
Button1 : TButton;
procedure Button1Click(Sender : TObject);
private
procedure OnShowDlg(var Msg : TMessage); message WM_SHOWDLG;
procedure OnUpdateDlg(var Msg : TMessage); message WM_UPDATEDLG;
public
end;
var
Form1 : TForm1;
implementation
{$R *.dfm}
var
Dlg : TForm;
function ShowPolishMsgDlg(Msg : string; DlgType : TMSgDlgType; Buttons : TMsgDlgButtons) : TModalResult;
begin
Dlg := CreateMessageDialog(Msg, DlgType, Buttons);
Dlg.BorderIcons := [];
Dlg.Caption := Application.Title;
TButton(Dlg.FindComponent('Ok')).Caption := 'OK';
TButton(Dlg.FindComponent('No')).Caption := '&Nie';
TButton(Dlg.FindComponent('Yes')).Caption := '&Tak';
TButton(Dlg.FindComponent('Help')).Caption := 'Pomoc';
TButton(Dlg.FindComponent('Retry')).Caption := 'Ponów';
TButton(Dlg.FindComponent('All')).Caption := 'Wszystko';
TButton(Dlg.FindComponent('Cancel')).Caption := 'Anuluj';
TButton(Dlg.FindComponent('Ignore')).Caption := 'Ignoruj';
TButton(Dlg.FindComponent('NoToAll')).Caption := 'Nie na wszystko';
TButton(Dlg.FindComponent('YesToAll')).Caption := 'Tak na wszystko';
Dlg.ShowModal;
Result := Dlg.ModalResult;
end;
procedure TForm1.OnUpdateDlg(var Msg : TMessage);
begin
if Msg.WParam = 0 then
begin
TButton(Dlg.FindComponent('Ok')).Enabled := False;
end;
TLabel(Dlg.FindComponent('Message')).Caption := Format(Dialog_Text, [Msg.WParam, Msg.LParam])
end;
procedure TForm1.OnShowDlg(var Msg : TMessage);
begin
ShowPolishMsgDlg(Format(Dialog_Text, [Msg.WParam, Msg.LParam]), mtInformation, [mbOk]);
end;
function ThreadFunc(Param : Pointer) : DWORD; stdcall;
var
I, Maximum : integer;
begin
Result := 0;
Maximum := Integer(Param);
PostMessage(Form1.Handle, WM_SHOWDLG, 0, Maximum);
PostMessage(Form1.Handle, WM_UPDATEDLG, 0, Maximum);
for I := 1 to Maximum do
begin
Sleep(1000);
PostMessage(Form1.Handle, WM_UPDATEDLG, I, Maximum);
end;
TButton(Dlg.FindComponent('Ok')).Enabled := True;
end;
procedure TForm1.Button1Click(Sender : TObject);
var
ThreadId : Cardinal;
begin
CreateThread(nil, 0, @ThreadFunc, Pointer(Max_Secs), 0, ThreadId);
end;