Geschrieben von holland am 17.06.2006, 19:40

Komponente programmieren

Ein sehr umfangreiches Thema welches ich hier im Grundsatz
einmal "anreißen" möchte ist das Programmieren einer eigenen
Komponente (Steuerelement) mit dem C++Builder.

1.
Menü "Datei"/"Neu"/"Komponente" wählen.

2.
Vorfahrtyp einstellen.
Wählt hier das Steuerelement aus welches dem neuen am ähnlichsten
ist.
Auf diesem Steuerelement baut das neue auf.
Für dieses Beispiel nehmen wir das "TEdit".

3.
Als Klassenname den Namen des neuen Steuerelements eintragen.
Für dieses Beispiel nehmen wir "FDateBox".

4.
Als Pallettenseite (hier erscheint hinterher das neue Element)
können wir eine bestehende frei wählen oder eine neue eingeben.
Ich nehme hier natürlich immer "HOLLAND" wir können aber
Beispiele auswählen.

5.
Als Name der Unit geben wir unser Projektverzeichnis an und
vergeben den Namen FDateBox.cpp (der Name wurde schon automatisch
generiert).

6.
Wir klicken auf OK und der Builder erstellt uns schon mal das
Notwendigste:
-eine Headerdatei
-eine CPP-Datei mit folgenden "Funktionen":

//stellt sicher daß keine rein virtuellen Funktionen benutzt
//werden
static inline void ValidCtrCheck(FDateBox *)
{
new FDateBox(NULL);
}

//Konstruktor
__fastcall FDateBox::FDateBox(TComponent* Owner)
: TEdit(Owner)
{
}

//Registrierfunktion
namespace Fdatebox
{
void __fastcall PACKAGE Register()
{
TComponentClass classes[1] = {__classid(FDateBox)};
//in der folgenden Zeile könnt Ihr HOLLAND gegen
//Beispiele austauschen je nachdem was Ihr unter
//Punkt 4 angegeben habt!!! RegisterComponents("HOLLAND" classes 0);
}
}

7.
Wir möchten jetzt nur eine Eigenschaft für das Steuerelement
festlegen:
Jahrvierstellig !
Wenn diese Eigenschaft TRUE ist dann sollen 10 Zeichen in die
Box (TT.MM.JJJJ) eingegeben werden können bei FALSE nur 8 Zeichen
(TT.MM.JJ).

Diese Eigenschaft schreiben wir in den PRIVATE-Bereich des Headers.
Außerdem müssen wir später zur Festlegung der Länge noch auf die
grundsätzliche Eigenschaft "MAXLENGTH" zugreifen.
Deshalb deklarieren wir diese auch dort.

private:
bool Fjahrvierstellig;
__property MaxLength;

Ich stelle den Eigenschaftennamen immer ein "F" voraus um erkennen
zu können daß es sich um "meine" Eigenschaft handelt.
Bei der Zuweisung (mehr dazu später) verwende ich dann ein "A".
Dies hat sich als Programmierkonvention eingebürgert warum auch immer?!

8.
Jetzt müssen wir noch eine Funktion deklarieren mit der wir die
Eigenschaft "JahrVierstellig" ändern können.
Wenn der Programmierer im Projekt unser Element markiert und in den
Objektinspektor wechselt möchte er ja diese Eigenschaft ändern.
Dazu muß das Element diese Änderung entgegennehmen können.

protected:
void __fastcall Setjahrvierstellig(bool Ajahrvierstellig);

Wie Ihr seht benutze ich hier das "A".

9.
In den "Published-Bereich" der Header-Datei muß ich die Lese-/und
Schreiboperation unterbringen.
Dies ist die eigentliche Schnittstelle die von außen angesprochen
werden kann.
__published:
__property bool jahrvierstellig={read=Fjahrvierstellig write=
Setjahrvierstellig default=true};

Von außen kann also jetzt auf die Eigenschaft "jahrvierstellig"
zugegriffen werden und dieser Zugriff wird bei einem Lesezugriff
direkt an die Private-Variable "Fjahrvierstellig" weitergeleitet.
Bei einem Schreibzugriff wird an die Protected-Methode
Setjahrvierstellig weitergeleitet.
Und standardmäßig soll diese Eigenschaft auf TRUE stehen.

10.
Um alle anderen Eigenschaften eines "normalen" TEdits ins Element zu
bringen müssen wir diese Eigenschaften deklarieren.
Das geschieht auch im Published-Bereich.

__property Anchors ;
__property AutoSize ;
__property BorderStyle ;
__property CharCase ;
__property Color ;
__property Constraints ;
__property Ctl3D ;
__property Enabled ;
__property Font ;
__property ParentBiDiMode ;
__property ParentColor ;
__property ParentCtl3D ;
__property ParentFont ;
__property ParentShowHint ;
__property PopupMenu ;
__property ReadOnly ;
__property ShowHint ;
__property TabOrder ;
__property TabStop ;
__property Text ;
__property Visible ;
__property OnChange ;
__property OnClick ;
__property OnContextPopup ;
__property OnDblClick ;
__property OnDragDrop ;
__property OnDragOver ;
__property OnEndDock ;
__property OnEndDrag ;
__property OnEnter ;
__property OnExit ;
__property OnKeyDown ;
__property OnKeyPress ;
__property OnKeyUp ;
__property OnMouseDown ;
__property OnMouseMove ;
__property OnMouseUp ;
__property OnStartDock ;
__property OnStartDrag ;

Was wir hier weglassen wird es im Element (Objektinspektor)
nicht geben kann also nicht verändert werden.
Ich habe natürlich nicht alle Eigenschaften mühsam eingetippt.
Öffnet doch mal die Datei "stdctrls.hpp" (sucht danach auf der
Platte)!
Dort stehen alle diese Eigenschaften drin und können sehr leicht
kopiert werden.

11.
Die Headerdatei ist nun fertig.
Jetzt müssen wir in der CPP-Datei nur noch die Schreibfunktion für
das Setzen (Schreiben) der Eigenschaft coden.

void __fastcall FDateBox::Setjahrvierstellig(bool Ajahrvierstellig)
{
Fjahrvierstellig = Ajahrvierstellig;
if (Fjahrvierstellig)
MaxLength=10;
else
MaxLength=8;
}
Der Code dürfte ja jedem "klar" sein!

12.
Jetzt sollten wir die Komponente testen ohne sie gleich komplett
einzurichten.
Dazu speichern wir das Projekt ab und starten ein neues Anwendungs-
projekt.
Dieses neue Projekt speichern wir ins gleiche Verzeichnis wie das
Element.

Jetzt wählen wir das Menü "Projekt"/"DemProjekt hinzufügen" und
fügen die CPP-Datei des Elements hinzu.

Jetzt öffen wir den Header des Hauptfomulars und nehmen als Include-
Datei:
#include "FDateBox.h"
auf.
In den Private-Abschnitt coden wir:
FDateBox* fdb;

Jetzt wechseln wir in die CPP-Datei der neuen Anwendung und widmen
uns dem Konstruktor der Form.

//Instanz erzeugen
fdb=new FDateBox(this);
//Mit Form verknüpfen
fdb->Parent(this);
//Höhe Breite Tiefe setzen
fdb->SetBounds(20 20 200 20);
//Schriftgroesse setzen
fdb->Font->Size=16;

Damit wird unser Element auf die Form gezeichnet.

Wir starten das Programm und überzeugen uns von der Funktionstüchtig-
keit unseres Elements.

13.
Wir sind jetzt zufrieden mit unserem Element und wollen es kompilieren
und in die Werkzeugleiste aufnehmen.

Zuerst wählen wir das Menü "PROJEKT"/"FDATEBOX ERZEUGEN".
Dadurch wird unser Element kompiliert.
Jetzt wählen wir das Menü "KOMPONENTE"/"KOMPONENTE INSTALLIEREN".
Im daraufhin erscheinenden Fenster müssen wir unsere CPP-Datei einstel-
len und den Werkzeugkastenreiter prüfen.
Als Package-Name sollte hier DCLUSR50.BPK (für den 5erBuilder ansonsten
DCLUSRxx.BPK) stehen. Das ist das Package in dem alle eigenen Elemente
aufgenommen werden sollten. Natürlich könnten wir auch ein neues Package
erstellen.
Klicken wir jetzt auf OK wird die Komponente installiert und erscheint nun
in der Werkzeugleiste.

14.
Ein neues Projekt kann die Komponente jetzt direkt auf die Form ablegen
und per Objektinspektor unsere Eigenschaft und die generellen Eigenschaften
einstellen.

15.
Um die Komponente nachträglich zu erweitern müssen wir sie ja wieder in
den C++Builder laden. Das geht aber nicht über eine Projektdatei (BPR
doppelt anklicken)!!!
Es muß dazu lediglich die Projekt-CPP-Datei im C++Builder geöffnet werden.

Bewertung Anzahl
6
100,0 %
1 Bewertungen