Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Komponente erstellen (TMyRadioGroup) (https://www.delphipraxis.net/179769-komponente-erstellen-tmyradiogroup.html)

MaBuSE 31. Mär 2014 13:47

Delphi-Version: XE

Komponente erstellen (TMyRadioGroup)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich habe folgende PN bekommen:
Zitat:

Hallo aus Aachen,
ich brauche eine erweiterte Komponente in Delphi - habe aber leider nicht DIE Ahnung.
Ziel: "TRadioGroup" mit zusätzlich einem "TButton" (z.B. ObenLinks im Rahmen) zum "un-checken" aller "RadioButtons".
Schriebest Sie/Du so etwas als AuftragsArbeit? ...die Kosten?
MfG
...
Da ich Fragen, die ins Forum gehören nicht per PN beantworte, hier nun für alle ;-)

Das Problem ist so klein, das es keine Auftragsprogrammierung wert ist.
Du leitest eine Komponente (z.B. TMyRadioGroup) von TRadioGroup ab und erzeugst im Constructor einen Button oder was Du auch immer magst. Dann nur noch die Eigenschaften entsprechend initialisieren und fertig.
Im Destructor wird der wieder entfernt.

Wenn Du auch von "außen" also dem Objekt-Inspektor auf die Eigenschaften des Buttons zugreifen möchtest, so reicht dazu eine Zeile
Delphi-Quellcode:
property name: ObjektTyp read Variable;
So könnte es z.B. aussehen:
Delphi-Quellcode:
unit MyRadioGroup;

interface

uses
  SysUtils, Classes, Controls, StdCtrls, ExtCtrls;

type
  TMyRadioGroup = class(TRadioGroup)
  private
    FClearButton: TButton;
  protected
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure ClearButtonClick(Sender: TObject);
  published
    // Eigenschaft im Objektinspektor
    property ClearButton: TButton read FClearButton;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Beispiele', [TMyRadioGroup]);
end;

{ TMyRadioGroup }

procedure TMyRadioGroup.ClearButtonClick(Sender: TObject);
begin
  // Auswahl Löschen
  ItemIndex := -1;
end;

constructor TMyRadioGroup.Create(AOwner: TComponent);
begin
  inherited;
  // ClearButton anlegen und initialisieren
  FClearButton := TButton.Create(Self);
  FClearButton.Name := 'ClearButton';
  FClearButton.Parent := Self;
  FClearButton.Caption := '-';
  FClearButton.Width := 14;
  FClearButton.Height := 14;
  FClearButton.Top := 0;
  FClearButton.Left := Width - FClearButton.Width;
  FClearButton.Anchors := [akTop, akRight];
  FClearButton.OnClick := ClearButtonClick;
end;

destructor TMyRadioGroup.Destroy;
begin
  // ClearButton Freigeben
  FClearButton.Free;
  FClearButton := nil;

  inherited;
end;

end.
Wie wird nun so eine Kompoente installiert?
Da zu erstellen wir uns ein Package (z.B. MyComponents.dpk) in dem wir die Komponente (z.B. MyRadioGroup.pas) einbinden.

So könnte es z.B. aussehen:
Delphi-Quellcode:
package MyComponents;

{$R *.res}
{$ALIGN 8}
{$ASSERTIONS ON}
{$BOOLEVAL OFF}
{$DEBUGINFO ON}
{$EXTENDEDSYNTAX ON}
{$IMPORTEDDATA ON}
{$IOCHECKS ON}
{$LOCALSYMBOLS ON}
{$LONGSTRINGS ON}
{$OPENSTRINGS ON}
{$OPTIMIZATION ON}
{$OVERFLOWCHECKS OFF}
{$RANGECHECKS OFF}
{$REFERENCEINFO ON}
{$SAFEDIVIDE OFF}
{$STACKFRAMES OFF}
{$TYPEDADDRESS OFF}
{$VARSTRINGCHECKS ON}
{$WRITEABLECONST OFF}
{$MINENUMSIZE 1}
{$IMAGEBASE $400000}
{$DESCRIPTION 'Package zum Einbinden meiner Komponenten (TMyRadioGroup)'}
{$IMPLICITBUILD ON}

requires
  rtl,
  vcl;

contains
  MyRadioGroup in 'MyRadioGroup.pas';

end.
Die beiden Dateien habe ich Dir nochmal als Anhang zur Verfügung gestellt.
In ein Verzeichnis speichern.
*.dpk aufrufen.
Im Projektmanager auf MyComponents.bpl rechtsklicken und "Installieren" wählen.
Es wurd nun kompiliert und installiert.
Nun ist die Komponente im der Komponentenpalette unter Beispiele zu finden und kann verwendet werden.

ABER: Bevor das Projekt, das die Komponente verwendet kompiliert werden kann muss der Suchspfad in den Optionen um das Verzeichnis mit den *.dpk und *.pas oder *.dcu, *.dpc und *.bpl Dateien erweitert werden.
Sonst gibt es nur die Fehlermeldung, dass er die Datei MyRadioGroup nciht gefunden hat.

viel Spaß.

Ach ja zum Thema:
Code:
Schriebest Sie/Du so etwas als AuftragsArbeit? ...die Kosten?
Falls wir uns mal auf den Delphi-Tagen sehen, kannst du mir ja eine Cola ausgeben :thumb:

MaBuSE

MaBuSE 31. Mär 2014 13:53

AW: Komponente erstellen (TMyRadioGroup)
 
Das dürfte nicht nur mit Delphi XE sondern ab Delphi 2 funktionieren.

Jonas Shinaniganz 31. Mär 2014 15:01

AW: Komponente erstellen (TMyRadioGroup)
 
Nur weil du Spaß an etwas hast, bedeutet dies nicht, dass es unmoralisch ist dafür einen Obulus zu verlangen. Probleme sindgroß/klein, jedoch immer nur im Auge des Betrachters. Grade wenn etwas für dich kein Problem ist, stell eine Rechnung :D

Das waren jetzt vielleicht 3 Stunden Delphi und Artikel schönen :D Nichts gegen opensource aber ein bisschen Geld für die richtigen Menschen ist wirklich keine Schande...

edit: funktioniert übrigens ab Delphi 2

MaBuSE 31. Mär 2014 15:17

AW: Komponente erstellen (TMyRadioGroup)
 
Zitat:

Zitat von Jonas Shinaniganz (Beitrag 1254194)
Nur weil du Spaß an etwas hast, bedeutet dies nicht, dass es unmoralisch ist dafür einen Obulus zu verlangen. Probleme sindgroß/klein, jedoch immer nur im Auge des Betrachters. Grade wenn etwas für dich kein Problem ist, stell eine Rechnung :D

Aber das mach ich doch. Im Moment bezahlt mich mein Arbeitgeber.

Zitat:

Zitat von Jonas Shinaniganz (Beitrag 1254194)
Das waren jetzt vielleicht 3 Stunden Delphi und Artikel schönen :D Nichts gegen opensource aber ein bisschen Geld für die richtigen Menschen ist wirklich keine Schande...

Es waren ca. 10 min Delphi und 10 min Artikel in der DP erstellen. Also 20 Min. in der Summe.

Ich habe schon viel Wissen und Problemlösungen aus der DP entnommen (auch für die Firma), so dass mein Chef mir erlaubt auch ab und zu etwas Zeit zu investieren um anderen zu Helfen. Ich werde hier schon gut bezahlt, also warum soll ich dann wegen so einer Kleinigkeit Geld verlangen?

Das war auch nicht als Auftragsarbeit zu verstehen, sondern als Hilfestellung um die Komponente selbst weiter zu entwickeln.
Das ist auch der Grund, warum ich auf solche PNs nicht per PN, sondern öffentlich antworte. Das mache ich schon immer so. Ich entferne nur den Hinweis (Namen) auf den Fragesteller.
Der Fragesteller bekommt dann eine PN mit dem Link auf den Artikel.

So haben alle etwas davon.
Viele Grüße

ps: Abgesehen davon darf er mir ja auf den Delphi Tagen eine Cola ausgeben :stupid:

pps: ... und nochmal 10 min um deine Nachicht zu beantworten. Du darfst mir also auch auf den Delphi Tagen eine Cola ausgeben :P

Jonas Shinaniganz 2. Apr 2014 14:49

AW: Komponente erstellen (TMyRadioGroup)
 
Ich geb uns auf den Delphi-Tagen eine Cola aus :)

himitsu 2. Apr 2014 14:58

AW: Komponente erstellen (TMyRadioGroup)
 
Zitat:

Delphi-Quellcode:
//Eigenschaft im Objektinspektor

Im OI bringt die so erstmal nicht viel und das Beispiel würde auch ohne dieses Property funktionieren.

Wenn das OnClick via Event "ordentlich" extrern verfügbar sein soll, dann braucht man noch ein OnClickEvent in der Hauptkomponente, welches z.B. im ClearButtonClick aufgerufen wird.

Wenn der Button über den OI beinflussbar sein soll (z.B. Ändern der Caption),
dann muß diese Eigenschaft entweder ebenfalls als Property in die Hauptkomponente, wo die Getter und Setter den Wert dann an die Subkomponente weiterreicht (so kann man leicht und geziehlt nur einige Eigenschaften freigeben),
oder man muß dem OI sagen, daß er diese Komponente, welche er in dem Property vorfindet, ebenfalls verwalten soll (z.B. SetSubComponent).

MaBuSE 3. Apr 2014 10:01

AW: Komponente erstellen (TMyRadioGroup)
 
Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:

Zitat von himitsu (Beitrag 1254412)
Zitat:

Delphi-Quellcode:
//Eigenschaft im Objektinspektor

Im OI bringt die so erstmal nicht viel und das Beispiel würde auch ohne dieses Property funktionieren.

Jein. Das Beispiel funktioniert ohne die Zeile
Delphi-Quellcode:
property ClearButton: TButton read FClearButton;
.
Aber diese eine Zeile ist der einfachste Weg die Eigenschaften des Buttons zu ändern. z.B. Caption

Zitat:

Zitat von himitsu (Beitrag 1254412)
Wenn der Button über den OI beinflussbar sein soll (z.B. Ändern der Caption),
dann muß diese Eigenschaft entweder ebenfalls als Property in die Hauptkomponente, wo die Getter und Setter den Wert dann an die Subkomponente weiterreicht (so kann man leicht und geziehlt nur einige Eigenschaften freigeben),
oder man muß dem OI sagen, daß er diese Komponente, welche er in dem Property vorfindet, ebenfalls verwalten soll (z.B. SetSubComponent).

Es gibt viele Wege nach Rom.

mit der Zeile
Delphi-Quellcode:
property ClearButton: TButton read FClearButton;
wird eine Eigenschaft ClearButton erzeugt. Diese enthält alle Eigenschaften des Buttons. Man kann sie mit dem + vor der Eigenschaft aufklappen. (siehe Screenshots im Anhang)

Das ist der schnellste Weg alle Eigenschaften zur Verfügung zu stellen.
Sicherlich nicht der beste, aber ein möglicher.
Wenn Du verhindern willst, z.B.
Delphi-Quellcode:
MyRadioGroup1.ClearButton.Free;
aufzurufen, kommst Du um "deinen" Weg nicht herum.
Aber dann hätte ich mehr als 10 Min. für das Beispiel gebraucht.

Wie das geht habe ich ja schon im Forum geschrieben:
http://www.delphipraxis.net/67231-ei...tml#post452312

Zitat:

Zitat von himitsu (Beitrag 1254412)
Wenn das OnClick via Event "ordentlich" extrern verfügbar sein soll, dann braucht man noch ein OnClickEvent in der Hauptkomponente, welches z.B. im ClearButtonClick aufgerufen wird.

Stimmt.
Im Moment ist das OnClick Ereignis vorbelegt. Um es zu ändern müsste man im Quellcode z.B. folgendes schreiben:
Delphi-Quellcode:
...
  MyRadioGroup.ClearButton.OnClick := MeineNeueOnClickMethode;
...

MaBuSE 3. Apr 2014 10:11

AW: Komponente erstellen (TMyRadioGroup)
 
Zitat:

Zitat von MaBuSE (Beitrag 1254530)
Wie das geht habe ich ja schon im Forum geschrieben:
http://www.delphipraxis.net/67231-ei...tml#post452312

In dem Beitrag sind die Bilder falsch. Das ist wohl beim Umzug der DP auf das neue System passiert. Ist ja auch schon ein paar Jahre her. Ich habe die Moderatoren informiert und hoffe das sie die alten (richtigen) Bilder wieder einsetzen.

So sollte es aussehen:
Zitat:

Zitat von MaBuSE (Beitrag 452312)
...
Hier mal ein Beispiel zu einem "echtem" PropertyEditor:

Die Komponente TmyPersonComponent hat eine Eigenschaft Person die vom Typ TPerson ist.
Ich habe es mir einfach gemacht und TPerson vom Typ TPersistent abgeleitet. Im Prinzip geht auch TObject oder ein Record. Dann muß man aber die GetProperties Methode selbst implementieren, damit sich beim Drücken auf das [+] auch weitere Untereigenschaften öffnen.


Hier ist der Objektinspektor zu sehen.


Wenn man auf den [...] Button klickt öffnet sich der PropertyEditor.


Analog dazu kann man auch die Untereigenschaften von TPerson ändern :-)
...

:thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:21 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz