![]() |
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:
Dann eine Instanz davon erzeugt und diese mit selectedObject ans PropertyGrid geklatscht.
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; 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 :) |
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. ;)
|
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 |
Re: Verwenden des PropertyGrids?
Zitat:
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. 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. |
Re: Verwenden des PropertyGrids?
Zitat:
Zitat:
![]() Bleibt nur noch die Frage, ob es .NET 1.1 tauglich ist ;). Werde ich morgen mal ausprobieren. Zitat:
|
Re: Verwenden des PropertyGrids?
Sooo. Ich probiere schon den ganzen Morgen am CustomPropertyGrid von
![]() 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:
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).
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; 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