PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Delphi] Funktionen einer anderen Form aufrufen?


Silpion
2003-10-07, 01:32:48
Hallo,

ich habe ein kleines Problem:

Ich bin dabei einen Terminplaner zu programmieren. Wenn ein neuer Termin angelegt werden soll, soll ein zweites Fenster erscheinen, in das man die Informationen einträgt. Anschließend soll das erste Fenster mit den Informationen weiter arbeiten. Und genau bei diesem letzten Schritt hänge ich.

Ich habe beide Fenster als Form erstellt, das zweite Fenster habe ich in das erste einfach unter 'uses' eingebunden, dadurch kann ich das Zweite vom Ersten aus steuern. Allerdings komme ich nicht mehr zum ersten Fenster zurück, wenn ich mal das Zweite aktiviert und das erste für den Benutzer deaktiviert habe. :(

Was mir fehlt ist eine Möglichkeit, vom zweiten Fenster aus eine Funktion oder Prozedur des Ersten aufzurufen und dabei die eingegebenen Informationen zu übergeben.

Ich habe schon ein bischen mit Handles und PostMessage ausprobiert, allerdings habe ich noch nicht rausgefunden, wie ich hierbei Parameter an die aufgerufene Funktion übergeben kann. :(

Kann mir hier einer von euch einen Tipp geben? Die Erklärung muss nicht allzu ausführlich sein, ein kleiner Hinweis in die richtige Richtung würde mir vermutlich schon helfen.

Crushinator
2003-10-07, 15:12:26
Versuch doch mal folgedes:

Form1 besteht aus

----------------
unit Form1;

interface

uses Form2, ...

(...)
----------------

Und Form2 aus:

----------------
unit Form2;

interface

uses (...)

type (...)

var (...)

implementation

uses Form1
----------------

In Form1 müssen die func/proc als public deffiniert sein, damit Du sie von Form2 aufrufen kannst. Damit lassen sich allerdings nur func/proc ansprechen und nichts was nur im Interface-Bereich von Form1 vorkommt.

Silpion
2003-10-07, 16:55:02
Hey, das Kompiliert tatsächlich, danke!

Ich habe es inzwischen allerdings doch über PostMessage gelöst. Ich stelle in der zweiten Form eine Variable bereit, die sich die Erste dann schnappt.

So richtig zufrieden bin ich mit meiner Lösung allerdings nicht. :-/

Naja, mal schaun, das betrifft eh nur einen kleinen Teil des Programms. Aber für heute mach ich Schluss. :D

Crushinator
2003-10-07, 17:18:22
Original geschrieben von Silpion
So richtig zufrieden bin ich mit meiner Lösung allerdings nicht. :-/ (...) Verständlich, denn wenn man es optimal machen möchte, deklariert man in Form1 einfach nur eine Variable (z.B. UebergabeVar: String;) und übergibt sie der Form2 in Pointer-Form. Form2 muß dabei in public eine Var wie z.B. MyVar: ^String; haben, die man von außen mit Form2.MyVar := @UebergabeVar; referenzieren kann. In Form2 füllt man es dann z.B. mit MyVar^ := 'Hurra, es funktioniert!';. So bleibt Form2 auch von anderen Forms/Objekten als nur Form1 nutzbar.

Das ganze geht natürlich auch mit ganzen Objekten, wobei dann Form2 entweder die Deklaration der Objekte (Klasse) als Ganzes oder falls vorhanden nur ein entsprechendes Interface usen muß. =)

Silpion
2003-10-07, 17:42:57
So ähnlich war mein erster Ansatz, damit bin ich allerdings gescheitert. Ich wollte einen Pointer übergeben und, wenn ein neues Ereignis erstellt wird, dort das Objekt dranhängen. Danach sollte Form1 je nachdem, ob der Pointer nil ist oder auf ein Objekt zeigt weiter arbeiten. Allerdings hat mir in Form2 das Objekt erstellen probleme gemacht, denn nach "new(pointer)" zeigt der Pointer an eine andere Stelle als der ursprüngliche aus Form1. :(

Naja, ich lass es jetzt erstmal so mit Postmessage und schreib das Programm fertig. Die Stelle ist nicht kritisch und lässt sich auch später noch problemlos umschreiben ohne dass ich was anderes kaputt mache. :)

Auf jeden Fall danke für deine Hilfe. =)

Darkstar
2003-10-07, 21:00:00
Original geschrieben von Silpion
Ich bin dabei einen Terminplaner zu programmieren. Wenn ein neuer Termin angelegt werden soll, soll ein zweites Fenster erscheinen, in das man die Informationen einträgt. Anschließend soll das erste Fenster mit den Informationen weiter arbeiten. Und genau bei diesem letzten Schritt hänge ich.Ich würde an Deiner Stelle von Form1 aus Form2 mit ShowModal anzeigen und anschließend in den Prozeduren und Funktionen von Form1 die Werte der Eingabefelder von Form2 auslesen. Die in Form2 eingetragenen Werte bleiben nach dem Schließen erhalten.

procedure Form1.Button1Click;
begin
if Form2.ShowModal = mrOk then
begin
... := Form2.Edit1.Text;
... := Form2.Edit2.Text;
// usw.
end;
end;

Silpion
2003-10-07, 21:22:17
Hey, das ist auch eine schöne Methode. Da muss ich die Abhängigkeiten auch nicht manuell steuern. :)

Aber erstmal seh ich zu, dass alles andere läuft, da fehlt noch eine ganze Menge.