Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - erst nach Anzeige der Form Funktionsaufruf


Trashkid2000 - Fr 26.06.09 06:29
Titel: erst nach Anzeige der Form Funktionsaufruf
Hallo an alle zusammen,

Ich programmiere eine Software, mit der man Textdateien massenhaft bestimmter Kriterien ändern kann. Dabei gibt es auch ein Vorschaufenster, womit man erst einmal die zu erledigen Änderungen an der Datei sieht.

So, nun meine Frage:
Die Funktion, die die jeweilige Datei einliest, rufe ich von der FormShow- Methode der Vorschauform auf. Da jedoch manche Dateien sehr groß sein können, dauert es dann sehr lange, bis die Form angezeigt wird. Es soll also so sein, dass erst die Vorschauform angezeigt wird, und dann die Funktion abgearbeitet wird.

Aber irgendwie kriege ich das nicht gebacken.

Bin dankbar für jede Anregung,
Marko


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TVorschauform.FormShow(Sender: TObject);
begin
      if SaveSize then    //Minimale Größe wird nur beim ersten Aufruf
      begin               //der Vorschau gemerkt! Sonst gibt es Probleme
          MinWidth:= Vorschauform.Width;
          MinHeight:= Vorschauform.Height;
          SaveSize := false;
      end;
      Formsteuerung.Initialize_Vorschauform;  //ist nur für Größenänderung der Form zuständig
      if (Functions.Wahl < 0then
         Functions.Wahl := 0;
      Functions.GeneriereVorschau(Mainform.lb_Dateien.Items[Functions.Wahl]); //Funktion, die die Vorschau generiert
end;


Moderiert von user profile iconNarses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.


alzaimar - Fr 26.06.09 06:45

Lagere die Verarbeitung in einen Thread aus.


Narses - Fr 26.06.09 10:40

Moin und :welcome: im Forum!

VCL-Ansatz: Schick dir im FormShow eine selbstdefinierte Message, in deren Handler du dann erst die Aktionen ausführst. :idea:

Aber: der Thread-Ansatz von user profile iconalzaimar ist besser. ;)

cu
Narses


Trashkid2000 - Fr 26.06.09 11:40

Danke für euren schnellen Antworten!

Habe unter Delphi noch nicht mit Threads programmiert.
Aber habe, als wir das Thema in der Schule mit Java hatten, auch schon mal daran gedacht, um mein Programm zu optimieren.

Werde mich am WE mal mit Threadprogrammierung befassen,

danke für den Tip!

Marko


BenBE - Fr 26.06.09 12:08

Nutze ggf. OnActivate mit einer Statusspeicherung, die nur beim ersten Aufruf bearbeitet wird.


jaenicke - Fr 26.06.09 12:16

user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
Nutze ggf. OnActivate mit einer Statusspeicherung, die nur beim ersten Aufruf bearbeitet wird.
Naja, das wäre gar nicht nötig, einfach in OnShow den Eventhandler zuweisen und in OnActivate selbst OnActivate auf nil setzen.

Aber das halte ich für keine so schöne Lösung, da sind die anderen schon passender. Insbesondere Threads, denn dann kann man mit dem schon bearbeiteten Teil und dem Formular derweil normal arbeiten.


Webo - Fr 26.06.09 17:45

Als Tutorial für Thread-Programmierung kann ich übrigens folgendes von user profile iconLuckie besonders empfehlen, ich arbeite es grade selbst durch und ich find es klasse !

Link : http://www.delphi-library.de/viewtopic.php?t=16627&highlight=threads%20tutorial


Grüße

Webo


Trashkid2000 - Mo 29.06.09 18:51

Okay, habe es jetzt hinbekommen.

Habe die Funktion nun in einen Thread ausgelagert. Sehr schön.
Jetzt muss ich nur noch recherchieren, wie ich einen Thread für eine Abbruchfunktion killen kann.

Also besten Dank,

Marko


jaenicke - Mo 29.06.09 19:01

Indem du dem Thread mittels Terminate sagst, dass er abbrechen soll. Der Thread selbst muss mit Terminated prüfen, ob das der Fall ist und den Vorgang ggf. abbrechen.