Zitat von
cherry:
Das ist ja einfach wiedermal genial...
Danke
Zitat von
PeteSky:
Wirklich tolles Beispiel.
Danke
Zitat von
PeteSky:
Aber wie kann ich in meiner eigenen Komponente den StandardPropertyEditor benutzen?
So das neben meinen Strings im
OI dei drei Punkte erscheinen [...] ?
Ich verstehe diese Frage nicht ganz.
Die StandardPropertyEditoren werden automatisch verwendet.
Ein Eigenschaft vom Typ TColor bekommt automatisch die [...] um den Farbdialog aufzurufen.
Es gibt auch PropertyEditoren die z.B. an allen eigenschaften vom Typ string hängen und den Namen Caption tragen. Diese sind aber keine StandardPropertyEditoren, sondern einzeln installiert (und vorher programmiert .-)) werden.
Die Drei Punkte bekommt man wenn man in dem Property Editor die GetAttributes Methode implementiert und im ResultSet paDialog zurückgibt. (siehe obiges Beispiel von mir)
Wird der [...] Button gedrückt, so wird die (hoffentlich implementierte) Edit Methode aufgerufen.
Das wars eigentlich.
Hier ein kleines Beispiel, das der Tag Eigenschaft aller Komponenten einen PropertyEditor zuweist. Zusätzlich habe ich noch gezeigt, wie einfach man auch auf mehrere markierte Komponenten reagieren kann.
Also einfach mal instrallieren und ein TLabel, TEdit und TButton aufs Form alle 3 Markieren und dann in der Tag Eigenschaft auf den [...] Button klicken.
In der EditBox erscheint dann der Text:
Zitat:
Folgende Eigenschaften setzen:
Label1.Tag
Edit1.Tag
Button1.Tag
Da auch die Anzeige des Eigenschaftsnamens zur Laufzeit ermittelt wird, kann der PropertyEditor auch anderen Integer Eigenschaften zugewiesen werden.
Delphi-Quellcode:
procedure Register;
begin
// damit ist der PropertyEditor allen Eingenschaften vom Typ Integer zugewiesen
RegisterPropertyEditor(TypeInfo(Integer), nil, '', TmyIntegerPropEditor);
end;
Delphi-Quellcode:
///////////////////////////////////////////////////////////////////////////////
// PropertyEditor für Integer
//
// Beispielprogramm zur Komponentenerstellung
//
// Folgende Dinge sind zu sehen:
// - PropertyEditor für Tag Eigenschaft aller Komponenten
// - auf mehrere gleichzeitig markierte Komponenten reagieren :-)
//
// Dieser Quelltext liegt auch auf [url]www.delphipraxis.net[/url]
// ( [url]http://www.delphipraxis.net/topic80394_eigene+komponente+von+tcustomcontrol+eigenschaftseditor.html[/url] )
//
///////////////////////////////////////////////////////////////////////////////
// Das Programm ist Freeware und darf beliebig benutzt und erweitert werden.
// Es wäre nett, wenn dann auch der geänderte Quelltext in obige URL-Adresse
// gesendet wird. Dann haben alle was davon.
// Es wäre auch nett wenn mein (unser) Name in den Dateien enthalten bleibt.
// Das Programm wird von Ihnen auf eigenes Risiko eingesetzt. Ich übernehme
// keine Haftung für Schäden die durch das Programm oder die Benutzung des
// Programms entstanden sind bzw. entstehen.
///////////////////////////////////////////////////////////////////////////////
// (C) 2005, MaBuSE, member of DelphiPraxis.net
///////////////////////////////////////////////////////////////////////////////
// ReleaseNotes:
// v1.0 - 18.04.2006 - MaBuSE: Erste Version war in 5 min programmiert
///////////////////////////////////////////////////////////////////////////////
unit integer_dsgn;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, DesignIntf, DesignEditors;
type
TmyIntegerPropEditor =
class(TIntegerProperty)
public
// hier wird das Formular aufgerufen
procedure Edit;
override;
// hier wird bestimmt, die das Property im Objektinspektor angezeigt wird
function GetAttributes: TPropertyAttributes;
override;
end;
procedure Register;
implementation
procedure Register;
begin
// Der PropertyEditor TmyIntegerPropEditor (4. Parameter)
// wird für alle Properties:
// - vom Typ Integer (1. Parameter)
// - für alle Komponenten (2. Parameter)
// - mit dem Namen 'Tag'
// in der Delphi IDE verwendet.
// Wenn als 2. Parameter nil übergeben wird, dann wird der PropertyEditor von
// allen Komponenten verwendet.
// Wenn als 3. Parameter '' übergeben wird, dann wird der PropertyEditor von
// allen Eigenschaften des Typs Integer verwendet.
RegisterPropertyEditor(TypeInfo(Integer),
nil, '
Tag', TmyIntegerPropEditor);
end;
{ TmyIntegerPropEditor }
procedure TmyIntegerPropEditor.Edit;
var
i: Integer;
s:
string;
cc:
string;
begin
inherited;
// Wenn gleichzeitig mehrere Komponenten markiert sind,
// alle Komponenten im Prompt Text des Eingabedialogs anzeigen
if PropCount > 1
then
begin
cc := '
Folgende Eigenschaften setzen:'+#13;
end
else
begin
cc := '
Folgende Eigenschaft setzen: ';
end;
for i := 0
to PropCount - 1
do
begin
// Für jede markierte Komponente
cc :=
cc + GetComponent(i).GetNamePath + '
.' + GetName + #13;
end;
// aktuellen Wert in String s übernehmen
s := IntToStr(GetOrdValue);
// den EingabeDialog mit s aufrufen
if InputQuery('
myIntegerPropertyEditor',
cc, s)
then
begin
// s in Integer umwandeln und Eigenschaft setzen
SetOrdValue(StrToInt(s));
end;
end;
function TmyIntegerPropEditor.GetAttributes: TPropertyAttributes;
begin
// [...] Button anzeigen
Result :=
inherited GetAttributes + [paDialog];
end;
end.