Hilfe bei Komponentenentwicklung - "n" Komponenten zusammenführen
-
Hallo zusammen,
erstmal ein großes Lob an die Verfasser der BCB-Tutorials - einfach klasse und ein super Nachschlagewerk / Lernhilfe.
Aber ich komme da bei eines Sache nicht weiter...
Ich hänge immer noch an dem Problem mit den Mehreren Komponenten, aus den ich eine bauen möchte.
Z.B. Soll neben einem Edit-Feld ein kleiner Button mit einer Lupe erscheinen. Also Edit abgeleitet, alle zusätzlichen sachen reingebaut, nur, wie bekomme ich nun den Schalter hin?
Es gab mal den Tipp mit dem TPanel, aber das hab' ich auch nicht hinbekommen....
Kann da vieleicht jemand ein wenig Licht in die Sache bringen?
Danke!
Frank
-
Hallo
Direkt vin TEdit abzuleiten ist wirklich schlecht. Sondern besser von TPanel ableiten, oder am besten von TControl.
Es gab mal den Tipp mit dem TPanel, aber das hab' ich auch nicht hinbekommen....
Und was genau hast du nicht hinbekommen?
bis bald
akari
-
Hallo,
also ich hab im BCB TPanel in eine eigene Komponente abgeleitet, und dann versucht, dieser ein Edit und einen Button "beizubringen". Diese wurden zwar als Variablen erzeugt, aber nie angezeigt.
Habe es dann auch mal versucht einfach ein TPanel zu nehmen, dort ein edit und einen button reizuziehen, und dann den Programmcode den der BCB erzeugt hat, in meine TPanel komponente reinzubauen... naja desaster trifft das ergebnis ziemlich genau...
Irgendwie hab ich da ein Verständnisproblem... liegt auch vieleicht daran das der BCB so viel "automatisch" macht?
mfg
Frank
-
Hallo
also ich hab im BCB TPanel in eine eigene Komponente abgeleitet, und dann versucht, dieser ein Edit und einen Button "beizubringen". Diese wurden zwar als Variablen erzeugt, aber nie angezeigt.
Es reicht nicht eine Variable anzulegen, sondern du must noch eine Instanz mit new erzeugen. Das macht der Builder sonst zur Entwurfszeit mit dem Objektinspektor automatisch, bei der Komponentenentwicklung must du das aber selber machen.
bis bald
akari
-
Hm.... OK das ist soweit auch klar.... Aber die ganzen eigenschaften, die muss ich doch von Hand setzen, oder? bzw. eine *DFM-Ähnliche Datei gibt es bei Komponenten ja nicht, richtig?
Zwischenfrage: Wie kann ich meine Veränderungen an der Komponente eigentlich testen, ohne ständig zwischen "Neuer Application" und "Package laden + compilieren" hin- und herzuspringen?
Ich hasse Montag morgen....
-
Hallo
Hm.... OK das ist soweit auch klar.... Aber die ganzen eigenschaften, die muss ich doch von Hand setzen, oder? bzw. eine *DFM-Ähnliche Datei gibt es bei Komponenten ja nicht, richtig?
Alle Eigenschaften die du von dem Button übernehmen willst, must du in der Tat neu anlegen und an den Button weitergeben.
Zwischenfrage: Wie kann ich meine Veränderungen an der Komponente eigentlich testen, ohne ständig zwischen "Neuer Application" und "Package laden + compilieren" hin- und herzuspringen?
Indem du die Komponente direkt in einem Projekt testest, und dort nicht zur Entwurfszeit, sondern dynamisch zur Laufzeit eine Instanz davon erstellst.
bis bald
akari
-
Hallo
Indem du die Komponente direkt in einem Projekt testest, und dort nicht zur Entwurfszeit, sondern dynamisch zur Laufzeit eine Instanz davon erstellst.
Aarrgh... jetzt Zeigt er die Komponenten nicht mal mehr an... *verzweifel*
Ich muss doch so vorgehen, oder?
Unit1.h
private: // User declarations TEdit *Edit2;Unit1.cpp
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { Edit2 = new TEdit(this); }void __fastcall TForm1::FormShow(TObject *Sender) { Edit2->Show(); }Ich befürchte ich hab jetzt echt ein Brett vorm Kopf....
Frank
Edit:
....manchmal sollte man doch in die FAQ schauen.... *schäm*
-
Hallo
heißt das, du hasts bereits herausgefunden das du noch einige Eigenschaften von der erstellten Instanz setzen must, und das der Show-Aufruf überflüssig ist?
bis bald
akari
-
Hallo,
mindestens
->Parentsetzen. Und
->Show()ist tatsächlich überflüssig...

Welche Werte sollte ich denn noch setzen, so quasie "Mindestvorgaben" ?
mfg
Frank
-
Hallo
Die Dimensionen sind noch wichtig (Left, Right, Height, Width).
Bzw. die Relativen Positionszuordnungen (Align, Constraints, Anchor).bis bald
akari
-
Hallo,
Dimensioniereung.. genau das richtige Stichwort... Wieso stimmen die Werte für Left, Top, usw. nicht, wenn ich im Konstruktor der Abgeleiteten Klasse drauf zurückgreife?
__fastcall TAresAdvDBEdit::TAresAdvDBEdit(TComponent* Owner) : TAresAdvEdit(Owner) { SearchBtn = new TAresBitBtn(this); SearchBtn->Parent = this; SearchBtn->Left = this->Left; this->Left = this->Left + this->Height; SearchBtn->Top = this->Top; SearchBtn->Width = this->Height; SearchBtn->Height = this->Height; SearchBtn->Caption = "+"; }-> Werte: Left = 0, Top = 0, Height = 19
Diese Werte sehen mir nach default-Werten aus. An welcher Stelle "lädt" denn der BCB die per Positionierung auf der Form festgelegten Koordinaten für eine Komponente?

Frank
-
Hallo Forum,
keiner eine Idee? Ich hab's jetzt ein paar mal hin und her probiert, aber ich bekomme nie die "realen" Koordinaten der Komponente...
Left/Top sind immer Null. Direktes Zuweisen von Werten geht aber (also z.B. Left = 100, Top = 100). Dann erscheint die Komponente auch da.
Gibts keine Möglichkeit die "Form"-Koordinaten einer Komponente innerhalb dieser Komponente zu ermitteln? Müßte doch möglich sein....

(zur Erklärung: möchte links neben einem Edit-Feld einen kleinen Button anzeigen, und das Edit-Feld um die Breite des Buttons nach rechts verschieben)
Frank
-
Hallo
SearchBtn->Parent = this;
SearchBtn->Left = this->Left;Schon mal falsch. Da SearchBtn nun unter this geordnet ist, Basiert die Zuordnung der Position relativ zu this, nicht mehr zu dem Form.
Das bedeutet der Ursprung [0,0] ist für SearchBtn nicht mehr die obere linke Ecke des Forms, sondern die obere linke Ecke des Parent-Controls.bis bald
akari
-
Hallo akari,
hm, ok, soweit verstanden, aber.... warum ist dann
this->left = 0 // warum null?Dort müßte doch dann die Links-Position der Parent-Komponente relativ zu dessen Parent (= Form) stehen, oder? Und damit müßte ich doch per
this->left = this->left + SearchBtn->widthdie Komponente um die Breite des Buttons nach rechts verschieben??
mfg
Frank
-
Hallo
Genau jetzt kommst du mit deiner Vererbung an den toten Punkt.
Der Searchbutton ist dem Edit untergeordnet, das heißt er muß sich visuell innerhalb des Edits befinden. Du kannst so nicht mehr das Edit neben den Button schieben!
Genau deswegen brauchst du eine Ableitung von TControl o.ä., wo Button und Edit auf dem gleichen Parent-Level stehen und deshalb auch visuell nebeneinander stehen können.bis bald
akari
-
Hallo akari,
Aaaarrrgh....Na super... Und nu? Hilfeee.....

Meine Anwendung baut quasie darauf auf, "direkt" in Edit-felder zu schreiben, bzw aus ihnen zu lesen. Wenn ich dich also richtig verstehe, müßte ich mir ein Konstrukt aufbauen, der sich "nach außen" so verhält wie ein Edit-feld, aber "nach innen" irgendwas anderes ist, innerhalb dem Edit und Btn auf "gleicher ebene" existieren....
OMG
Und meine Anwendung hat ja nur "ein paar" zeilen quähltext....
Hast du vieleicht einen Tipp für mich, wie ich das mit wenig "um-die-ecke-programmieren" lösen kann?
Frank
-
Hallo
Als Alternative bietet sich noch an, nur von TAresBitBtn abzuleiten. Dann brauchst du der neuen Klasse nur eine Eigenschaft names Edit vom Typ TAresAdvDBEdit und eine Setter-Methode zu geben. In der Setter-Methode setzt du neben der interen Variable noch die Position passend zu dem bereits existierenden und positioniertem Edit.
Als Beispiel kannst du dir TUpDown und desen Eigenschaft Associate anschauen.
Das hat aber nachteil, das jede nachträgliche Positionsveränderung des Edits nicht automatisch eine Veränderung bei dem Button auslöst.bis bald
akari