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/)
-   -   Prism Verwenden des PropertyGrids? (https://www.delphipraxis.net/86190-verwenden-des-propertygrids.html)

Alexander 10. Feb 2007 17:46


Verwenden des PropertyGrids?
 
Hallo DPler :).
Ich plage mich gerade mit dem eigentlich genialen Property-Grid herum, nur funktioniert das nicht so wie gewollt :sad:.
Also ich habe ne eigene kleine Klasse:
Delphi-Quellcode:
  TSetting = class
  private
    FVarName : String;
    FDefaultText : String;
    FTitle : String;
    FDescription : String;
    FValueLabel : String; // Im SQL-Text enthaltender Text

    procedure setVarName(s : String);
    function getVarName() : String;
    procedure setDefaultText(s : String);
    function getDefaultText() : String;
    procedure setTitle(s : String);
    function getTitle() : String;
    procedure setDescription(s : String);
    function getDescription() : String;
    procedure setValueLabel(s : String);
    function getValueLabel() : String;
  public
    [System.ComponentModel.Browsable(true)] // Description('bla'),
    property VarName : String read getVarName write setVarName;

    [System.ComponentModel.Browsable(true)]
    property DefaultText : String read getDefaultText write setDefaultText;

    [System.ComponentModel.Browsable(true)]
    property Title : String read getTitle write setTitle;

    [System.ComponentModel.Browsable(true)]
    property Description : String read getDescription write setDescription;

    [System.ComponentModel.Browsable(true)]
    property ValueLabel : String read getValueLabel write setValueLabel;
  end;
Dann eine Instanz davon erzeugt und diese mit selectedObject ans PropertyGrid geklatscht.
Ich dachte eigentlich das wäre es. Nur werden nicht alle Properties angezeigt :shocked:
Das beste ist noch, dass je nach dem wie ich die Properties nenne, immer unterschiedliche nicht angezeigt werden.

Wahrscheinlich mache ich nur eine Kleinigkeit falsch. Sehr merkwürdig das ganze :pale:

Als nächstes würde mich interessieren, wie ich den Properties zur Laufzeit andere Namen/Texte und Beschreibungen gebe.
Zur Programmierzeit kann ich das ja zum Beispiel einfach ein Description in die eckigen Klammern setzen (wodurch übrigens auch immer mal wieder ein paar verschwinden :gruebel: ).

Zu guter Letzt wäre es noch wichtig zu wissen, wie ich mehrere Instanzen von Tsetting in das gleiche PropertyGrid werfen kann.

Gerade bei dem letzten Punkt bin ich am zweifeln, ob das überhaupt geht.
Aber erstmal das komische Verhalten in den Griff bekommen (das Problem mit dem merkwürdigen Verhalten von CDATA besteht ja auch noch :wall: )

Vielen Dank für eure Bemühungen :)

Elvis 10. Feb 2007 17:59

Re: Verwenden des PropertyGrids?
 
In den Dark ages, in denen ich mich selbst noch mit DfN rum geärgert habe, musste ich feststellen, dass dir immer noch published aufgezwungen wird. ;)

Alexander 10. Feb 2007 19:52

Re: Verwenden des PropertyGrids?
 
Danke Robert :). Das Verhalten mit Public ist aber dennoch mehr als sonderbar.
Was würde ich nur ohne Dich machen :angel2:

Weißt du auch, ob man mehrere Instanzen einer Klasse gleichzeitig in das Grid schmeißen kann?
Ich habe dies bezüglich leider noch nichts im Netz finden können :sad:.
Und den Titel links möchte ich wohl auch noch gerne verändern können. Das scheint aber zur Laufzeit nicht wirklich machbar zu sein, oder doch?

PS: Hast du eigentlich noch eine Idee für mein anderes Problem? Ich wollte es morgen noch mal komplett mit Chrome ausprobieren. Vllt. ist es ja ne Delphi Macke

Elvis 10. Feb 2007 20:07

Re: Verwenden des PropertyGrids?
 
Zitat:

Zitat von Alexander
Was würde ich nur ohne Dich machen :angel2:

Wahrscheinlich würdest du kein .Net benutzen und somit auch keine Probleme mit DfN haben. Aber der Idee folge ich jetzt lieber nicht zu weit. :mrgreen:
Zitat:

Weißt du auch, ob man mehrere Instanzen einer Klasse gleichzeitig in das Grid schmeißen kann?
.Net 1.1 ist defintiv zu lange für mich her um hier irgendwas genaues sagen zu können, und es ist auch schon eine Weile her dass ich mit dem PropertyGrid en detail gearbeitet habe.
Was ich dir aber sagen kann ist, dass du praktisch alles im PG anpassen kannst und vieles sogar sehr einfach durch TypeDesigner und/oder TypeEditoren.
Ob es auch in 1.1 geht kann ich dir nicht sagen, da kennt sich TUFKAPL besser aus. ;)
Dieses genaue Ziel würde sich aber einfach durch eine Komposition von den Instanzen als Eigenschaften einer weiteren Klasse sehr easy lösen lassen.

Alexander 10. Feb 2007 20:35

Re: Verwenden des PropertyGrids?
 
Zitat:

Zitat von Elvis
Zitat:

Zitat von Alexander
Was würde ich nur ohne Dich machen :angel2:

Wahrscheinlich würdest du kein .Net benutzen und somit auch keine Probleme mit DfN haben. Aber der Idee folge ich jetzt lieber nicht zu weit. :mrgreen:

.NET wohl schon, aber wohl bei den Problemen noch mehr verzweifeln :mrgreen:.

Zitat:

Was ich dir aber sagen kann ist, dass du praktisch alles im PG anpassen kannst und vieles sogar sehr einfach durch TypeDesigner und/oder TypeEditoren.
Ich habe hier gerade, was interessantes gefunden:
http://www.codeproject.com/csharp/wd...yGridUtils.asp
Bleibt nur noch die Frage, ob es .NET 1.1 tauglich ist ;). Werde ich morgen mal ausprobieren.

Zitat:

Dieses genaue Ziel würde sich aber einfach durch eine Komposition von den Instanzen als Eigenschaften einer weiteren Klasse sehr easy lösen lassen.
Schon, aber es sind stehts eine unterschiedliche Anzahl an Instanzen. Daher ist es wohl nicht so einfach möglich. Oder habe ich die falsch verstanden?

Alexander 11. Feb 2007 11:46

Re: Verwenden des PropertyGrids?
 
Sooo. Ich probiere schon den ganzen Morgen am CustomPropertyGrid von CodeProject.com herum.
Leider kann ich die DisplayName Attribute noch immer nicht ändern :sad:.

Irgendetwas scheine ich falsch zu machen. Dabei dachte ich, dass ich den C# Code auf CodeProject vollständig übersetzt habe.

Hier mal mein Code:
Delphi-Quellcode:
  TSetting = class
  private
    FVarName : String;
    FDefaultText : String;
    FDefaultTextDisplayName : String;
    FTitle : String;
    FDescription : String;
    FValueLabel : String; // Im SQL-Text enthaltender Text

    procedure setVarName(s : String);
    function getVarName() : String;
    procedure setDefaultText(s : String);
    function getDefaultText() : String;
    procedure setTitle(s : String);
    function getTitle() : String;
    procedure setDescription(s : String);
    function getDescription() : String;
    procedure setValueLabel(s : String);
    function getValueLabel() : String;

    function getDefaultTextDisplayName() : String;
    procedure setDefaultTextDisplayName(s : String);

  published
    [Description('VarName'), System.ComponentModel.Browsable(true), DisplayName('Hallo')]
    property VarName : String read getVarName write setVarName;
//////////////////////////////////////
    [PropertyAttributesProvider('DynamicPropertyAttributesProvider'), System.ComponentModel.Browsable(true)]
    property DefaultText : String read getDefaultText write setDefaultText;

    [System.ComponentModel.Browsable(true)]
    property defaultTextDisplayName : String read getDefaultTextDisplayName write setDefaultTextDisplayName;
////////////////////////////////////////
    [System.ComponentModel.Browsable(true)]
    property Title : String read getTitle write setTitle;

    [System.ComponentModel.Browsable(true)]
    property Description : String read getDescription write setDescription;

    [System.ComponentModel.Browsable(true)]
    property ValueLabel : String read getValueLabel write setValueLabel;
  public
    procedure DynamicPropertyAttributesProvider(var attributes : PropertyAttributes);
  end;
{...}
procedure TSetting.DynamicPropertyAttributesProvider(var attributes : PropertyAttributes);
begin
  attributes.DisplayName := defaultTextDisplayName;
//  attributes.IsReadOnly := dynamicPropertyIsReadOnly;
//  attributes.IsBrowsable := dynamicPropertyIsVisible;
end;


{...}
{PropertyGrid erzeugen usw.}
constructor TSqlVarFrm.Create;
begin
  inherited Create;
  InitializeComponent;
  propertyGrid := FormsUtils.CustomPropertyGrid.Create;
 // statusBarEx := FormsUtils.StatusBarEx.Create;

  propertyGrid.CommandsVisibleIfAvailable := true;
  propertyGrid.ExpandOnTab := false;
  propertyGrid.LargeButtons := false;
  propertyGrid.LineColor := System.Drawing.SystemColors.ScrollBar;
  propertyGrid.Location := System.Drawing.Point.Create(0, 48);
  propertyGrid.Name := 'propertyGrid';
  propertyGrid.Size := System.Drawing.Size.Create(456, 272);
  propertyGrid.TabIndex := 3;
  propertyGrid.Text := 'customPropertyGrid1';
  propertyGrid.ViewBackColor := System.Drawing.SystemColors.Window;
  propertyGrid.ViewForeColor := System.Drawing.SystemColors.WindowText;
  propertyGrid.Dock := DockStyle.Fill;
  propertyGrid.Parent := self;

  FSqlVar := TSetting.Create;
  FSqlVar.VarName := 'Var';
  FSqlVar.DefaultText := 'Default';
  FSqlVar.Title := 'Titel';
  FSqlVar.Description := 'Desc';
  FSqlVar.ValueLabel := 'Label';
  FSqlVar.defaultTextDisplayName := 'Hallo Welt';

  PropertyGrid.SelectedObject := FSqlVar;
  propertyGrid.Refresh;
defaultTextDisplayName taucht zwar im PropertyGrid auf. Ich setze es ja im Code direkt auf einen Namen. Dann sollte dieser ja eigentlich als DisplayName von DefaultText auch direkt übernommen werden. Wenn ich das (wie in der Demo des Projektes auf CodeProject.com) zur Laufzeit verändere, dann klappt es auch nicht (auch mit einem Refresh danach nicht).

Ein direktes DisplayName-Attribut im Code in der TSettings-Klasse zeigt im Übrigen auch keine Wirkung.

Was habe ich nun wieder falsch gemacht? :gruebel:.
Wahrscheinlich läuft ja beim PropertyAttributesProvider irgendwas falsch (an der markierten Stelle im Code).
Oder doch wieder ne Delphi Eigenart?


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:29 Uhr.

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