![]() |
Re: Neuzeichnen von TStatusbar
Wie wäre es mit einem separaten Thread? Nach jedem Schritt schickt der dem Hauptthread eine Nachricht mit einer Statusmeldung.
|
Re: Neuzeichnen von TStatusbar
Habe noch nie Threads programmiert. :wall:
|
Re: Neuzeichnen von TStatusbar
Ein Tutorial gibt es hier:
![]() |
Re: Neuzeichnen von TStatusbar
Danke Luckie. Ich schaue mir das mal an. Und wenn ich nicht weiterkomme, dann kann ich dich ja auch fragen.
Was empfiehlst Du in parallelen Threads laufen zu lassen. Die DB-Zugriffe? BTW: Die einzelnen Queries stehen in einem DataWindow (VCL-Programmierung), und werden beim Programmstart schon erzeugt. Das geht bei Threads wohl eher nicht, oder? |
Re: Neuzeichnen von TStatusbar
Keine Ahnung, ich habe von DB Programmierung keinen Plan. Aber ich würde nur die Queries in den Thread auslagern, glaube ich.
|
Re: Neuzeichnen von TStatusbar
So, ich habe jetzt mal einen Test gemacht. Verwende das VCL Thread-Objekt. Dann einen (!) Query-Aufruf in die Execute Methode gepackt und voila nach Abarbeitung dieses einen Threads werden alle nachfolgenden Einträge in die TStatusBar angezeigt, obwohl dies nicht mehr in einem separaten Thread abläuft. Is this a feature? :gruebel: :cyclops:
|
Re: Neuzeichnen von TStatusbar
So würde ich es machen, ohne TThread sondern mit der API:
Delphi-Quellcode:
type
TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } procedure WndProc(var Msg: TMessage); override; end; type TThreadParams = packed record FhWnd: THandle; end; PThreadParams = ^TThreadParams; const MTM_STATUS = WM_USER + 1; // lParam -> Status-String var Form1: TForm1; implementation {$R *.dfm} function ThreadFctn(p: Pointer): Integer; var i: Integer; s: String; hWnd: THandle; begin hWnd := PThreadParams(p)^.FhWnd; for i := 0 to 4 do begin s := 'Durchlauf: '+IntToStr(i); SendMessage(hWnd, MTM_STATUS, 0, Integer(PChar(s))); sleep(500); end; s := 'fertig'; SendMessage(hWnd, MTM_STATUS, 0, Integer(PChar(s))); FreeMem(p, sizeof(TThreadParams)); result := 0; end; procedure TForm1.WndProc(var msg: TMessage); begin inherited; case msg.Msg of MTM_STATUS: begin Caption := PChar(msg.LParam); end; end; end; procedure TForm1.Button1Click(Sender: TObject); var ThreadParams: PThreadParams; ThreadID: Cardinal; begin GetMem(ThreadParams, sizeof(TThreadParams)); ThreadParams.FhWnd := Handle; CloseHandle(BeginThread(nil, 0, @ThreadFctn, ThreadParams, 0, ThreadID)); end; |
Re: Neuzeichnen von TStatusbar
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:35 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz