Lösungsansätze der Datenhaltung für __closure



  • Hallo,

    habe z.B. eine Klasse für Druckroutinen, diese Klasse verfügt über eine __closure

    Nun will ich an diese __closure Daten bzw. Variableninhalte übergeben.

    Eine Möglichkeit wäre diese Daten als Instanzvariable der Eigentümerklasse der Methode die an das __closure übergeben würde zu halten, dies finde ich aber nicht schön. Wie macht man so etwas professioneller.

    DANKE im Voraus.



  • Hallo

    Häh?
    __closure wird zur Definition von klassenunabhängigen Methodenpointern benutzt, um z.B. die VCl-Events zu realisieren.
    Wenn du also irgendwelche Parameter mit einem solcehn Event übergeben willst, dann must du doch nur die Definition des Methodenpointers um eben diesen Parameter erweitern.

    Ansonsten erklär am besten mal konkret an einem Beispiel was du wissen willst.

    bis bald
    akari



  • @akari

    ja Problem ist das die Klasse die das __closure ausführt nicht verändert werden soll!!!!

    Hier ein Beispiel:

    //------------------------------------------------
    void xxx::tuwas(){    
       String s = "ich bin ein text";
       m_ll->m_CallPrint = print;   
    }
    //------------------------------------------------
    // __closure 
    void xxx::print{
      // hier würde ich gerne Zugriff auf die Var. s aus tuwas haben,
      // ohne diese als Instanzvar. zu definieren
    }
    //------------------------------------------------
    


  • Warum lässt du tuwas() den String nicht einfach zurückgeben und rufst die Funktion in print auf?
    So wie das jetzt ist ist s lokal und ist somit aussen nicht sichtbar.



  • @Braunstein

    kann leider tuwas() aus einigen gründen nicht aus print aufrufen.

    wenn es so einfach wäre, das wär schon ....



  • Hallo

    Irgendetwas must du sowohl in tuwas als auch in print ändern. Also ändere gleich die Methodenpointer-Definition, sodas du einen zusätzlichen Parameter für den String hast.

    bis bald
    akari



  • akari schrieb:

    Hallo

    Irgendetwas must du sowohl in tuwas als auch in print ändern. Also ändere gleich die Methodenpointer-Definition, sodas du einen zusätzlichen Parameter für den String hast.

    bis bald
    akari

    Verstehe ich nicht ganz, kannst mir auch ein kleines Beispiel geben?



  • Hallo

    Da ich immer noch nicht weiß, aus welcher Methode du welchen Event mit welchem Typ du aufrufst, kann ich nur allgemein bleiben.
    Normalerweise werden __closure in solcehn Definitionen verwendet, wie hier im TNotifyEvent :

    void __fastcall (__closure *TNotifyEvent)(System::TObject* Sender);
    

    du kannst zum Beispiel so einen Typ definieren

    typedef void __fastcall (__closure *TPrintEvent)(const AnsiString &s);
    

    .
    Dann muß aber die Methode, die du einem Methodenpointer von diesem Typ zuweisen willst, von genau dem selben Typ sein.

    // in xxx einen Methodenpointer deklarieren, im Konstruktor von xxx erstmal auf NULL setzen
    xxx::TPrintEvent PrintEvent;
    ...
    // dort auf eine Methode einer gültigen Instanz von yyy verweisen
    PrintEvent = MyYYY.print;
    ...
    void xxx::tuwas(){    
       String s = "ich bin ein text";
       if (PrintEvent) PrintEvent(s);
    }
    //------------------------------------------------
    
    void __fastcall yyy::print(const AnsiString &s){
      ShowMessage(s);
    
    }
    //------------------------------------------------
    

    bis bald
    akari



  • @akari

    print wird in der klasse die in der Variablem m_ll inizialisiert ist aufgerufen!

    siehe:
    m_ll->m_CallPrint = print;



  • Dann kannst du ja bei diesen Aufruf die variable auch zuweisen. Du müßtest s aber zur Membervariablen von xxx oder der Klasse von m_ll machen. Ist m_ll Member von xxx?



  • IcemanX schrieb:

    print wird in der klasse die in der Variablem m_ll inizialisiert ist aufgerufen!

    siehe:
    m_ll->m_CallPrint = print;

    Ich sehe da keinen Aufruf oder Initialisierung, nur eine Zuweisung.
    Ich sehe mit dem was du bis jetzt gepostest hast in deiner Klassenstruktur nicht durch, also kann ich dir keine detaillierteren Hinweise geben.

    bis bald
    akari


Anmelden zum Antworten