![]() |
Re: Systemfehler. Code: 1400 Ungültiges Fensterhandle
Oh man ich glaub ich schmeiß das mit den Threads wieder über den haufen.
Gibt es eine andere Möglichkeit mit der ich Funktionen aufrufen kann und das Programm in der zwischenzeit nicht einfriert? Ich hatte irgendwo mal was von ProcessMessages oder so gelesen. Wäre das noch eine alternative mit der ich diese ganzen Probleme nicht habe? |
Re: Systemfehler. Code: 1400 Ungültiges Fensterhandle
Das heißt Application.ProcessMessages (Unit Forms) und bewirkt, dass bei einem Aufruf die Botschaftswarteschlange abgearbeitet wird. Allerdings verlangsamt dies Dein Programm. Wenn Du also eine große Anzahl an Daten hast, solltest Du Application.ProcessMessages nur alle z.B. 100 Sätze aufrufen.
|
Re: Systemfehler. Code: 1400 Ungültiges Fensterhandle
naja soviele nachrichten ahb ich nicht.
![]() so schaut halt mein programm imoment aus, das untere ist ein memo feld wo halt die nachrichten was gemacht wird und eventuelle fehler hinzugefügt werden, aber das wars auch an anchrichten. aber ich würde halt auch gerne die statusbar und die anzahl x von y nutzen. wäre das mit Application.ProcessMessages machbar ohne dass das programm elendig alngsam wird? (was es egtl eh schon durch den datenbank zugriff ist) |
Re: Systemfehler. Code: 1400 Ungültiges Fensterhandle
Wie gesagt, abhängig von der Datenmenge sollte man Application.ProcessMessages behutsam einsetzen. Wenn es aber nur eine Handvoll Daten sind, kannst Du es auch hinter jede Änderung von sichtbaren Komponenten (z.B. Position der Progressbar) setzen. Probier halt mal ein bisschen rum, bis Du den für Dich richtigen Wert ermittelt hast.
|
Re: Systemfehler. Code: 1400 Ungültiges Fensterhandle
ok also muss ich im programm aus z.b.
Delphi-Quellcode:
Memo1.Lines.Add('Beginne Download');
Delphi-Quellcode:
machen?
Memo1.Lines.Add('Beginne Download');
Application.ProcessMessages; |
Re: Systemfehler. Code: 1400 Ungültiges Fensterhandle
So in etwa. Ich würde allerdings alle veränderlichen Komponenten mit den jeweils neuen Werten bestücken (also das Memo, die Progressbar etc.) und anschließend einmalig Application.ProcessMessages aufrufen.
|
Re: Systemfehler. Code: 1400 Ungültiges Fensterhandle
Hallo!
Oder wenn Du weiterhin einen Thread verwenden willst, könnte es etwa so aussehen (Nicht getestet, einfach runtergetippt). Nicht schön, aber ...
Delphi-Quellcode:
Grüße
unit ThreadDummy;
interface uses SysUtils, Classes; type TThreadDummy = class(TThread) private { Private-Deklarationen } FFileCount: Integer; FFileIndex: Integer; FFileName: string; FLine: string; procedure GetFileCount; procedure GetFileName; procedure Listbox2Add; procedure Listbox3Add; procedure Split(const aParam1: string; const aParam2: string; const aParam3: TStrings); protected procedure Execute; override; end; implementation { Wichtig: Methoden und Eigenschaften von Objekten in visuellen Komponenten dürfen nur in einer Methode namens Synchronize aufgerufen werden, z.B. Synchronize(UpdateCaption); und UpdateCaption könnte folgendermaßen aussehen: procedure TThreadDummy.UpdateCaption; begin Form1.Caption := 'Aktualisiert in einem Thread'; end; } uses FormStart; { TThreadDummy } procedure TThreadDummy.Execute; var files, lines: Integer; data, datanormsatz: TStringList; begin { Thread-Code hier einfügen } data := nil; datanormsatz := nil; try data := TStringList.Create; datanormsatz := TStringList.Create; Synchronize(GetFileCount); for files := 0 to FFileCount do begin Synchronize(Form1.ListBox1.Clear); Synchronize(Form1.ListBox2.Clear); FFileIndex := files; Synchronize(GetFileName); data.LoadFromFile('Path' + FFileName); for lines := 0 to data.Count - 1 do begin datanormsatz.Clear; FLine := data[lines]; Split(';', FLine, datanormsatz); if datanormsatz[0] = 'A' then Synchronize(Listbox3Add); if datanormsatz[0] = 'T' then Synchronize(Listbox2Add); end; end; finally FreeAndNil(data); FreeAndNil(datanormsatz); end; end; procedure TThreadDummy.GetFileCount; begin FFileCount := Form1.ListBox4.Count; end; procedure TThreadDummy.GetFileName; begin FFileName := Form1.ListBox1.Items[FFileIndex]; end; procedure TThreadDummy.Listbox2Add; begin Form1.ListBox2.Items.Add(FLine); end; procedure TThreadDummy.Listbox3Add; begin Form1.ListBox3.Items.Add(FLine); end; procedure TThreadDummy.Split(const aParam1: string; const aParam2: string; const aParam3: TStrings); begin // Do split end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:12 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