Problem mit Zugriff auf Komponente einer externen Unit



  • Hi,

    es gibt zwei Formulare

    dlg.cpp ich nenns mal "dlg"
    und
    main.cpp ich nenns mal "main"

    wenn du vom main auf dlg zugreiffst, ohne, dass das Formular dlg initailisiert wurde, ist die Listbox natürlich leer.

    Damit die Einstellungen des Formular dlg angezeigt werden, welche im Objektinspektor zur entwurfszeit vorgenommen wurden, muss die Methode "Loaded" aufgerufen worden sein. Dieses wird automatisch beim erstellen des Forulars aufgerufen. Das war wohl nicht bei dir nicht der Fall weil du zu früh darauf lesend zugegriffen hast.



  • AndreasW schrieb:

    wenn du vom main auf dlg zugreiffst, ohne, dass das Formular dlg initailisiert wurde [...]

    ... dann gibt's eine AccessViolation, oder?



  • stimmt. Die sollte er bekommen. 🙂

    @soccer: vielleicht solltest du wirklich mehr Quellcode posten.



  • Danke, dass ihr geantwortet habt!

    Andreas hat es schon größtenteils erfasst, nur ist die ListBox auf dem MainForm, zugehörig zur main.cpp - und der Zugriff erfolgt in der dlg.cpp!

    Die Ausgangssituation:
    Die Hauptdatei "main.cpp" mit dem Formular "MainForm"
    -> enthält eine ListBox namens "ListBox1"
    -> enthält einen Button namens "MainButton"
    -> enthält ein Edit namens "MainEdit"

    Die Unit "dlg.cpp" mit dem Formular "DlgForm"
    -> "main.h" includiert
    -> enthält nicht die ListBox
    -> enthält einen Button namens "DlgButton"
    -> enthält ein Edit namens "DlgEdit"

    ------------------------------------------------------------

    Problem:

    Die Buttons beider Formulare haben je ein OnClick-Event, dass nun programmiert werden soll:

    Im zum Formular gehörigen Edit-Feld soll die Anzahl der Einträge der ListBox aus der MainForm angezeigt werden!

    Quelltext:

    (Bin nicht am BCB-Rechner, deswegen "frei hand", sry für ggf. fehler)

    // main.cpp
    void TMainForm::OnClick( TButton* MainButton )
    {
        MainEdit->Text = IntToStr( ListBox1->Items->Count );
    }
    

    Ausgabe: 2 (RICHTIG!!!)

    // dlg.cpp
    void TDlgForm::OnClick( TButton* DlgButton )
    {
        DlgEdit->Text = IntToStr( MainForm->ListBox1->Items->Count );
    }
    

    Ausgabe: 0 (egal wie groß die anzahl der einträge wirklich ist, es wird immer 0 ausgegeben FALSCH!!!)

    ---------------

    Ich habe nicht in Erinnerung, je ein solches Problem gehabt zu haben, da es eigentlich funktionieren müsste und ich daran nichts falsches sehen kann. Solange die main.h includiert ist, muss man doch funktionsfähig auf Eigenschaften von Komponenten anderer Units zugreifen können!?

    Bitte helft mir!



  • ich würd mal prüfen, ob MainForm wirklich die selbe Instance bei beiden Aufrufen aufweist. Breakpoint in beiden OnClick's und dann prüfen, ob Adresse von this in Main gleich der MainForm Adresse in Dlg ist.



  • kann ich jetzt leider nicht. aber dann für bcb-rechner: wie kann ich es richtig machen, da anscheinend wirklich nicht auf das "echte" mainform zugegriffen wird!?



  • na kann es sein, dass MainForm in Dlg eine "lokale" private Variable ist?



  • Hi,

    wenn du keine andere Instanz erzeugt hast, gibt es auch keine andere Instanz.

    Liegt eine der Dateien in ein anderes Verzeichnis ? Wenn ja lösche alle *.obj- und *.tds- Dateien und klicke auf Projekt/Projekt neu erstellen.

    In den Projektoptionen findest du die Pfade, die der BCB nach Dateien abklappert. Prüfe, ob Dateien vielleicht doppelt auf deinem Rechner sind und lege dabei ein besonderes Augenmerk auf die Pfade des BCBs in den Projektoptionen.



  • Ich habe mich selber betrogen, indem ich einfach die anweisung in der oncreate bzw. dem auch im konstruktor versucht habe, wo er anscheinend noch nicht die korrekte einbeziehung der mainform vollzogen hat. im OnShow-Event funktioniert der Zugriff.

    SRY für die Frage, wiel eigentlich war es ja an sich logisch, nur eben habe ich das falsche Event gewählt. Wäre trotzdem nett, wenn ihr mich dahingehend aufklären könntet, wozu ich dann das OnCreate-Event brauch im Vergleich zum OnShow. Konstruktor ist klar, da kann ich eigene werte der klasse festlegen.



  • soccer schrieb:

    Ich habe mich selber betrogen, indem ich einfach die anweisung in der oncreate bzw. dem auch im konstruktor versucht habe, wo er anscheinend noch nicht die korrekte einbeziehung der mainform vollzogen hat.

    Das funktioniert auch im OnCreate oder im Konstruktor der dlg-Form. Du musst noch einen anderen Fehler eingebaut haben, deshalb solltest du ja mal den Quelltext eines entsprechenden Minimalprojektes posten.


Anmelden zum Antworten