auf eine externe unit zugreifen
-
guten morgen,
kann mir jemand helfen?
in meiner MDI Anwendung habe ich in einer externen unit eine funktion z.b:void funktion () { Form1->Edit1->Text="Hallo"; }
jetzt möchte ich aber aus Form2, Form3, Form... (bzw. das fenster das zur zeit aktive ist) auf diese funktion zugreifen und an das aktive Fenster übergeben
AktivesFenster->Edit1->Text="Hallo";
wie mache ich das?
-
übergeb der funktion doch einfach einen zeiger auf die form, die die funktion aufruft
so z.B.:
void funktion(TForm &Form) { Form.Caption = "Hallo"; } . . . funktion(*Form1);
-
sorry!!
das habe leider nicht verstanden
-
hmm, ok, ich versuchs mal anders
nehmen wir mal an, du hast 3 formen (Form1, Form2 und Form3) und eine externe funktion, die den titel einer form ändern solldie funktion sieht folgendermaßen aus:
void funktion(TForm &Form) { Form.Caption = "Hallo"; }
und der funktionsaufruf so:
funktion(*this);
wenn du diesen funktionsaufruf in Form2 machst, so ändert die funktion den titel von form2. machst du das selbe in form3, so ändert sich der titel von form3...
war das verständlicher?
ich weiß allerdings nicht genau ob es das ist, was du suchst
-
erstmal danke!!
das habe ich schon gedacht das du das so meinst. aber die sache ist etwas aufwendiger. ich habe eine bzw mehrere funktionen die einen langen code haben.
da ich diese funktionen in mehreren fenstern ausführen will möchte ich sie in einer externen unit ablegen.
hier ein kleiner auszug:Zubehoer5LxA1->Caption=Data->QueryS5->FieldByName("Zubehoer1lxA")->AsString; Zubehoer5LyA1->Caption=Data->QueryS5->FieldByName("Zubehoer1lyA")->AsString; Zubehoer5LxB1->Caption=Data->QueryS5->FieldByName("Zubehoer1lxB")->AsString; Zubehoer5LyB1->Caption=Data->QueryS5->FieldByName("Zubehoer1lyB")->AsString; Zubehoer5VE->Caption=Data->QueryS5->FieldByName("Zubehoer1 VE")->AsString; Zubehoer5FUER->Caption=Data->QueryS5->FieldByName("Zubehoer1 fuer")->AsString;
-
lisa001 schrieb:
hier ein kleiner auszug:
Zubehoer5LxA1->Caption=Data->QueryS5->FieldByName("Zubehoer1lxA")->AsString; Zubehoer5LyA1->Caption=Data->QueryS5->FieldByName("Zubehoer1lyA")->AsString; Zubehoer5LxB1->Caption=Data->QueryS5->FieldByName("Zubehoer1lxB")->AsString; Zubehoer5LyB1->Caption=Data->QueryS5->FieldByName("Zubehoer1lyB")->AsString; Zubehoer5VE->Caption=Data->QueryS5->FieldByName("Zubehoer1 VE")->AsString; Zubehoer5FUER->Caption=Data->QueryS5->FieldByName("Zubehoer1 fuer")->AsString;
Das sieht ja grauenhaft aus!
Hast Du Dir schon mal überlegt, den Zugriff auf die Datenbank vielleicht komplett
auszulagern, in eine Klasse o.ä.?
Ansonsten wäre es u.U. besser ein Formular zu entwerfen, das die ganzen Komponenten
(sind das Label?) enthält und von diesem zu erben.
Oder man könnte auch ein Formular in ein anderes einfügen oder eine Komponente ent-
werfen, die genau die benötigten Komponenten enthält...
Ich bin mir nicht ganz sicher, ob eine globale Funktion hier der beste und sauberste
Ansatz ist.Gruß,
Alexander
-
@Alexander Kempf
was lisa001 vor hat ist doch eine auslagerung der datenbankzugriffe@lisa001
dein problem hat doch nix mit dem umfang der funktion zu tun
heißen die labels (oder was auch immer das für objekte sind) auf den formen alle gleich?
wenn ja, dann kannst du es doch problemlos über die methode machen, die ich gepostet habez.B.:
void funktion(TForm &Form) { Form.Zubehoer5LxA1->Caption = Data->QueryS5->FieldByName("Zubehoer1lxA")->AsString; Form.Zubehoer5LyA1->Caption = Data->QueryS5->FieldByName("Zubehoer1lyA")->AsString; Form.Zubehoer5LxB1->Caption = Data->QueryS5->FieldByName("Zubehoer1lxB")->AsString; Form.Zubehoer5LyB1->Caption = Data->QueryS5->FieldByName("Zubehoer1lyB")->AsString; Form.Zubehoer5VE->Caption = Data->QueryS5->FieldByName("Zubehoer1 VE")->AsString; Form.Zubehoer5FUER->Caption = Data->QueryS5->FieldByName("Zubehoer1 fuer")->AsString; }
-
Jester2000 schrieb:
@Alexander Kempf
was lisa001 vor hat ist doch eine auslagerung der datenbankzugriffeJa, aber Du hast meinen Vorschlag, glaube ich, nicht richtig gelesen.
Ich bezweifle, daß eine (flache) globale Methode die geeignete (oder
wenigstens die beste) Vorgehensweise ist.Jester2000 schrieb:
@lisa001
heißen die labels (oder was auch immer das für objekte sind) auf den formen alle gleich?
wenn ja, dann kannst du es doch problemlos über die methode machen, die ich gepostet habeAber nur, wenn sie auch den Vorschlag von mir beherzigt und ein Formular entwirft, von
dem alle anderen erben - oder sie muß die Components-Liste durchlaufen und auf Namen
prüfen, was das Problem eher noch verschärfen würde. Oder?Gruß,
Alexander
-
@ lisa001
und erklaer mal genauer, was du mit "externer Unit" meinst ?
Ich denk mal Unit kommt von Pascal und ist ne statische Lib ???
Oder meinst damit wirklich nur ne Klasse, die Dir das erledigt, aber im sourcecode von deinem Hauptproject mit Implementiert wird ???Ciao ...
-
Also,
Ich würde dir das empfehlen. Nimm 3 Dateien
1. Deine Unit, deine Projektdatei
2. Deine Klassendeklaration
3. Deine Mthodendeklaration
Von den Units, (Forms) kannst du soviele haben wie du willst. Du inkludierst einfach die Klasse, und verwendest die Methoden der Klasse. Das wars! So mach ich das auch. Ich finde das ist der beste Weg. Du kannst dir noch ein 4. Verzeichnis anlegen
4. Deine Funktionen
dann kannst du auf die Klassen verzichten und machst gleich die Methoden. Auch da, dei einfach inkludieren #include <MeineFunktion.cpp> und diese dann einfach aufrufen MeineFunktion1(int Variable, char Variable2...);Okay?
Wahrscheinlich meinst du das auch.