Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Einer Unit die aufrufende Unit bekanntgeben


galagher - Fr 27.02.04 20:37
Titel: Einer Unit die aufrufende Unit bekanntgeben
Hallo!

Ich habe eine Prozedur (stammt nicht von mir), die andere Programme startet und auf deren Beendigung wartet. Leider zeichnet sich das Fenster des aufrufenden, also meines, Programms nicht neu: das andere Fenster "schmiert". Wie kann ich der Prozedur bekanntgeben, dass sie mein Fenster neu zeichnen soll, während sie auf das Programmende wartet, ohne dass ich in die Unit, die die Prozedur enthält,

Delphi-Quelltext
1:
uses Unit1;                    

aufnehme?


Delete - Fr 27.02.04 20:39

Pack das Starten in einen Thread, dann kann sich dein Fenster auch aktualisieren.


galagher - Fr 27.02.04 21:11

Luckie hat folgendes geschrieben:
Pack das Starten in einen Thread, dann kann sich dein Fenster auch aktualisieren.


Dann funktioniert's zwar, aber mein Programm wartet nicht mehr, bis das andere beendet wurde.
Habe folgenden Code:


Delphi-Quelltext
1:
2:
3:
4:
5:
procedure _Exec.Execute;
begin
  { Thread-Code hier einfügen }
  dwExecAndWait('calc.exe','', SW_SHOWNORMAL);
end;


dwExecAndWait startet zwar das Programm calc, aber wartet nicht.


galagher - Sa 28.02.04 12:26
Titel: Einer Unit die aufrufende Unit bekanntgeben [gelöst]
Man kann einer Prozedur oder Funktion einer anderen Unit Form1 (oder was man halt will) "bekanntgeben", ohne Unit1 in die uses-Klausel der anderen Unit aufzunehmen, indem man einfach die entsprechende Prozedur der fremden Unit abändert:

Original:

Delphi-Quelltext
1:
procedure MachtIrgendwas(const {...});                    


Änderung:

Delphi-Quelltext
1:
procedure MachtIrgendwas(Form: TForm; const {...});                    


Aufgerufen wird das dann also so:

Delphi-Quelltext
1:
MachtIrgendwas(Form1, {...});                    


Die Prozedur MachtIrgendwas der fremden Unit kann nun mit Form1 etwas anfangen, zB. neu zeichnen oder was auch immer.

Danke jedenfalls!


Brueggendiek - So 29.02.04 02:58
Titel: Re: Einer Unit die aufrufende Unit bekanntgeben [gelöst]
Hallo!

galagher hat folgendes geschrieben:

Delphi-Quelltext
1:
procedure MachtIrgendwas(Form: TForm; const {...});                    


Das Ganze funktioniert aber wirklich nur mit den Methoden von TForm! Eigene Methoden des Formulars kann man so nicht aufrufen.

Warum soll die Formular-Unit nicht in die USES-Anweisung aufgenommen werden? Falls sich eine zirkuläre Referenz ergibt, muß man eben die USES-Anweisung im Implementation-Abschnitt nehmen - dafür gibt es sie ja!

Bei meinen Programmen werden alle Units im Implementations-Abschnitt eingebunden - es sei denn, ich benötige sie im Deklarationsteil. Wenn man das konsequent durchhält (immer unten rein und nur bei Bedarf nach oben schieben), vermeidet man viel Ärger!

Im Übrigen erinnere ich nochmal an die 3 Grundlagen der Programmierung:
1. Planung
2. Planung
3. noch mehr Planung!

Konkret: Bei guter Planung treten zirkuläre Referenzen gar nicht erst auf!

Gruß

Dietmar Brüggendiek


galagher - So 29.02.04 19:47
Titel: Re: Einer Unit die aufrufende Unit bekanntgeben [gelöst]
Hallo!

Zitat:
Das Ganze funktioniert aber wirklich nur mit den Methoden von TForm!


Ich wollte einfach eine Möglichkeit finden, wie ich das Problem des Neuzeichnens während des Wartens beheben kann, und zwar sollte die aufgerufene Prozedur selbst dafür sorgen, ohne abhängig von irgendeiner Form1 oder Form2 oder was auch immer zu sein. Also habe ich einfach die modifizierte Prozedur in meiner eigenen format.pas abgespeichert!

Klar, mit uses geht's auch! Zumindest für meinen aktuellen Zweck genügt es aber, Form: TForm anzugeben.
Übrigens: Mit einem Thread und Synchronize hat's nicht geklappt. Wenn das Programm nach dem Thread eine Datei kopieren oder das Environment anzeigen sollte - egal, was -, kam's zum grossen Hängen!
Danke jedenfalls für die Hilfe!