| Autor |
Beitrag |
KainPlan
      
Beiträge: 27
Vista Buisness, Windows 7
C/C++, C#, PHP...
|
Verfasst: Do 22.01.09 22:37
Hallo ich bastel gerade an einem Pluginsystem für mein Program DHead ( www.m-code.de/wordpress).
Nur stecke ich gerade irgendwie fest! Ich hab keine Ahnung wie weiter, gerade. Ich hab hier mal einen Prototypen einer Klasse von der die Eigenschaften-Klassen der Plugins erben sollen.
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27:
| public class PlgProperty : Object { public string Name { get; set; } public Plugin Plugin { get; set; } public event PlgPropertyChangeEventHandler PropertyChanged = null;
public PlgProperty(Plugin plg) { Plugin = plg; } } |
So wenn ich jetzt erbe und die erbende Klasse einem PropertyGrid übergebe werden aber auch wirklich ALLE Eigenschaften angezeigt. Wie z.B. Plugin.
Ich möchte aber das NUR die Eigenschaften übergeben werden von denen ich das auch will. Wie mach ich das?
Es könnt ja auch sein das ich ein Formular erstelle und das einem PropertyGrid übergeben möchte, aber nicht will das da alle Einstellungen erscheinen... mich macht das gerade echt wahnsinnig.. sry
Bin hier irgendwie schon voll lange registriert, seltsam.. ^^ Moderiert von Christian S.: Topic aus C# - Die Sprache verschoben am Do 22.01.2009 um 23:15
|
|
jaenicke
      
Beiträge: 19340
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 22.01.09 23:10
Ich bin mir nicht sicher, weil ich ein PropertyGrid nicht kenne, aber ginge das nicht mit einem Interface?
Du deklarierst ein Interface mit den entsprechenden Methoden, deine Klasse implementiert dieses Interface und dann übergibst du die Klasse als Klasse vom Typ des Interfaces an das PropertyGrid. Dieses kennt also dann nicht mehr als das, was im Interface deklariert ist, obwohl die Klasse eigentlich mehr deklariert.
Keine Ahnung, ob es so geht, aber logisch fände ich das so schon. 
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Do 22.01.09 23:14
Hi!
Schau Dir mal das BrowsableAttribute an
Grüße
Christian
//Edit: Müssen die denn eigentlich alle Public sein? 
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
jaenicke
      
Beiträge: 19340
Erhaltene Danke: 1752
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 22.01.09 23:20
Ah, jetzt hab ich auch gesehen was das PropertyGrid ist, das aus der IDE selbst, ok  .
Und da gibts ja auch eine sehr gute Beschreibung des gesamten Controls mit C# Beispielen bei MS:
msdn.microsoft.com/d...302326.aspx#ID0EQDAC
Das muss ich mir merken. 
|
|
KainPlan 
      
Beiträge: 27
Vista Buisness, Windows 7
C/C++, C#, PHP...
|
Verfasst: Do 22.01.09 23:43
Sehr genial Christian! [Browsable(false)] vor das Member setzen und schwubbs weg ists  Wunderbar. Danke für die schnelle hilfe!!
ABER, was ist denn jetzt wenn ich Wie oben beschrieben von einer Control oder so Erbe? Wie blende ich die geerbten Eigenschaften aus? Das muss doch auch gehen oder?
EDIT:
@ jaenicke: das mit dem interface wäre ja dann sinn frei weil ich will ja das die erbende Klasse erkannt wird und deren Eigenschaften sollen ja im PropertyGrid angezeigt werden. Ein bisschen konfus das ganze ^^, aber es wird schon.
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Do 22.01.09 23:48
Ich erinnere mich duster, dass Attribute standardmäßig mitvererbt werden. Klappt das hier nicht? Evtl. hab ich's auch falsch im Gedächtnis.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
KainPlan 
      
Beiträge: 27
Vista Buisness, Windows 7
C/C++, C#, PHP...
|
Verfasst: Do 22.01.09 23:53
sek. bildlich ists glaube ich besser ^^
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| public class Form { public ICH_WILL_NICHT_ANGEZEIGT_WERDEN { get; set; } }
public class Dialog : Form { } |
wenn ich Dialog jetzt übergebe wird das Member der Form Klasse trozdem angezeigt. Da ich ja den Code in der Form nicht ändern kann / will, frag ich mich jetzt wie ich das unterbinden kann?!
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Fr 23.01.09 00:13
Hm. Du müsstest alle unliebsamen Dinge überschreiben und dann das Attribut "anheften".
Vielleicht ist für Dich der umgekehrte Weg praktikabler: Hefte allem, was Du zeigen willst, ein Attribut an und filtere dann das PropertyGrid nach diesem Attribut:
Delphi Prism Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| type ShowMeAttribute = public class(System.Attribute); MainForm = partial class(System.Windows.Forms.Form) public [ShowMe] property ForeColor: System.Drawing.Color read write; override; end;
method MainForm.MainForm_Load(sender: System.Object; e: System.EventArgs); begin propertyGrid1.BrowsableAttributes := new AttributeCollection(new ShowMeAttribute); propertyGrid1.SelectedObject := self; end; |
Lass Dich nicht von der unterschiedlichen Syntax abschrecken, .NET ist .NET
//Edit: Was mir gerade klar macht, dass das hier die falsche Sparte ist *schieb*
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
KainPlan 
      
Beiträge: 27
Vista Buisness, Windows 7
C/C++, C#, PHP...
|
Verfasst: Fr 23.01.09 01:33
Ah,- okay... ich werd das mal ausprobiern und mich dann wieder hier melden
Achso und sry das ich das ins falsche Forum gepostet hab 
|
|
KainPlan 
      
Beiträge: 27
Vista Buisness, Windows 7
C/C++, C#, PHP...
|
Verfasst: Fr 23.01.09 02:07
Geil! Jetzt kann ich das ganze Pluginsystem überarbeiten... hmpf. Das was du vorgeschlagen hast ist genau das richtige für mich.
Hier das ganze nochmal in C#:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41:
| [global::System.AttributeUsage(AttributeTargets.All, Inherited = false, AllowMultiple = true)] public sealed class PluginAttribute : Attribute { }
public partial class DriveControl : Plugin { private DriveInfo[] _LastDrives = null;
public DriveItemData ButtonLayoutHD { set { _buttonLayoutHD = value; } get { return _buttonLayoutHD; } } public List<HDItem> HDItems { get { return _hdItems; } set { _hdItems = value; } }
[PluginAttribute] public int DriveCheckIntervall { get { return _tCheckDrives != null ? _tCheckDrives.Interval : -1; } set { _tCheckDrives.Interval = value; } } [PluginAttribute] public bool DriveCheckEnabled { get { return _tCheckDrives != null ? _tCheckDrives.Enabled : false; } set { _tCheckDrives.Enabled = value; } } . . .
PropertyGrid.BrowsableAttributes = new AttributeCollection( new PluginAttribute() ); |
Hehe jetzt hab ich aber noch was, scheinst ja recht fit zu sein ^^.
Wie sucht man nach diesen Attributen selber? Das muss ja auch gehen. Ich nerv dann auch nicht mehr, versprochen! 
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Fr 23.01.09 09:57
Was meinst Du, wie "sucht" man danach? 
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
KainPlan 
      
Beiträge: 27
Vista Buisness, Windows 7
C/C++, C#, PHP...
|
Verfasst: Fr 23.01.09 13:18
Habe ich schon eine Lösung für die Frage gefunden: (EDIT: Harkan kommt zur Schule mit BMW.. man man echt ey..  )
So sucht man nach Membern in einer Klasse:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| Form fm = new Form(); string text = ""; Type type = fm.GetType(); System.Reflection.MemberInfo[] minfos = type.FindMembers(System.Reflection.MemberTypes.All, System.Reflection.BindingFlags.Public, null, null); foreach (System.Reflection.MemberInfo minf in minfos) { text += string.Format("({0}) {1}.{2}\r\n",minf.DeclaringType.FullName, minf.ReflectedType.FullName, minf.Name); }
MessageBox.Show(text); |
|
|