Referenz auf Canvas übergeben?!



  • Hi,

    folgende Frage: wie kann ich einen Canvas als Referenz übergeben?
    Konkret: Habe ein Hauptfenster mit einem TImage drauf. In dieses TImage soll nun gezeichnet werden können. Und zwar aus einer Klasse( TDrawRect ) heraus.
    Konstructor:

    __fastcall  TDrawRect( Graphics::TCanvas* &canvas );
    

    Aufruf wäre dann - mit BCB 2007 - wie?

    Habe 'alten' Code( BCB4 ) hier, da gehts so:

    TDrawRect* drawRect = new TDrawRect(Image->Picture->Bitmap->Canvas);
    

    Im BCB 2007 mag er das so aber gar nicht.
    BCC32 Mecker:

    [BCC32 Fehler] feHelper.cpp(1425): E2285 Keine Übereinstimmung für 'TDrawRect::TdrawRect(TCanvas *)' gefunden
    

    Was hat sich geändert? Oder liegts an den Projekteinstellungen 😕
    Wenn ja, welche?

    Bin kurz davor, ein Loch in meinen Schreibtisch zu beissen.

    grüssle 🙂



  • Hallo,

    Warum willst du eine Referenz auf einen Zeiger übergeben?



  • Wie schon oben geschrieben, auf das TImage im MainFrame soll von einer eigenen Klasse aus gezeichnet werden.
    Habe den Code übernommen und soll ihn nun auf den BCB 2007 'hochziehen'. Zeit ist - wie eigentlich immer - keine da, und alles andere funktioniert auch. Nur dieser Canv 😡 as nicht.
    Allerdings bin ich für andere Lösungen, solange sie nicht zu viel Zeit in Anspruch nehemen - jederzeit empfänglich. Und nicht nur das, auch dankbar. Habe schon einiges versucht, aber bisher nichts erreicht.

    grüssle 🙂



  • Hast du die Fehlermeldung kopiert oder selber geschrieben. Mich irritiert sonst die schreibweise von :TdrawRect



  • Was genau bezweckst du mit der Übergabe einer Zeigerreferenz? Warum geht es nicht, wenn du nur einen Zeiger übergibst?

    Daß es nicht klappt, liegt wahrscheinlich daran, daß Canvas ein Property ist, und Properties können eigentlich nicht als Referenzen übergeben werden, denn außer in der direkten Zuweisung sind Properties immer R-Values.



  • Braunstein schrieb:

    Hast du die Fehlermeldung kopiert oder selber geschrieben. Mich irritiert sonst die schreibweise von :TdrawRect

    Kopiert*, aber Klassennamen editiert.

    [BCC32 Fehler] feHelper.cpp(1425): E2285 Keine Übereinstimmung für 'TDrawRect::TDrawRect(TCanvas *)' gefunden
    

    So stimmts

    audacia schrieb:

    Was genau bezweckst du mit der Übergabe einer Zeigerreferenz? Warum geht es nicht, wenn du nur einen Zeiger übergibst?

    Etwa so:

    drawRect = new TDrawRect( (Graphics::TCanvas*&)FImage->Picture );
    

    oder so?

    drawRect = new TDrawRect( (Graphics::TCanvas*)FImage );
    

    Wird beides anstandslos kompiliert, und einiges scheint auch anzukommen. z. B. die Zuweisung:

    drawCanvas = canvas
    

    in der Klasse TDrawRect funktioniert. Aber wenn ich dann in meiner Klasse TDrawRect z. B. auf drawCanvas->Pen->Width zugreifen will knallts mit einer Zugriffsverletzung. Trotz setzen des Pen->Mode auf dmCopy( müsste dann 4 sein ) vor der Übergabe, ist der Pen->Mode in TDrawRect -123 ??? Also offensichtlich 'verliert' er auf seinem Weg was 😕

    grüssle 🙂

    * Für Fehler und Schrift haftet der Stift 😉



  • Es ist schlichtweg so, daß du Properties nicht als L-Values benutzen darfst. Für Properties, die lediglich ein Feld wrappten, war das zwar in älteren C++Builder-Versionen zuweilen möglich; der C++Builder 2007 scheint das strikter zu überprüfen.

    Properties verdecken hauptsächlich ein Implementationsdetail; in Standard-C++ wären in dieser Hinsicht öffentliche Getter- und Setter-Methoden äquivalent, die man z.B. auch inline definieren kann. (Natürlich bieten Properties weiter die Vorteile, daß sie zur Designzeit sichtbar sind und sich mittels RTTI z.B. serialisieren lassen, aber das ist jetzt nicht relevant.)

    Wie du übrigens in der Eigenschaftenübersicht auf dieser Seite entnehmen kannst, ist TBitmap::Canvas eine Read-only-Eigenschaft; du darfst es gar nicht verändern (und du kannst es auch nicht, wenn du die Typüberprüfung des Compilers nicht bewußt mit einem Hard-Cast umgehst, wodurch du dich natürlich in Bereiche undefinierten Verhaltens begibst).

    Smitty schrieb:

    Etwa so:

    drawRect = new TDrawRect( (Graphics::TCanvas*&)FImage->Picture );
    

    oder so?

    drawRect = new TDrawRect( (Graphics::TCanvas*)FImage );
    

    Wird beides anstandslos kompiliert

    Klar, mit einem C-Cast oder einem reinterpret_cast kann man den Compiler zu mancherlei zwingen. Aber üblicherweise ist der Einsatz eines solchen Casts ein Indiz für einen Konzeptionsfehler.



  • Und wieder was gelernt.
    Ich nehme jetzt das TImage. Müssen noch ein paar Anpassungen gemacht werden, was das Paint und EndPaint angeht, sollte aber keine grosse Aktion mehr geben.

    Danke und grüssle 🙂


Anmelden zum Antworten