event problem



  • hola leute

    steh da grad etwas auf dem schlauch.
    leite eine klasse von TDrawGrid ab und moechte nun das OnDrawCell event eine methode zuweisen.

    void __fastcall intern_on_draw_cell(TObject* sender, long col, long row, TRect rect, TGridDrawState state);
    

    im ctor meiner klasse hab ich:

    this->OnDrawCell = intern_on_draw_cell;
    

    bekomme dann aber folgende fehlermeldung:

    [C++ Fehler] TDrawGridEx.cpp(12): E2034 Konvertierung von 'void (_fastcall * (_closure )(TObject *,long,long,TRect,TGridDrawState))(TObject *,long,long,TRect,TGridDrawState)' nach 'TDrawCellEvent' nicht möglich
    

    kann mir jemand sagen wo da der fehler liegt?

    Meep Meep



  • Hallo

    das ist ein kleiner Bug in der Buider-IDE. Schau mal in die Buider-Hilfe zu TDrawGrid::OnDrawCell, dort findest du die korrekte Parameterliste des Events. Soweit ich mich erinnere, muß das Rect als Konstante Referenz übergeben werden.
    Die IDE erzeugt aber mit der Automatik eine Methode mit falschem Parameter, so das die manuelle Zuweisung zu einem Event nicht geht.

    bis bald
    akari



  • Stimmt, es muß nicht TRect, sondern const TRect& übergeben werden. Aber wieso ist das ein Bug in der IDE bzw. wie kann man sich das automatisch generieren lassen?
    Oder ist das eines der im BDS2006 fehlenden Features?



  • Hallo

    Ich meine mit automatisch die Generierung per Objektinspektor. Also zur Entwurfszeit ein T...Grid auswählen und im OI mit Doppelklick auf den Event-Eintrag die entsprechende Methode erstellen.
    Dann wird die Methode ohne const & erstellt. Das läßt sich auch noch kompilieren, da offenbar der Borland-Compiler das nicht mehr überprüft.
    Erst wenn so eine Methode manuell über Laufzeit-Quellcode einem Event zugewiesen werden soll, stolpert der Compiler drüber.
    Es schadet übrigens nichts, auch die automatischen Methoden zu korrigieren, so wie es auch in der Builderhilfe steht.
    Dieses Verhalten ist jedenfalls im BCB5 noch so. Möglicherweise ist der Bug im Studio schon behoben.

    bis bald
    akari



  • akari schrieb:

    Ich meine mit automatisch die Generierung per Objektinspektor. Also zur Entwurfszeit ein T...Grid auswählen und im OI mit Doppelklick auf den Event-Eintrag die entsprechende Methode erstellen.

    In BCB 5, BCB 6 und Turbo C++ steht dann da TRect&. Wie du sagst, tritt dann bei einer manuellen Zuweisung ein Fehler auf.
    -> ab nach QC



  • re

    danke mal fuer die aufklaerung. hatte es dann auch in der grids.hpp gefunden.
    leicht aergerlich aber was solls.

    hab da nun mit meiner grid-klasse noch ein kleines problem.
    das grid wird im ctor einer form erstellt und im OnClose event des forms wieder zerstoert.

    kompilieren funktioniert einwandfrei. angezeigt wird es auch. jedoch beim schliessen der form gibt es eine exception:

    Erste Gelegenheit für Exception bei $7C812A5B. Exception-Klasse EAccessViolation mit Meldung 'Zugriffsverletzung'. Prozess Abelog.exe (3500)
    

    in der IDE springt er in folgende zeile(591) in Grids.hpp

    /* TCustomGrid.Destroy */ inline __fastcall virtual ~TDrawGrid(void) { }
    

    muss ich beim zerstoeren meiner grid-klasse auf irgendwas bestimmtes noch achten ?

    Meep Meep



  • Hallo

    im OnClose event des forms wieder zerstoert.

    Da ich vermute du gibts dem Grid beim Erstellen das Form als Owner mit, brauchst du es selber auch nicht löschen.

    Ansonsten sehe ich aus den bisherigen Codeausschnitten kein Grund für einen Speicherfehler.

    bis bald
    akari


Anmelden zum Antworten