Zugriff auf andere Formulare



  • Hi!

    Ich habe ein Formular, welches Parent für 2 andere Formulare ist. Nennen wir die beiden Child1 und Child2. In Child1 ist ein Textfeld enthalten. Wenn ich in Child2 einen Button drücke, dann soll in dem Textfeld von Child1 irgendein Text erscheinen.

    Nach Diversen versuchen und quälen von Suchmaschinen und der Hilfe komme ich nicht darauf, wie ich auf das Textfeld von Child1 überhaupt zugreifen kann.

    Dann habe ich mir gedacht, dass ich ein Textfeld des Parent-Formulars mit

    this->Parent->Edit1->Text = "wwww";
    

    Ansprechen kann. Haut nicht hin.

    Bitte gebt mir einen Tipp wie man das macht.

    Danke!

    Bronks



  • Hi...
    FAQ unter Forms: Variablenübergabe oder so.

    MfG
    xy



  • Die Unit des jeweiligen Formulars inkludieren und dann mit Child_Name->Edit1->Text auf das Edit zugreifen.



  • Hi!

    Erstmal danke für die Tips.

    @Morl:
    Das hat nur Teilweise funktioniert. Es kommt keine Fehlermeldung mehr auf aber „Form3->Edit1->Text“ wird nicht mit gefüllt. Das Testprogramm besteht aus einem ParentForm und 2 Childs.

    Form1 = Parent
    Form2 = Child mit Button, welcher in Form3 in das Edit1 den Text „asdf“ eintragen soll
    Form3 = Child mit dem Edit1

    Siehst Du was ich da Falsch gemacht habe?
    Code von Form2:

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit2.h"
    #include "Unit3.h"
    
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm2 *Form2;
    //---------------------------------------------------------------------------
    __fastcall TForm2::TForm2(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm2::Button1Click(TObject *Sender)
    {
     ShowMessage("wwww");  //um zu prüfen ob Button1Click überhaupt aufgerufen wird
     Form3->Edit1->Text = "asdf";
    }
    //---------------------------------------------------------------------------
    


  • Das sollte so eigentlich funktionieren, bei mir tuts das zumindest 😕



  • Jetzt macht sich Verzweiflung breit. Ich hab das gezippte Projekt mal hier zum DL gestellt, falls es sich jemand ansehen möchte. Es ist mit BCB5 gemacht. Die Datei hat 57KB.

    http://bronks.gmxhome.de/somi/form.zip

    Funktion: Nach den Programmstart wird ein Form mit zwei Childs angezeigt. Wenn man in Form2 auf den Button1 drückt, dann sollte in Form3 der Inhalt des Edit1 geändert werden. Ändert sich m.E. grundlos nicht.

    Dann wäre es toll, wenn in Form1 das Edit1 im gleichen Zug auch einen anderen Inhalt bekommen würde.

    Bitte, bitte ...



  • Ich hab mir grad dein Projekt angeschaut. Ich hab den Builder 6, also wirst du wohl mit meinen Dateien nichts anfangen können.

    Habs hinbekommen. Folgendes musst du ändern:

    Erstelle die Formulare Form2 und Form3 nicht da wo du sie jetzt erstellst(Form1), sondern schreibe in den OnCreate Event Handler des jeweiligen Formulars (es ist kein "new" nötig):

    Form->Parent = Form1;
    Form->SetBounds();
    Form->Show();
    

    Natürlich darfst du nicht vergessen die Unit1.h zu inkludieren.

    Dann kannst du einfach in deiner OnClick Funktion des Buttons auf Formular3 schreiben

    Form1->Edit1->Text="kjasdhf";
    Form3->Edit1->Text="kjbhjk";
    

    Das sollte funktionieren.



  • @MORL
    Vielen Dank! Jetzt funktioniert es auch bei mir, teilweise. Verwirrend ist aber das:

    Der Edit1 in Form3 verändert sich nicht, aber im Speicher scheint sich trotzdem das richtige zu rühren. Folgenden Code habe ich bei dem Buttonklick eingefügt:

    Form1->Edit1->Text = Form3->Edit1->Text;
    Form3->Edit1->Text = "asdff";
    

    Beim ersten klicken wird Form3->Edit1->Text in Form1->Edit1->Text richtig reingeschrieben und beim zweiten klicken steht dann „asdff“ in Form1->Edit1->Text. Visuell ändert sich an Form3->Edit1 überhaupt nichts, aber die Text-Eigenschaft wird angenommen und richtig gespeichert. Merkwürdiger Weise kann ich in Form3->Edit1 nicht per Hand reinschreiben. Ist das bei Dir auch so?

    Scheint wohl ein Bug mit WinXP und BCB5 zu sein … oder gib es dafür irgendwo eine Begründung.



  • Bei mir hats alles funktioniert.

    Beim ersten klicken wird Form3->Edit1->Text in Form1->Edit1->Text richtig reingeschrieben und beim zweiten klicken steht dann „asdff“ in Form1->Edit1->Text.

    Das ist völlig klar, da du erst Form3->Edit1->Text als Texteigenschaft von Form1->Edit1->Text setzt. Wenn in beiden Edit-Feldern das selbe stehen soll, musst du erst die Eigenschaft von Form3->Edit1->Text sehtzen bevor du sie in Form1 setzt.

    Visuell ändert sich an Form3->Edit1 überhaupt nichts, aber die Text-Eigenschaft wird angenommen und richtig gespeichert. Merkwürdiger Weise kann ich in Form3->Edit1 nicht per Hand reinschreiben. Ist das bei Dir auch so?

    Bei mir hat sich anfangs auch nur das Edit in Form1 geändert. Das funzt wohl nur, wenn du die Formulare 2 und 3 nicht mit dem Operator "new" instanzierst. Die Forms werden ja automatisch erzeugt und nur mit der Eigenschaft Visible=false erstellt. Du musst sie nicht noch extra mit "new" erstelln. Bei mir hats gereicht, die Visible-Eigenschaft, durch Form->Show() im OnCreate Handler, auf true zu setzen.

    Das du da nicht reinschreiben kannst ist komisch. Bei mir ging das. Vielleicht hast du irgendeine Eigenschaft gesetzt, sowas wie ReadOnly oder Enabled.



  • MORL schrieb:

    .... nicht mit dem Operator "new" instanzierst. Die Forms werden ja automatisch erzeugt ...

    Das automatische erstellen von Formularen ist eine Funktion, welche beim BCB6 scheinbar standardmäßig aktiviert ist. Beim BCB5 soll das auch gehen, aber ich will eigentlich reinrassiges C++ programmieren, anstatt eine IDE bedienen zu können ...

    Da das Problem hier eigentlich OT ist hab ich nen neuen Fred aufgemacht ...



  • Das hat nichts mit der Bedienung der IDE zu tun sondern mit der richtigen Benutzung eines Frameworks, hier der VCL.
    Wenn du nur "reinrassiges C++" programmieren willst dann erstell halt ein Konsolenprojekt ohne VCL und programmier dir deine Fenster selbst.

    Und da dein neuer Thread eben doch dasselbe Thema hat wie dieser (von den Abschweifungen der letzten Beiträge mal abgesehen) mache ich dort gleich wieder zu.



  • Jansen schrieb:

    ... "reinrassiges C++" ...dir deine Fenster selbst.

    Und da dein neuer Thread eben doch dasselbe Thema hat wie dieser (von den Abschweifungen der letzten Beiträge mal abgesehen) mache ich dort gleich wieder zu.

    Mit der Reinrassigkeit meinte ich, daß man seine Objekte selbst erstellt bzw. instanziert und nicht daß die Objekte grundlos schon fertig im raum herumstehen wie bei MS-Access.

    Anderer Thread: Der neue Thread hat mit der Erstellung anderer Forms zu tun und in diesem Thread wurde bereits vollständig abgehandelt wie man auf andere Forms zugreift, wie auch in der Überschrift angekündigt.



  • In Bezug auf deine Pseudo-Childfenster is ist völlig egal, ob die Fenster automatisch erzeugt wurden oder "per Hand", sie lassen sich so oder so nicht aktivieren.
    Aber tröste dich, mit diesem "Problem" stehst du nicht allein, als prominentes Beispiel kannst du dir mal WinRar und dessen Statusfenster während des Entpackens ansehen.

    Wenn du MDI-Funktionalität wünschst dann solltest du besser auch ein MDI-Projekt verwenden.



  • Jansen schrieb:

    ... Pseudo-Childfenster ...

    Pseudo Childforms!!! Danke jetzt komme ich langsam drauf, dass ich da etwas Verwechselt habe. Das ist möglicherweise kein MDI. Sorry für die Verwirrung.

    Ich will etwas machen wie etwa in dem Screenshot zu sehen: http://bronks.gmxhome.de/somi/civ.jpg

    Ein großes übergeordnetes Fenster in dem ich unterschiedliche kleine Fenster mit unterschiedlichem Inhalt und auch Texteingabefelder und Buttons darstellen kann. Die kleinen Fenster dürfen sich nicht aus dem großen rausziehen lasssen. Ich glaube nicht mehr dran, dass man das MDI nennt … richtig?

    Könntest Du mir bitte einen kleinen Denkanstoß in die Richtung geben wie man diese Technik nennt.

    Schönen Gruß!

    Bronks



  • Die Technik nennt man MDI, Multiple Documents Interface. In einem MDI-Parent gibt es ein oder mehrere MDI-Childs.
    Über Datei->Neu->Projekte kannst du dir im BCB ein Standard-MDI-Projekt erzeugen lassen, ansonsten siehe TForm::FormStyle.

    Im Gegensatz zum MDI gibt es beim Single Document Interface keine Form innerhalb einer Form. Der Hack mit Parent ist eben das, ein Hack.


Anmelden zum Antworten