Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TPropertyEditor Frage (https://www.delphipraxis.net/77597-tpropertyeditor-frage.html)

Neutral General 21. Sep 2006 18:45


TPropertyEditor Frage
 
Hi,

Also ich hab zu dem Ding ne Frage die glaub ich noch nicht gefragt wurde :mrgreen:
Im OI steht meine Property so:

Zitat:

[+]MeineProp | TTyp
aber das soll keine Aufklapp-Property sein sondern so eine:

Zitat:

MeineProp | TTyp[...]
:mrgreen:

Delphi-Quellcode:
function TDPItemPropEdit.GetAttributes: TPropertyAttributes;
begin
  Result := [paDialog];
end;
müsste das nicht so gehn?
Was muss ich denn dafür alles machen? Also ich hab schon Quelltext im TPropertyEditor.Edit der einen Opendialog öffnet aber wenn ich auf das + drücke gibts nur ne Fehlermeldung...

Gruß
Neutral General

MaBuSE 21. Sep 2006 19:01

Re: TPropertyEditor Frage
 
siehe Onlinehilfe (F1 Taste)

Zitat:

TPropertyAttribute, TPropertyAttributes (Typen)

Die Typen TPropertyAttribute und TPropertyAttributes beschreiben eine Eigenschaft für den Objektinspektor.

Unit
DesignIntf

Delphi-Syntax:
Delphi-Quellcode:
type
  TPropertyAttribute = (paValueList, paSubProperties, paDialog, paMultiSelect, paAutoUpdate, paSortList, paReadOnly, paRevertable, paFullWidthName, paVolatileSubProperties, paVCL, paNotNestable);
  TPropertyAttributes = set of TPropertyAttribute;
Beschreibung
TPropertyAttributes besteht aus einer Menge von TPropertyAttribute-Werten. Die folgende Tabelle enthält die möglichen Werte für TPropertyAttribute:

Werte und Bedeutung
  • paValueList
    Der Eigenschaftseditor kann die Werte der Eigenschaft als Aufzählung zurückgeben. Wenn paValueList gewählt wird, muss die Methode GetValues so überschrieben werden, dass sie Aufzählungswerte übergibt. Außerdem bewirkt paValueList, dass im Objektinspektor neben der Eigenschaft ein Dropdown-Pfeil platziert wird.
  • paSortList
    Der Objektinspektor sortiert die Liste, die von GetValues zurückgeliefert wird.
  • paSubProperties
    Die Eigenschaft verfügt über Untereigenschaften, die unterhalb der aktuellen Eigenschaft stehen und mit einer Einrückung versehen werden. Wenn paSubProperties gewählt wird, muss die Eigenschaft GetProperties so überschrieben werden, dass Sie Untereigenschaften übergibt.
  • paDialog
    Die Methode Edit öffnet ein Dialogfeld. Außerdem wird im Objektinspektor neben der Eigenschaft eine Ellipsen-Schaltfläche (...) platziert.
  • paMultiSelect
    Die Eigenschaft kann auch dann angezeigt werden, wenn mehrere Komponenten ausgewählt sind.
  • paAutoUpdate
    Die Methode SetValue wird nach jeder Änderung im Editor aufgerufen und nicht erst dann, wenn die Änderung geprüft wurde.
  • paReadOnly
    Der Wert darf nicht geändert werden.
  • paRevertable
    Der Eigenschaftseditor kann die Eigenschaft wieder auf ihren ursprünglichen Wert zurücksetzen. Zu den Eigenschaften, die nicht wieder zurückgesetzt werden sollten, gehören verschachtelte Eigenschaften (z.B. Schriften) und Elemente von zusammengesetzten Eigenschaften (z.B. Mengenelementwerte).
  • paFullWidthName
    Der Eigenschaftswert erscheint nicht im Objektinspektor. Für die Anzeige des Eigenschaftsnamens wird die volle Breite (die Spalte Name und die Spalte Wert) verwendet.
  • paVolatileSubProperties
    Durch Änderungen des Eigenschaftswerts werden die Untereigenschaften neu berechnet (reduziert und wieder erweitert).
  • paVCL
    Der Eigenschaftseditor ist eine WinClx-Komponente (keine VisualCLX-Komponente).
  • paNotNestable
    Der Objektinspektor zeigt die Eigenschaft nicht an, wenn die Eigenschaften einer erweiterten Referenz dargestellt werden.


MaBuSE 21. Sep 2006 19:15

Re: TPropertyEditor Frage
 
Zitat:

Zitat von MaBuSE
siehe Onlinehilfe (F1 Taste)

bzw.
Siehe auch die Quelltexte der ToolsAPI
$(DELPHI)\Source\ToolsAPI (bei Delphi 7)

Dateien:
DesignEditors.pas und DesignIntf.pas

Die Default Editoren der DesignEditors sind den verschidenen Eigenschaften zugeordnet.
Du mußt also einen eigenen registrieren, um das Default Verhalten abzuschalten.

Wenn Du eine Klasse als property hast, (was bei Dir glaube ich der Fall ist)
dann ist automatisch der TClassProperty Editor aktiv.
Der implementiert die paSubProperties, die dafür verantwortlich ist.

Delphi-Quellcode:
{ ********************************************************************** }
{ Delphi and Kylix Cross-Platform Open Tools API                        }
{ Copyright (C) 1995, 2001 Borland Software Corporation                 }
{ All Rights Reserved.                                                  }
{ ********************************************************************** }
unit DesignEditors;

...

  TClassProperty = class(TPropertyEditor)
  public
    function GetAttributes: TPropertyAttributes; override;
    procedure GetProperties(Proc: TGetPropProc); override;
    function GetValue: string; override;
  end;

...

function TClassProperty.GetAttributes: TPropertyAttributes;
begin
  Result := [paMultiSelect, paSubProperties, paReadOnly];
end;

...
So ich hoffe das reicht Dir an Info...

MaBuSE 21. Sep 2006 19:24

Re: TPropertyEditor Frage
 
Zitat:

Zitat von Neutral General
müsste das nicht so gehn?
Was muss ich denn dafür alles machen? Also ich hab schon Quelltext im TPropertyEditor.Edit der einen Opendialog öffnet aber wenn ich auf das + drücke gibts nur ne Fehlermeldung...

Hast Du auch mit RegisterPropertyEditor deinen Editor aktiviert?

z.B.
Delphi-Quellcode:
RegisterPropertyEditor(TypeInfo(TTyp), nil, '', TDPItemPropEdit);
Siehe Delphi-Referenz durchsuchenRegisterPropertyEditor

Neutral General 21. Sep 2006 19:35

Re: TPropertyEditor Frage
 
Zitat:

Zitat von MaBuSE
Zitat:

Zitat von Neutral General
müsste das nicht so gehn?
Was muss ich denn dafür alles machen? Also ich hab schon Quelltext im TPropertyEditor.Edit der einen Opendialog öffnet aber wenn ich auf das + drücke gibts nur ne Fehlermeldung...

Hast Du auch mit RegisterPropertyEditor deinen Editor aktiviert?

z.B.
Delphi-Quellcode:
RegisterPropertyEditor(TypeInfo(TTyp), nil, '', TDPItemPropEdit);
Siehe Delphi-Referenz durchsuchenRegisterPropertyEditor

Ja hab ich.. Aber ehm ich glaube du hast mir genau das Gegenteil gezeigt...
das [+] hab ich ja.. aber das will ich nicht :|
Ich will das da die drei Pünktchen sind wie bei TStrings z.B und das sich dann mein Formular öffnet.. aber ich kann da machen was ich will... es geht nicht -.-

Neutral General 22. Sep 2006 14:20

Re: TPropertyEditor Frage
 
Mhh keiner da der mir grad helfen kann ? :|

MaBuSE 22. Sep 2006 16:58

Re: TPropertyEditor Frage
 
Zitat:

Zitat von Neutral General
Mhh keiner da der mir grad helfen kann ? :|

Warum, steht doch alles oben.
Weitere Infos und sehr schöne Beispiele (z.B. von mir) findest Du in der DP -> suchen.

z.B. http://www.delphipraxis.net/internal...=531454#531454

Aber ich will ja mal nicht so sein ;-)

Hier ein Beispiel, das alle Fragen beantworten sollte.
(Habe keine Kommentare eingefügt, sollte aber zu verstehen sein)

Die 2 Dateien in ein Package packen und installieren.

TPropEditorComponent hat 3 Eigenschaften des selben Typs TMyProperty
aber drei verschiedene Arten die im Objektinspecktor anzuzeigen.

Im Quellcode lässt sich das ganze natürlich gleich ansprechen. Die Property Editoren sind ja nur für die GUI.
Delphi-Quellcode:
PropEditorComponent1.MyPropertyEins.SuperDuper := 'XXX';
PropEditorComponent1.MyPropertyZwei.SuperDuper := 'XXX';
PropEditorComponent1.MyPropertyDrei.SuperDuper := 'XXX';
Delphi-Quellcode:
unit PropEditorComponent;

interface

uses
  SysUtils, Classes;

type
  TMyProperty = class(TPersistent)
  private
    FSuperDuper: string;
    FZahl: Integer;
  published
    property SuperDuper: string read FSuperDuper write FSuperDuper;
    property Zahl: Integer read FZahl write FZahl;
  end;

  TMyPropertyEins = class(TMyProperty);
  TMyPropertyZwei = class(TMyProperty);
  TMyPropertyDrei = class(TMyProperty);

  TPropEditorComponent = class(TComponent)
  private
    { Private-Deklarationen }
    FMyProperty1: TMyPropertyEins;
    FMyProperty2: TMyPropertyZwei;
    FMyProperty3: TMyPropertyDrei;
  protected
    { Protected-Deklarationen }
  public
    { Public-Deklarationen }
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    { Published-Deklarationen }
    property MyPropertyEins: TMyPropertyEins read FMyProperty1 write FMyProperty1;
    property MyPropertyZwei: TMyPropertyZwei read FMyProperty2 write FMyProperty2;
    property MyPropertyDrei: TMyPropertyDrei read FMyProperty3 write FMyProperty3;
  end;

implementation

{ TPropEditorComponent }

constructor TPropEditorComponent.Create(AOwner: TComponent);
begin
  inherited;
  FMyProperty1 := TMyPropertyEins.Create;
  FMyProperty1.SuperDuper := 'DP';
  FMyProperty1.Zahl := 2006;
  FMyProperty2 := TMyPropertyZwei.Create;
  FMyProperty2.SuperDuper := 'DP';
  FMyProperty2.Zahl := 2006;
  FMyProperty3 := TMyPropertyDrei.Create;
  FMyProperty3.SuperDuper := 'DP';
  FMyProperty3.Zahl := 2006;
end;

destructor TPropEditorComponent.Destroy;
begin
  FMyProperty3.Free;
  FMyProperty2.Free;
  FMyProperty1.Free;
  inherited;
end;

end.
und

Delphi-Quellcode:
unit PropEditorComponent_dsgn;

interface

uses
  SysUtils, Classes, Dialogs, PropEditorComponent, DesignIntf, DesignEditors;

type
  TMyPropertyEditorEins = class(TClassProperty)
    function GetAttributes: TPropertyAttributes; override;
    function GetValue: string; override;
  end;

  TMyPropertyEditorZwei = class(TClassProperty)
    procedure Edit; override;
    function GetAttributes: TPropertyAttributes; override;
    function GetValue: string; override;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Beispiele', [TPropEditorComponent]);
  RegisterPropertyEditor(TypeInfo(TMyPropertyEins), nil, '', TMyPropertyEditorEins);
  RegisterPropertyEditor(TypeInfo(TMyPropertyZwei), nil, '', TMyPropertyEditorZwei);
end;

{ TMyPropertyEditor1 }

function TMyPropertyEditorEins.GetAttributes: TPropertyAttributes;
begin
  Result := [];
end;

function TMyPropertyEditorEins.GetValue: string;
var
  s: string;
begin
  // Nein, so macht man das besser nicht :-), ist ja nur zur Demo
  s := 'SuperDuper="'+TMyProperty(GetOrdValueAt(0)).SuperDuper+'", Zahl='+IntToStr(TMyProperty(GetOrdValueAt(0)).Zahl);
  FmtStr(Result, '(%s)', [s]);
end;


{ TMyPropertyEditorZwei }

procedure TMyPropertyEditorZwei.Edit;
begin
  // Nein, so macht man das besser nicht :-), ist ja nur zur Demo
  ShowMessage('SuperDuper="'+TMyProperty(GetOrdValueAt(0)).SuperDuper+'", Zahl='+IntToStr(TMyProperty(GetOrdValueAt(0)).Zahl));
end;

function TMyPropertyEditorZwei.GetAttributes: TPropertyAttributes;
begin
  Result := [paDialog];
end;

function TMyPropertyEditorZwei.GetValue: string;
begin
  FmtStr(Result, '(%s)', ['Abrakadabra']);
end;

end.

Neutral General 22. Sep 2006 17:06

Re: TPropertyEditor Frage
 
Habs soweit geschafft aber wie ich sehe hast du Ahnung davon deswegen leite ich dich grad mal weiter :mrgreen:
:arrow: Neues Problem^^

Gruß
Neutral General


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

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