Autor Beitrag
KainPlan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27

Vista Buisness, Windows 7
C/C++, C#, PHP...
BeitragVerfasst: 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.

ausblenden 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:
    /// <summary>
    /// Von dieser Klasse müssen die Eigenschaften eines Plugins erben.
    /// </summary>
    public class PlgProperty : Object
    {
        /// <summary>
        /// ... *hust*
        /// </summary>
        public string Name { get; set; }
        /// <summary>
        /// Das übergeordnete Plugin.
        /// </summary>
        public Plugin Plugin { get; set; }
        /// <summary>
        /// Tritt auf wenn der User Eigenschaften ändern möchte.
        /// </summary>
        public event PlgPropertyChangeEventHandler PropertyChanged = null;

        /// <summary>
        /// Konsturktor der Klasse.
        /// </summary>
        /// <param name="plg"> Gibt das Plugin an dessen Eigenschaften hier gespiegelt werden. </param>
        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 user profile iconChristian S.: Topic aus C# - Die Sprache verschoben am Do 22.01.2009 um 23:15
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19340
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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? :gruebel:

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19340
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 22.01.09 23:20 
Ah, jetzt hab ich auch gesehen was das PropertyGrid ist, das aus der IDE selbst, ok :idea: .

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. :D
KainPlan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27

Vista Buisness, Windows 7
C/C++, C#, PHP...
BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27

Vista Buisness, Windows 7
C/C++, C#, PHP...
BeitragVerfasst: Do 22.01.09 23:53 
sek. bildlich ists glaube ich besser ^^

ausblenden 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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:

ausblenden 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); //eigene Attribut-Klasse erstellen

  MainForm = partial class(System.Windows.Forms.Form)
  (* ... *)
  public
    [ShowMe]
    property ForeColor: System.Drawing.Color read writeoverride//Eigenschaft aus der Form-Klasse überschreiben, ohne wirklcih was zu ändern. Bekommt das Attribut "ShowMe"
  (* ... *)
  end;

(* ... *)

method MainForm.MainForm_Load(sender: System.Object; e: System.EventArgs);
begin
  propertyGrid1.BrowsableAttributes := new AttributeCollection(new ShowMeAttribute); //nur anzeigen, was mit dem "ShowMe"-Attribut versehen ist
  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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27

Vista Buisness, Windows 7
C/C++, C#, PHP...
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27

Vista Buisness, Windows 7
C/C++, C#, PHP...
BeitragVerfasst: 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#:

ausblenden volle Höhe 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:
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 { /* No need ATM. */ }

    public partial class DriveControl : Plugin
    {
        private DriveInfo[] _LastDrives = null;

        public DriveItemData ButtonLayoutHD // WIRD NICHT GELISTET
        {
            set { _buttonLayoutHD = value; }
            get { return _buttonLayoutHD; }
        }
        public List<HDItem> HDItems // WIRD NICHT GELISTET
        {
            get { return _hdItems; }
            set { _hdItems = value; }
        }

        // Browsable's
        [PluginAttribute]
        public int DriveCheckIntervall // WIRD GELISTET..
        {
            get { return _tCheckDrives != null ? _tCheckDrives.Interval : -1; }
            set { _tCheckDrives.Interval = value; }
        }
        [PluginAttribute]
        public bool DriveCheckEnabled // WIRD GELISTET..
        {
            get { return _tCheckDrives != null ? _tCheckDrives.Enabled : false; }
            set { _tCheckDrives.Enabled = value; }
        }
      .
      . 
      . 



// Hier den PropertyGrid anweisen nur nach diesem Atribut zu filtern!
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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 23.01.09 09:57 
Was meinst Du, wie "sucht" man danach? :gruebel:

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
KainPlan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27

Vista Buisness, Windows 7
C/C++, C#, PHP...
BeitragVerfasst: 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:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
    // Erstellen einer x-beliebigen Klasse hier: Form
    Form fm = new Form();
    // string objekt zum bereitstellen der Informationen
    string text = "";
    // Das Type-Objekt der Klasse abrufen
    Type type = fm.GetType();
    // Hier die "Suche" nach den Membern definieren
    System.Reflection.MemberInfo[] minfos = type.FindMembers(System.Reflection.MemberTypes.All,
        System.Reflection.BindingFlags.Public, nullnull);
    
    // Die gefundenen Member durchlaufen
    foreach (System.Reflection.MemberInfo minf in minfos)
    {
        // Informationen bereitstellen
        text += string.Format("({0}) {1}.{2}\r\n",minf.DeclaringType.FullName,
            minf.ReflectedType.FullName, minf.Name);
    }

    // und die Informationen wiedergeben. Achtung die wird ein bisschen Groß ;)
    MessageBox.Show(text);