property mit array



  • Hallo,

    hat jemand schon mal versucht, propertys basierend auf einem Array zu erzeugen

    etwa so

    property int test[25]={read=ftest[25], write=SetTest[25]};

    Oder gibts Alternativen?

    Habe bisher alle einzeln deklariert.

    Grund: Ich würde die Eigenschaften gerne dynamsich, basierend auf einer Konstanten (define) erzeugen. Natürlich sollen dann auch alle Eigenschaften im OI angezeigt werden.



  • Hallo,

    Properties mit Arrays erfordern entsprechende Zugriffsfunktionen. Das was du da gemacht hast ist falsch. Es könnte etwa so aussehen.

    private:
    int FTest[25];
    __published:
    __property int Test[size_t index]  = { read=GetTest, write=SetTest };
    private:
    // Die Zugriffsfunktionen
    void __fastcall SetTest(size_t index, int value)
    {
       if( index < 25 ) FTest[index] = value;
       else //Fehlerbehandlung
    }
    int __fastcall GetTest(size_t index)
    {
       if( index < 25 ) return FTest[index];
       else //Fehlerbehandlung
    }
    


  • Soweit vielen dank. Lässt sich compilieren, allerdings zeigt es in meinem Objektinspektor (von Dream Company, Laufzeit OI) nur eine Eigenschaft Test an, die ich nicht beschreiben kann oder von der falschen lese. An dieser Stelle würde ich gerne alle (25) Eigenschaften anzeigen.



  • Soweit ich weiß, wirst Du dann für jede der 25 Eigenschaften eine extra Property schreiben müssen.



  • Am Besten ist, du sagst uns was du willst. Du hast hier von 25 Eigenschaften geschrieben. Meinst du damit, dass du diese Eigenschaften (z.Bsp. in einem enum) hast und die bei Bedarf setzen willst? Wenn das der Fall ist, ist ein Array der falsche Weg. Hier brauchst du ein Set.
    Hier mal ein Beispiel aus einer meiner Komponenten

    // Typdefinitionen
      enum HFGridOption { hfgoMultiSelect, hfgoBorderSelect, hfgoChangedColoring, hfgoInsertedColoring };
      typedef Set<HFGridOption, hfgoMultiSelect, hfgoInsertedColoring> HFGridOptions;
    //private Variable
      HFGridOptions FExtOptions;
    // Zugriffsfunktion
      void __fastcall SetExtOptions(HFGridOptions value);
    {
            if( value != FExtOptions)
            {
                FExtOptions = value;
            }
    }
    //---------------------------------------------------------------------------
    //Property  
      __property HFGridOptions ExtOptions  = { read=FExtOptions, write=SetExtOptions, default=1 };
    


  • Das erste Beispiel kommt meiner Anwendung doch am nächsten(so vermute ich, weil ich das zweite nicht besonders verstehe).

    Ich habe u.a. Charts für die MerkmalX1, MerkmalY1 (derzeit bis 18) als Eigenschaften deklariert werden müssen. Schließlich und endlich werden diese Werte von mir in eine Ini-Datei geschrieben, weshalb die genaue Verwendung der Eigenschaften egal ist. Ich muss diese 2*18 Eigenschaften visualisieren um sie dann bearbeiten zu können(nur int-Zahl reinschreiben). Wenn dann der Kollege sagt er braucht MerkmalX256 dann wäre das als Array ganz geschickt.
    Der andere Fall sind Buttons, aber die Sache verhält sich analog.



  • Hallo

    Der OI kann nur ihm bekannte Eigenschaftstypen Manipulatoren/Editoren anbieten. Zum Beispiel AnsiString oder Zeiger auf VCL-Komponenten.
    Dein Bool-Array hingegen ist dem OI nicht bekannt, deshalb zeigt er nichts sinnvolles an. Entweder begnügst du dich mit einer nichtvisuellen Eigenschaft (also Änderungen ausschließlich über Quellcode) oder du must einen separaten Editor für den Eigenschaftstyp Bool-Array schreiben. Zu letztem siehe TPropertyAttribute/TPropertyEditor. Ich bezweilfe aber das sich dieser Aufwand für einen Einzelfall lohnt.

    bis bald
    akari


Anmelden zum Antworten