none
Eigenen Dialog entwerfen RRS feed

  • Frage

  • Ich bin gerade dabei einen eigenen FarbDialog zu entwerfen. Dieser soll eine abgespeckte Version des bereits vorhanden ColorDialogs werden. Nun möchte ich, wenn in dem eigens geschriebenen FarbDialog eine Farbe selektiert wurde, diese Farbe (RGB) als quasi "Rückgabewert" an andere übergeben können. Beispielsweise so:

    //so funktioniert es mit einer Instanz von ColorDialog:
    Button1->BackColor = colorDialog1->Color; 
    
    //so soll es funktionieren mit einer Instanz von FarbDialog:
    Button2->BackColor = farbDialog1->Color;
    

    Mit dem Standard ColorDialog funktioniert dies wie im Beispiel über die Eigenschaft "Color". Genau diese Eigenschaft möchte ich auch in meinen FarbDialog integrieren... aber irgendwie steh ich da gerade auf dem Schlauch und bekomm es nicht hin. Weiß jemand wie das geht? Also wie bringe ich meinem FarbDialog die Eigenschaft Color bei? Ich beschäftige mich noch nicht allzu lang mit C++ Klassen und hab wahrscheinlich nur ein Verständnisproblem. Die Eigenschaft Color ist doch im Grunde nix anderes als eine public Strukur in der Klasse ColorDialog... oder?

    Dienstag, 4. Januar 2011 14:28

Antworten

  • Der Compiler kommt da etwas durcheinander... Du musst den Namespace angeben, dass geht es:

      private: Color _Color; // Hier ist als Beispiel Deine ausgewählte 
    Farbe drin...
      public:
        property Color Color {
          System::Drawing::Color get() { return _Color; }
          void set (System::Drawing::Color value)  { _Color = value; }
        }

    Jochen Kalmbach (MVP VC++)
    Mittwoch, 5. Januar 2011 10:23

Alle Antworten

  • Du musst einfach ein Property "Color" in Dein Form hinzufügen...

    PS: Du beschäftigst Dich nicht mit C++ sondern mit C++/CLI, das ist was ganz anderes...
    Siehe auch:
    http://blog.kalmbach-software.de/de/2010/03/05/ccli-und-winforms-macht-keinen-sinn/


    Jochen Kalmbach (MVP VC++)
    Dienstag, 4. Januar 2011 14:43
  • Am einfachsten ist es, wenn Du Dir die Hilfe zu dem ColorDialog-Property anschaust:
    http://msdn.microsoft.com/en-us/library/system.windows.forms.colordialog.color.aspx

    =>

    private: Color _Color; // Hier ist als Beispiel Deine ausgewählte Farbe 
    drin...
    public:
    property Color Color {
        Color get () { return _Color; }
        void set (Color value)  { _Color = value; }
    }

    Jochen Kalmbach (MVP VC++)
    Dienstag, 4. Januar 2011 15:24
  • Vielen Dank für deine Hilfe. Über Propertys geht sowas also. Habe es jetzt fast genauso implementiert wie du in deinem Beispiel, mit dem Unterschied das "property Color Color" nicht funktioniert, da Color ein bekannter Datentyp ist und somit nicht noch zusätzlich als Name verwendet werden kann. Habe es so umgesetzt:

    	private: Color color;
    	public:
    		property Color Farbe
    		{
    		 Color get()
    		 {
    		   return color;
    		 }
    		 void set(Color value)
    		 {
    		   color = value;
    		 }
    	    }

    So kann ich außerhalb der meiner Klasse über "farbDialog1->Farbe" auf die "color"-Strukur innhalb der farbDialog-Instanz zugreifen, das ist schon mal wunderbar!

    Nur eins stört mich noch ein wenig, und zwar dass ich den Umweg gehen muss und einen eigenen property-Namen "Farbe" erzeugen muss. Ich wöllt die Property halt gern "Color" nennen, damit es genauso zu verwenden ist wie bei den bereits vorhandenen Standardkomponenten. Aber "property Color Color" funktioniert ja leider nicht, oder gibt es da einen Trick?

    Mittwoch, 5. Januar 2011 09:57
  • Der Compiler kommt da etwas durcheinander... Du musst den Namespace angeben, dass geht es:

      private: Color _Color; // Hier ist als Beispiel Deine ausgewählte 
    Farbe drin...
      public:
        property Color Color {
          System::Drawing::Color get() { return _Color; }
          void set (System::Drawing::Color value)  { _Color = value; }
        }

    Jochen Kalmbach (MVP VC++)
    Mittwoch, 5. Januar 2011 10:23
  • Sicher geht das.
    Das Problem ist, dass Du nur den richtigen Scope für Color wählen musst. Im Property ist Color kein Typ, sondern eben der Name des Properties!

    private:
        Color    m_color;
    
    public:
        property Color Color
        {
     ::Color get()
     {
      return m_color;
     }
     void set(::Color value)
     {
      m_color = value;
     }
        }

    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Mittwoch, 5. Januar 2011 10:27
    Moderator
  • Hallo Martin,

      ::Color get()

    Da "Color" kein globaler Typ ist geht dies so nicht, sondern man muss schon den korrekten Namespace angeben...

    System::Drawing::Color get()

    Jochen Kalmbach (MVP VC++)
    Mittwoch, 5. Januar 2011 10:34
  • Ah, ich verstehe :) Danke euch! Coole Sache, jetzt funktioniert es wie es soll.
    Mittwoch, 5. Januar 2011 10:42