AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Komponente erstellen (TMyRadioGroup)

Ein Thema von MaBuSE · begonnen am 31. Mär 2014 · letzter Beitrag vom 3. Apr 2014
Antwort Antwort
Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.840 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Komponente erstellen (TMyRadioGroup)

  Alt 31. Mär 2014, 14:47
Delphi-Version: XE
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 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

MaBuSE
Angehängte Dateien
Dateityp: zip MyRadioGroup.zip (82,5 KB, 19x aufgerufen)
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.840 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Komponente erstellen (TMyRadioGroup)

  Alt 31. Mär 2014, 14:53
Das dürfte nicht nur mit Delphi XE sondern ab Delphi 2 funktionieren.
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat
Benutzerbild von Jonas Shinaniganz
Jonas Shinaniganz

Registriert seit: 30. Aug 2011
249 Beiträge
 
Delphi XE5 Ultimate
 
#3

AW: Komponente erstellen (TMyRadioGroup)

  Alt 31. Mär 2014, 16:01
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

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

edit: funktioniert übrigens ab Delphi 2
Die Leiter der Entwicklungsabteilung dreht total am Mausrad!
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.840 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Komponente erstellen (TMyRadioGroup)

  Alt 31. Mär 2014, 16:17
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
Aber das mach ich doch. Im Moment bezahlt mich mein Arbeitgeber.

Das waren jetzt vielleicht 3 Stunden Delphi und Artikel schönen 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

pps: ... und nochmal 10 min um deine Nachicht zu beantworten. Du darfst mir also auch auf den Delphi Tagen eine Cola ausgeben
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)

Geändert von MaBuSE (31. Mär 2014 um 16:23 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Jonas Shinaniganz
Jonas Shinaniganz

Registriert seit: 30. Aug 2011
249 Beiträge
 
Delphi XE5 Ultimate
 
#5

AW: Komponente erstellen (TMyRadioGroup)

  Alt 2. Apr 2014, 15:49
Ich geb uns auf den Delphi-Tagen eine Cola aus
Die Leiter der Entwicklungsabteilung dreht total am Mausrad!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#6

AW: Komponente erstellen (TMyRadioGroup)

  Alt 2. Apr 2014, 15:58
Zitat:
//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).
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 2. Apr 2014 um 16:00 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.840 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Komponente erstellen (TMyRadioGroup)

  Alt 3. Apr 2014, 11:01
Zitat:
//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 property ClearButton: TButton read FClearButton; .
Aber diese eine Zeile ist der einfachste Weg die Eigenschaften des Buttons zu ändern. z.B. Caption

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 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. 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

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;
...
Miniaturansicht angehängter Grafiken
delphi_oi_01.png   delphi_oi_02.png  
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.840 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Komponente erstellen (TMyRadioGroup)

  Alt 3. Apr 2014, 11:11
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:
...
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
...
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:59 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