Mit __property {read=} Zugriff auf Member eines Members



  • Hallo!

    Ich stelle mir folgendes vor:

    class TTest : public TDataModule
    {
    __published:	// Von der IDE verwaltete Komponenten
        TIdFTP *IdFTP1;
    public:		// Anwender-Deklarationen
        __fastcall  TTest(TComponent* Owner);
    
        __property  AnsiString  strFTPHost  = { read=IdFTP1->Host, write=IdFTP1->Host }; 
    };
    

    Also beim Zugriff auf strFTPHost soll automatisch der entsprechende Wert der Indy-FTP-Komponente gelesen und geschrieben werden. Leider kompiliert dieser Quellcode nicht.
    Geht das prinzipiell nicht, oder habe ich einen Syntaxfehler?

    Gruß
    Klaus



  • class TTest : public TDataModule 
    { 
    private:
     String FHost;
    __published:        TIdFTP *IdFTP1; // ganz übel !
    public:        // Anwender-Deklarationen 
        __fastcall  TTest(TComponent* Owner); 
    
        __property  AnsiString  strFTPHost  = { read=FHost, write=FHost};  
    };
    


  • __published:        TIdFTP *IdFTP1; // ganz übel !
    

    Was heißt denn hier "ganz übel!"? Das hat doch der Builder selbst geschrieben ;). Du meinst wohl, weil man dann von außen darauf zugreifen kann, oder?

    Durch die Deklaration der Variablen FHost habe ich aber eine Variable, die getrennt von der Eigenschaft Host der FTP-Komponente ist. Dann muss ich letztendlich doch noch irgendwann den Wert meiner FHost-Var IdFTP1->Host zuweisen. Schade eigentlich. Ich dachte, das könnte ich automatisieren.



  • Kannst du ja auch... implementiere hald Get-/Set-Methoden für den host dannk annst du mit dem Wert machen, was du auch immer willst.

    -junix



  • warp schrieb:

    Du meinst wohl, weil man dann von außen darauf zugreifen kann, oder?

    Ja, das meinte ich. Wenn der Eintrag voin der IDE erstelllt wurde, kannst du ja nichts dran machen.

    Dises Problem ist, meiner Meinung nach, noch eine Schwäche der IDE. Der Formdesigner macht einfach alles public (__published ist ja auch public).

    warp schrieb:

    Schade eigentlich. Ich dachte, das könnte ich automatisieren.

    geht schon:

    class TTest : public TDataModule  
    {  
    private: 
     String GetHost(){return IdFTP1->Host};
     void   setHost(String value){IdFTP1->Host=value};
    
    __published:        
      TIdFTP *IdFTP1; 
    public:      
        __fastcall  TTest(TComponent* Owner);  
    
        __property  AnsiString  strFTPHost  = { read=GetHost, write=SetHost};   
    };
    

    siehe Tutorial in meiner Signatur...


Anmelden zum Antworten