Zeiger auf Funktion von Memo



  • Hallo,

    Ich habe ein Formular mit einer Memo-Komponente.
    Jetzt möchte ich in einer Funktion als Parameter einen Zeiger auf eine Funktion
    der Memo-Komponente übergeben.
    Habe schon alles versucht. Aber der Compiler versteht mich nicht 🙂

    So sieht mein Formular aus. Also nichts besonderes

    class TForm1 : public TForm
    {
    __published:	// IDE-verwaltete Komponenten
    	TButton *BSenden;
    	TMemo *Memo1;
    	TEdit *Edit1;
            TButton *Button1;
            TButton *Button2;
            TStatusBar *StatusBar;
            TProgressBar *ProgressBarFile;
            TProgressBar *ProgressBarDownload;
            TOpenDialog *OpenDialog1;
    	void __fastcall BSendenClick(TObject *Sender);
    	void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
            void __fastcall Button1Click(TObject *Sender);
            void __fastcall Memo1KeyPress(TObject *Sender, char &Key);
            void __fastcall Button2Click(TObject *Sender);
    
    private:	// Benutzer-Deklarationen
    public:		// Benutzer-Deklarationen
    	__fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    

    und so die Funktion:

    void EmpfangAnzeigen(TForm1* Form, void (TForm1::Memo1::*Fkt)(char* ), char* Data)
    {
         (Form->*Fkt)(Data);
    }
    

    Hierbei erhalte ich immer den Fehler: E2090 Qualifizierer ‘bezeichner’ ist kein Name einer Klasse oder einer Struktur

    Aufrufen wollte ich die Funktion so:

    EmpfangAnzeigen(&Form1, &TForm1::Memo1::SetSelText, Data);
    

    Aber bis hierhin kommt der Compiler erst gar nicht.

    Wie muß ich die Funktion definieren bzw. aufrufen, damit der Compiler keine Fehler meldet.
    Danke im Voraus für Eure Bemühungen.

    Grüße
    Andreas



  • Hallo aheim,

    versuch es doch einfach diese Art

    void __fastcall TErrLogFile::getOnErrLogInt(
    				TObject *Sender,
    				TFehlerListe* ErrText,		// Fehlerliste fuer einen Fehler
    				TMemo* ErrorMainMemo)
    {
    	AnsiString		astrHilf;
    
    	// neuen Fehlertext in den Ringpuffer schreiben und auf max. 252 Byte
    	// begrenzen um "\r\n" anhaengen zu koennen.
    	StrLCopy(
    		ReadErrorMes->Err_RingInt
    			.Err_txt[ReadErrorMes->Err_RingInt.iwrite].Text,
    		ErrText->cErrtxt, 252);
    
    	// Fehlermeldung in der Oberflaeche ausgeben
    	ErrorMainMemo->Lines->Add
    		(KOMPONENTE[ErrText->iKomponete]
    		+"  "+ FEHLRTYPE[ErrText->iErrType]
    		+" "
    		+ReadErrorMes->Err_RingInt
    			.Err_txt[ReadErrorMes->Err_RingInt.iwrite].Text);
    

    Viel Erfolg
    Evi48



  • Hallo evi48,

    danke schon mal vorab.

    Aber leider weiss ich nicht wieviele Zeichen ankommen. Es können immer unterschiedliche sein und wann bzw. ob mal ein CR/LF kommt ist auch nicht klar.
    Es soll jedes Zeichen einzeln und sofort angezeigt werden.
    Daher kann ich nicht mit Add arbeiten.

    Das ganze hat auch schon mal funktioniert.
    Da habe ich einfach Form1->Memo1->SetSeltextBuf(Empfangsdaten) aufgerufen )oder so ähnlich).

    Allerdings habe ich dafür eine komplette cpp-Datei includiert.
    Das hatte mir nicht gefallen und habe sie daher dem Projekt hinzugefügt.
    Wenn ich nur die Headerdatei include und oben die Funktion aufrufen erhalte ich einen Zugriffsfehler.
    Daher dachte ich mir einfach einen Zeiger auf die Funktion zu übergeben.
    Hoffe es ist klar was ich damit meine. Bin im Moment im Zeitdruck.

    Trotzdem Danke.



  • Hallo aheim,
    ich hoffe ich habe dich verstanden. Übergib doch einfach in deine Funktion einen Zeiger auf das Memo und einen Zeiger auf die chr.

    void EmpfangAnzeigen(TForm1* Form, TMemo *Memo1, char* Data)
    {
         Memo1->SetSelTextBuf(Data);
    }
    

    Auf diese Weise hast du alle Funktionen des Memo zur Verfügung.

    Evi48



  • Hallo,
    ich habe noch einen Fehler entdeckt TForm1 ist keine Klasse sondern nur TForm

    void EmpfangAnzeigen(TForm* Form, TMemo *Memo1, char* Data)
    {
         Memo1->SetSelTextBuf(Data);
    }
    

    Aufruf der Funktion:

    EmpfangAnzeigen(MyForm, MyMemo, MyData);
    

    Evi48



  • Hallo,

    Kannst du mir verraten, wozu hier ein Pointer auf TForm übergeben wird?
    Bezüglich der Funktionspointer vom Anfang:
    Soweit ich weiss ist es nicht möglich Funktionspointer von nichtstatischen Memberfunktionen zu erzeugen bzw. zu übergeben (wegen this).
    Die Funktion von evi48 (ohne dem TForm Parameter) sollte so eigentlich funktionieren.

    Ciao



  • Hallo Braunstein,
    ich habe lediglich versucht eine Problemlösung zu Zeigen nicht einen Funktionspointer zu übergeben.

    Evi48



  • Das mit dem Funktionspointer war auch nicht auf dich bezogen, sondern auf den ersten Beitrag dieses Threads.



  • Guten Morgen Braunstein,
    Entschuldigung, habe wohl nicht bis zu Ende gelesen.

    Einen angenehmen Tag
    Evi48


Anmelden zum Antworten