TFrames zur Laufzeit setzen und zugreifen



  • Hi! Ich habe in der Entwicklung ein paar TFrames erzeugt und mit Komponenten und Funktionen gefüllt. Solang ich jedoch das TFrame nicht auf der Form darstelle, solang werden Zugriffe auf dessen Funktionen mit einer Fehlermessagebox quitiert.

    Gibt es eine Möglichkeit auf Funktionen von Frames zuzugreifen die noch nicht bzw momentan nicht dargestellt wurden?



  • Hallo

    Es wäre natürlich nützlich gewesen Quellcode und Fehlermeldung zu zeigen damit wir auch konkret antworten können 🙄

    Allgemein gilt : Du kanst auf Methoden und Eigenschaften von dynamischen Komponenten zugreifen wenn sie gültig sind, sprich wenn sie mit new erstellt wurden. Ob sie in einem Form dargestellt werden (Parent zugewiesen) ist dabei nur wichtig wenn Funktionen aufgerufen werden die ein Redraw auslösen.

    Deine Beschreibung klingt so als ob du über einen Zeiger arbeitest dem keine gültige Frameinstanz zugewiesen wurde. Und nein so kannst du niemals zugreifen.

    bis bald
    akari



  • akari schrieb:

    Es wäre natürlich nützlich gewesen Quellcode und Fehlermeldung zu zeigen damit wir auch konkret antworten können

    Die Fehlermeldung kommt zur Laufzeit, wenn ich zum Beispiel auf eien Button klicke welcher auf eine Funktion eines anderen nicht dargestellten Frames zugreifen will und quittiert das mit der üblichen nichtssagenden Speicherfehlermeldung.

    In der Funktion zum Beispiel wird nur ein String bearbeitet und ergänzt und Ergebnis zurückgegeben.

    Ich verstehe nur nicht ganz, warum dies nicht klappt. So wie TForms auch wenn unsichtbar zur Verfügung stehen, sollten das doch auch TFrames, oder nicht?
    TFrames sind vom Quelltext/Klassen-aufbau identisch, bis auf die Tatsache das Frames auf einer TForm eingebettet werden müssen.

    Ich kann bei nicht sichtbaren TFrames ja nichteinmal den Text/Caption einer Komponente ändern, was bei nicht sichtbaren TForms klappt.

    Gibt es vielleicht einen TFrame Container der wie eine unsichtbare Form fungiert in welchen man alle TFrames reinsetzen kann und von dort aus dann auf die eigentliche TForm darstellen?



  • Hallo

    Wie ich bereits sagte : Es spielt keine Rolle ob das Frame sichtbar ist oder nicht , sondern ob es erstellt wurde!
    Besipiel :

    TFrame1* frame = new TFrame1(0);
    frame->Label1->Caption = "TEst";
    delete frame;
    

    Hier wird ein Frame erstellt und bearbeitet, aber ohne das es irgendwo angezeigt wurde (da kein Parent zugewiesen wurde)

    Im Gegensatz dazu das hier

    TFrame1* frame;
    frame->Label1->Caption = "TEst";
    

    führt zu einer Zugriffsverletzung, vermutlich wie bei deinem Projekt.

    bis bald
    akari



  • Ich verstehe da jetzt aber nicht den Unterschied zwischen TForm und TFrame, denn beide werden identisch angelegt.

    *TForm2 Form2; zu *TFrame1 Frame1;

    Und eigentlich will ich ja keine Instanz davon erstellen, sondern auf das eine definierte Frame bzw Form zugreifen.



  • Hallo

    yumja schrieb:

    Ich verstehe da jetzt aber nicht den Unterschied zwischen TForm und TFrame, denn beide werden identisch angelegt.

    *TForm2 Form2; zu *TFrame1 Frame1;

    TForm und TFrame sind beides unterschiedliche Klassen, aber die Syntax ist nunmal immer dieselbe. Das hat nichts mit den VCL-Komponenten zu tun sondern ist durch C++ so vorgegeben. Du solltest deine Grundlagenkenntnisse zum Thema OOP und Speicherverwaltung auffrischen.

    Und eigentlich will ich ja keine Instanz davon erstellen, sondern auf das eine definierte Frame bzw Form zugreifen.

    Zunächst nochmal der Hinweis auf den Unterschied zwischen Klasse (TForm1 bzw. TFrame1) und Instanzen der Klasse (zum Beispiel die hinter dem Pointer Form1).
    Von TForm1 legt die VCL standardmäßig eine Instanz an auf die du mittels des ebenfalls standardmäßig deklariert wird. Das ist aber kein Feature der Form-Klasse sondern Teil des VCL-Codes in dem Projekt.
    Für TFrame hingegen wird keine Instanz automatisch angelegt (kann aber eingestellt werden). Das ist auch gut so weil ein Frame ansich ja nutzlos ist, es wird ja nirgends angezeigt. Erst beim Übertragen eines Frames auf ein Form wird es angezeigt. Dabei wird aber sowohl zur Entwurfszeit als auch zur Laufzeit eine neue Instanz des Frames angelegt. Damit würden aber alle Manipulationen an der eventuell vorhandenen Standardinstanz sinnlos sein. Also nochmal : Es ist bei Frame nicht sinnvoll die Standardinstanz einzuschalten.

    bis bald
    akari



  • Ich danke dir für deine tolle Erklärung und habs auch verstanden und stimme mit dir überein das eine Automatik keinen richtigen Sinn macht. Werde meine Struktur nochmal überarbeiten.


Anmelden zum Antworten