Autor |
Beitrag |
feivel3333
      
Beiträge: 190
W7
Delphi XE prof
|
Verfasst: Mi 07.12.05 14:53
Hallo,
folgendes Problem quält mich in Delphi 5:
Ich entwickle gerade eine Anwendung, die aus ca. 400 Fenstern besteht. In vielen dieser Fenster gibt es eine Methode namens FormInit, die die Initialisierung des Formulars beim Öffnen durchführt.
Problem: Diese Methode wird im FormShow-Event ausgeführt, das leider schon dann ausgeführt wird, wenn man das Formular noch gar nicht sieht. Es existiert dann zwar im Speicher, aber noch nicht auf dem Bildschirm.
Bisher habe ich immer Timer benutzt, die zeitverzögert die Initialisierung/Öffnung von Dateien und so weiter ausführen. Doch irgendwann habe ich mich von diesen Timern verabschieden müssen (Applikation zu groß geworden).
Nun möchte ich vom MainForm der Applikation über einen zentralen Timer diese Initialisierungen der Formulare durchführen. Dafür soll über eine Methode namens
FindMethod( TObject, Methodenname ) : TPointer ein Aufruf stattfinden.
Nun kann mir das gesamte Internet keine Anwendung dieser FindMethod() erklären. FindMethod liefert einen Pointer, den ich nicht zu bedienen weiß.
Kann mir jemand die Syntax erklären, wie man über FindMethod() eine Methode in einem Objekt findet und aufruft?
Ich wäre euch sehr dankbar.
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mi 07.12.05 20:41
k, Du nutzt die falsche Methode:
von dem Objekt, in dem Du die Form-Init-Methode ausführen willst, nutzt Du
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| type TFormInitMethodType = procedure (Do: Integer; Something: String; ) of object;
var FormInitMethodPtr: TFormInitMethodType;
FormInitMethodPtr := TheForm.MethodAddress('FormInit'); FormInitMethodPtr(Deine, Params); |
ACHTUNG: MethodName gibt false zurück, wenn die Methode nicht gefunden werden kann oder es keine TypInfo für die gewünschte Methode gibt!
HTH.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
feivel3333 
      
Beiträge: 190
W7
Delphi XE prof
|
Verfasst: Do 08.12.05 08:54
Hallo,
erst mal vielen Dank für deine Antwort.
Doch folgendes Problem, das ich vielleicht nicht so ganz dargestellt habe, besteht bei diesem Aufruf immer noch:
Das Formular, das du als ersten Teil des Parameters mit TheForm betitelt hast, muss bei mir eine Variable sein.
Und wenn ich die Variable tatsächlich TheForm nennen würde, wird der Compiler was dagegen haben, wenn ich das so schreibe. Ich werde es nachher im Büro ausprobieren und berichten.
lg, André
|
|
petergensfeld
      
Beiträge: 46
Windows Vista 32-Bit
Delphi XE Professional
|
Verfasst: Fr 09.12.05 11:36
Hallo André,
vielleicht kannst Du nochmal etwas genauer beschreiben, warum Du Deine Routine nicht direkt in FormShow ausführen kannst, denn das ist ja eigentlich genau für die Initialisierung des Dialogs vor der Anzeige gedacht. Warum muss das Fenster schon sichtbar sein? Du hast doch vollen Zugriff auf alle Controls, sobald sie erzeugt wurden. Eine Lösung per Timer halte ich jedenfalls für nicht sehr elegant.
Gruß Dirk
|
|
feivel3333 
      
Beiträge: 190
W7
Delphi XE prof
|
Verfasst: Fr 09.12.05 18:29
Warum nicht in FormShow:
Wenn ich beim Öffnen der Formulare, also vor dem eigentlichen Anzeigen alle Datenbanken öffne, filtere und so weiter, dann ergibt sich für den Benutzer der Effekt, dass er lange warten muss, obwohl scheinbar nichts passiert.
Teilweise dauert es eine ganze Weile, bis ich beispielsweise Kontakt zu Pervasive-Dateien im Netzwerk aufgebaut habe. Zudem gibt es Fenster, die bei Öffnen laufzeitintensive Routinen aktivieren.
Ich möchte erreichen, dass der Benutzer das Form sieht und denkt: "Aha, da ist schon mal ein Fenster, aber alle Komponenten sind noch inaktiv, also passiert noch was".
Ich könnte zwar Meldungen einschalten, doch das halte ich nicht für so schön.
Schön wäre ein Event, das ausgelöst wird, sobald das Fenster angezeigt ist. Doch in der 5er Delphi gibt es so was nicht.
Deshalb habe ich die Timer genommen, die angeworfen werden, sobald das Fenster steht. Dann haben die noch eine kleine Zeitverzögerung, und dann führen diese sämtliche Aktivitäten durch. Doch zu viele Timer mag Delphi nicht.
So entstand mein Problem...
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Fr 09.12.05 18:50
Also, wenn ich ein Formular auf den Bildschirm bekomme, dass für ne gewisse Zeit nix anzeigt und nicht reagiert, frag ich mich eher, welcher Idiot, sowas verbockt hat ...
Was spricht dagegen, im Form-Show ein Status-Fenster zu generieren "Bitte warten, Datenbankverbindungen werden aufgebaut..." un dann im Form-Show die Aktionen durchzuführen ...
Weiterhin bin ich der Ansicht, dass das Initialisieren von Datenbanken generell ins FormCreate gehört, aber das ist hier nicht der Punkt.
Du kannst Dir, wenn Du's schon unbedingt nach der "Welcher Idiot hat das geschrieben?"-MeMethode machen willst, dafür eine Message-Handler für eine Windows-Nachricht (z.B. WM_USER) definieren und dann an deine Form ein PostMessage mit dieser Nachricht absetzen.
Steht zu allen hier erwähnten Dingen aber bereits genug im Forum, weshalb ich das hier nicht nochmal aufführe...
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
petergensfeld
      
Beiträge: 46
Windows Vista 32-Bit
Delphi XE Professional
|
Verfasst: Sa 10.12.05 14:51
Sehe das auch so wie Benny, ein Statusfenster halte ich für die eindeutig bessere Lösung. Bei einem Fenster, dass sich zwar öffnet, aber nix passiert, denke ich eher an einen Programmabsturz. Die eleganteste Lösung ist wohl, die zeitaufwändigen Routinen in einen eigenen Thread zu packen. Dann könnte das Statusfenster über die einzelnen Schritte der Initialisierung genau Auskunft geben oder Du könntest einen Fortschrittsbalken implementieren.
Gruß Dirk
|
|
|