Eigenschaften von selbstgebauten von TFrames im Objektinspektor verfügbar machen



  • Hallo,

    meine Anwendung besteht zunehmend aus Ableitungen von TFrame.

    Komponenten erwiesen sich als unpraktisch, da sie (bewusst) unabhaengig von der Anwendung sind. Dies kann bei mir nicht der Fall sein.

    Ich moechte nun zu den Standard-Eigenschaften von Frames wie Caption eigene hinzufügen, die auch zur Entwurfszeit im Objektinspektor des Builders auftauchen.

    Wie realisiert man das oder sind TFrames der falsche Weg?

    Danke



  • Hallo

    Das Ableiten und Erweitern von TFrame läuft genauso wie bei alle anderen Komponenten auch, also so wie hier beschrieben.

    Allerdings behandelt dieses Tut vor allem die VCL-Besonderheiten, OOP-Kenntnisse sind noch erforderlich.

    bis bald
    akari



  • Vielen Dank, das sieht gut aus.

    Kann ich auch andere Controls ableiten ausser TFrame und diese dann einfügen, ohne gleich auf Komponenten und damit auf Packages und damit auf Komponenten zurückgreifen zu müssen.

    Meint:
    Frames kann man über die Palette "Standard --> Frames" einfügen, wie macht man das bei anderen Dingern?



  • Hallo

    grundsätzlich kannst du Komponenten ableiten wie du willst, und kannst diese dann im Quellcode manuell benutzen.

    Wenn du dann daraus ein eigenes Package für die Designpalette machen willst (wenn du es denn brauchst), must du nur im Menü Komponente/Neue Komponente oder so ein Package aus dem Quellcode deiner neuen Komponente erstellen

    bis bald
    akari



  • Vielen Dank nochmal.

    wenn ich die neue Komponente also per Designpalette in das Programm einfügen will, dann führt kein Weg an den Packages vorbei?

    Unschön finde ich daran, dass Packages Teil des Builders und nicht des Projektes sind. Meine neue Komponente ist sehr speziell und gehört nur zu dem einen Programm.

    Als Komponente würde sie nichtmal zum Programm-Projekt gehören, wobei sie auf einen großen Teil davon benutzen müsste.

    Für mich sieht das sehr "unrund" aus für meinen Fall, da muss ich mir wohl was anderes einfallen lassen.



  • Folgende Lösung habe ich mir als Beispiel ausgedacht:

    Ich arbeite komplett mit Frames, in denen ich dann über den Konstruktor die modifizierten Komponenten dynamisch erzeuge.

    Dabei hatte ich die Hoffnung, dass so die innere dynamische Komponente immer die volle Größe des TFrames annimmt.

    Ich habe gedacht, dass folgender Code das erledigt:

    __fastcall TFrame2::TFrame2(TComponent* Owner)
            : TFrame(Owner)
    {
      //ein Textfeld neu erstellen mit voller groesse
      TEdit* mein_edit= new TEdit(this);
    
      //Einstellungen vornehmen
      mein_edit->Text= "Bloed!!";
    
      //Position festlegen
      mein_edit->Top=   0;
      mein_edit->Left=  0;
    
      //Groesse dynamisch an das Frame anpassen
      mein_edit->Height= this->ClientHeight;
      mein_edit->Width= this->ClientWidth;
    
      //Und anzeigen
      mein_edit->Parent=this;
    }
    

    Das funktioniert nicht, da komischer Weise this->ClientHeight z.B. die Größe des Frames zur Entwurfszeit zurückgibt.
    Ich wollte eigentlich die tatsächliche Größe des Frames erfahren.

    Zusammengefasst:

    Wenn man selbstgemachte Frames in sein Formular einfügt, dann kann man dort dessen Größe ändern.
    Kann man innerhalb des Frames darauf zugreifen? 😕

    Oder greife ich im Konstruktor nur früh auf diese Werte zu?



  • Hallo

    siehe die Eigenschaft Align

    bis bald
    akari



  • Okay, Problem gelöst:

    Der Zeitpunkt war zu früh, anscheinend wird die Komponente erst nach der Konstruktion auf die Zielgroesse gestellt.

    Ich habe das Erstellen der inneren Controls nun bei dem Event OnResize gemacht und schon funktioniert es.



  • akari schrieb:

    siehe die Eigenschaft Align

    Danke nochmal.
    Daran habe ich zuerst auch gedacht, aber TEdit hat z.B. diese Eigenschaft nicht.



  • Hallo

    du erstellst beim OnResize neue Komponenten?
    Vergiß das lieber und schau dir die von mir genannte Eigenschaft an.

    /Edit : wenn es die Eigenschaft nicht gibt dann solltest du trotzdem die Erstellung im Konstruktor machen, im OnResize-Event nur die Dimensionszuweisung.

    bis bald
    akari



  • Danke, da stimme ich absolut zu, das ist mir gestern auf dem Heimweg auch eingefallen:
    Im Konstruktor konstruiere ich das Innenleben und im OnRezise dessen Größe.

    Jetzt muss ich nur noch versuchen, dieses neue Control (bzw. TFrame) in ein TStringGrid oder TDrawGrid zu stopfen.

    PS: Die Suche hier im Forum findet leider so gut wie nie was.



  • Hallo

    Thema Suche : hast du denn auch den roten Text neben der Suchmaske beachtet?

    bis bald
    akari


Log in to reply