Einzelnen Beitrag anzeigen

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
 
#16

Re: Eigene Komponente von TCustomControl > Eigenschaftsed

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