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,
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 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!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!