Frage zur Verwendung von Eigenschaften



  • Hallo,
    ich habe da noch eine Frage zu Eigenschaften. Wenn ich soetwas habe:

    __fastcall void SetA(double z)   {a = z; Invalidate();} 
    __fastcall void SetB(double z)   {b = z; Invalidate();}
    __fastcall void SetC(double z)   {c = z; Invalidate();}
    __fastcall void SetD(double z)   {d = z; Invalidate();}
    

    dann mache ich meist daraus eine Funktion, die alles übernimmt:

    void __fastcall Set(int val, int i)
    {
     switch(i)
     {
      case 1:
       a = val; //auf die Invalidates habe ich hier verzichtet
       break;
      case 2:
       b = val;
       break;
      case 3: 
       c = val;
       break;
      case 4:
       c = val;
     }
    }
    

    Doch wie kann ich das bei den Eigenschaften machen? Da kann ich ja irgendwie keine Parameter übergeben, da ich immer sowas schreibe:

    __property double xMin = {read = xmin, write = SetA}; //SetA hat keinen parameter hier (ist aber mit deklariert)
    //sowas geht nicht:
    __property double xMin = {read = xmin, write = Set(1)}; //ein Parameter, weil val ja irgendwie durch write kommt  :confused:
    

    Danke schön



  • Ich habe vergessen zu sagen, dass xmin hier sowas wie a sein soll. Das soll bei mir der kleinste Wert eines Rechtecks sein. Ich kann es aber auch A (wie oben) nennen.

    Danke schön



  • Hallo

    Das geht mit Eigenschaften nicht. Eigenschaften und ihre Getter und Setter haben immer genau einen Wertetyp, und nicht noch einen extra Parameter.

    Du kannst natürlich für die Eigenschaft als Wertetyp statt dem einfachen double eine entsprechende Struktur nehmen, die alle vier double-Werte aufnimmt. Mit TRect ist eine solche Struktur schon definiert, die auch vom OI bereits unterstützt wird. Allerdings verwendet TRect nur int als Zahlentypen.

    bis bald
    akari



  • Und wie das geht:

    protected:
    doble XArray[12];
    double __fastcall GetXValue(int Ind);
    void __fastcall SetXValue(int Ind, double X);
    public:
    __property double X[int Ind]={read=GetXValue,write=SetXValue};

    **********************************************************************
    double __fastcall TKlassenname::GetXValue(int Ind)
    {
    return XArray[Ind];
    }
    //---------------------------------------------------------------------------
    void __fastcall TKlassenname::SetXValue(int Ind, double 😵
    {
    XArray[Ind]=X;
    }
    //---------------------------------------------------------------------------

    **********************************************************************
    Das ist nur ein Auszug!

    Was fehlt, ist ne geeignete Index- Überprüfung ...

    Gruss
    Frank



  • Ja, aber nur, wenn das Property selber auch einen Index benutzt, aber eben nicht - so wie akari geschrieben hat - bei normalen Properties.

    Mir erscheint der Ansatz von TColor jedoch sowieso wie "von hinten durch die Brust ins Auge", d.h. erst wird ein Index an die allgemeine Set-Methode übergeben, um dann wieder mittels einer 'switch'-Anweisung die eigentliche Funktionalität auszuführen.

    Also zusammengefaßt:
    entweder die Funktionalität in getrennten Methoden unterbringen oder aber überall Indizes benutzen (d.h. eine der beiden möglichen Property-Schreibweisen ausschließlich benutzen - kein Mischmasch!).



  • Freilich geht das.

    class Foo
    {
    private:
        double FBar[3];
    	double GetBar (int index) { return FBar[index]; }
    	void SetBar (int index, double value) { FBar[index] = value; }
    
    public:
    	__property double Bar0 = { read = FBar[0], write = FBar[0] };
    	__property double Bar1 = { read = GetBar, write = SetBar, index = 1 };
    	__property double Bar2 = { read = FBar[2], write = SetBar, index = 2 };
    };
    

Anmelden zum Antworten