TConrolCanvas fehlerhaft



  • Hallo Allerseits!

    Ich habe hier in meinem akt. Projekt ein TControlCanvas verwendet:

    Konstruktor der Form:

    //Canvas auf einem Panel erzeugen
       cnvEditorPanel = new TControlCanvas();
       cnvEditorPanel->Control=pnl_Editor;
    

    Destruktor der Form:

    if (cnvEditorPanel)
       {
          delete cnvEditorPanel;
          cnvEditorPanel = NULL;
       }
    

    Soweit so gut.

    Wenn ich das Projekt nun kompiliere läuft alles glatt und die Anwendung startet. Sobald aber das Fenster mit dem TControlCanvas geöffnet wird treten nicht nachvollziehbare und nicht in jedem Falle reproduzierbare Fehler auf. Zu 90% kommen zu beliebigen Zeitpunkten Exceptions/Access Violations, zu 10% fuznktioniert die Anwendung einwandfrei. Selbst durch den Debugger ließ sich nicht lokalisieren wo genau der Fehler auftritt. Also CodeGuard aktivieren und schauen was der so bringt ... und siehe da 😕

    Im Konstruktor des TControlCanvas wird folgender Fehler im CodeGuard ausgegeben:

    "Method called on illegally casted Object
    Attempt to Access 104 Bytes at XXXXXXXXXX ... usw."

    Unterm Strich bedeutet das, im Construktor des TControlCanvas werden 100 Bytes reserviert und letztendlich versucht auf 104 Bytes im Destruktor oder sonstwo zuzugreifen, also auf 4 Bytes zu viel, was letztendlich je nach Wetterlage zu den o.g. AccessViolations führt. Toll nicht? 😡

    Diesen gar nicht lustigen Umstand kann jeder schnell nachbasteln. Er tritt nicht nur im Zusammenhang mit meiner Anwendung auf, sondern jedesmal wenn TControlCanvas verwendet wird (Ich hatte auch eine kleine Testanwendung mit einem TControlCanvas geschmiedet). D.h. TControlCanvas scheint serienmäßig eine Macke zu haben. 👎

    Hat jemand schon änliche Erfahrungen gemacht?



  • Also ich kann dein Fehler nicht nachvollziehen.

    hier ist die ganze meine Test-Anwendung:

    __fastcall TForm1::TForm1(TComponent* Owner)
      : TForm(Owner)
    {
        cnvEditorPanel = new TControlCanvas();
        cnvEditorPanel->Control=pnl_Editorc;
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormDestroy(TObject *Sender)
    {
          delete cnvEditorPanel;
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      cnvEditorPanel->MoveTo(0,0);
      cnvEditorPanel->LineTo(pnl_Editorc->Width, pnl_Editorc->Height);
    }
    //---------------------------------------------------------------------------
    

    Es liegt vielleicht nicht an dem TControlCanvas, sonder an dem, was du damit machst.
    Test habe mit BCB6 Pro unter WinXP Pro gemacht.



  • Du mußt in Projekt->Optionen mal den CodeGuard aktivieren und dann das Programm starten!

    Mein TestCode sieht so aus:

    *.h

    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <ExtCtrls.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:	// Von der IDE verwaltete Komponenten
            TPanel *Panel1;
            TButton *Button1;
            void __fastcall Button1Click(TObject *Sender);
    private:	// Anwender-Deklarationen
                      TControlCanvas *cnvEditorPanel;
    public:		// Anwender-Deklarationen
            __fastcall TForm1(TComponent* Owner);
            virtual __fastcall ~TForm1();
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    

    *.cpp

    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
    {
               cnvEditorPanel = new TControlCanvas();
               cnvEditorPanel->Control=Panel1;
    }
    //---------------------------------------------------------------------------
    
    __fastcall TForm1::~TForm1()
    {
               if (cnvEditorPanel)
               {
                  delete cnvEditorPanel;
                  cnvEditorPanel = NULL;
               }
    }
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
         cnvEditorPanel->MoveTo(0,0);
         cnvEditorPanel->LineTo(Panel1->Width, Panel1->Height);
    }
    //---------------------------------------------------------------------------
    


  • *doppelpost*


Anmelden zum Antworten