Meine Dummheit doer Komponenten Bug?
-
Hallo.
Ich nutze BlockEngine, TButton und TMemo zum Test auf CBuilder5 mit dem einzigem Update1.
BlockEninge nutzt intern gdiplus.dll zur Darstellung.Folgender Code verursacht bei mir eine access violation.
void __fastcall TForm1::Button1Click(TObject *Sender) { Block *block; Memo1->Clear(); for (int i=0;i<BlockEditor1->Document->BlockRoot->Blocks->Count;i++) { try { block = (Block*)BlockEditor1->Document->BlockRoot->Blocks->Items[i]; block->Left = block->Left; block->Top = block->Top; Memo1->Lines->Add(block->BlockName + " - " + IntToStr((int)BlockEditor1->Document->BlockRoot->Blocks->Items[i])); } catch (...) { ShowMessage("Error"); // erscheint niemals } } }Mein Problem ist jetzt, das er alle Elemente ins TMemo reinsetzt, aber trotzdem einen access violation bekomme. Allerdings nur wenn ich mehr als 30 Einträge habe.
Weniger haben noch nie einen Fehler produziert.
Wenn ich block->Left oder block->Top rauslasse, geht es ebenfalls sauber durch.Wenn ich jetzt eine Zeile einfüge mit ShowMessage("x");
void __fastcall TForm1::Button1Click(TObject *Sender) { Block *block; Memo1->Clear(); for (int i=0;i<BlockEditor1->Document->BlockRoot->Blocks->Count;i++) { try { block = (Block*)BlockEditor1->Document->BlockRoot->Blocks->Items[i]; block->Left = block->Left; block->Top = block->Top; Memo1->Lines->Add(block->BlockName + " - " + IntToStr((int)BlockEditor1->Document->BlockRoot->Blocks->Items[i])); ShowMessage("x"); // <<< NEW LINE } catch (...) { ShowMessage("Error"); // erscheint niemals } } }dann sehe bei jedem Durchlauf das "x" aber niemals eine access violation
Grob gesagt es scheint als ob "zuschnell" auf die Elemente zugefriffen wird, aber ... häää? Irgendwie check ich es nicht was das soll.

Kann mir da jemand einen Rat geben?
-
stupido-san schrieb:
Block *block; // ... block = (Block*)BlockEditor1->Document->BlockRoot->Blocks->Items[i]; block->Left = block->Left; block->Top = block->Top;Und was genau sollen diese Zeilen da jetzt bringen...?
-
Um Fehler einzugrenzen garnichts. Normal wird dann ein Wert für Left und Top übergeben. Für die Bugfindung, setzte ich es auf den selben Wert. Schlimm?

-
block = (Block*)BlockEditor1->Document->BlockRoot->Blocks->Items[i];Ich denke mal, das diese Zeile ursächlich Schuld ist. Schließlich findet bei einem harten cast keienerlei Überprüfung statt. Irgendeinen Zeiger bekommst Du so immer, aber ob er gültig ist...
-
Mhh, wie würde es denn besser sein?

Das Item ist ein TList und Typ void
Im Auge behalten sollte man aber auch das die Werte die ich erhalte stimmen und das wenn ich ShowMessage("x") mache auch keine access violation auftritt.
-
Wenn du den Block schon casten willst, versuchs mal mit dynamic_cast
block = dynamic_cast<Block*>(BlockEditor1->Document->BlockRoot->Blocks->Items[i]); if(block==NULL) { ShowMessage("Cast-Error"); return; } Memo1->Lines->Add(block->BlockName + " - " + IntToStr((int)BlockEditor1->Document->BlockRoot->Blocks->Items[i]));
-
Mhh, dann bekomme ich aber einen Fehler.
2307 Typ ‘typ’ ist keine definierte Klasse bei virtuellen Funktionen Compiler-Fehler.
Es wurde ein dynamic_cast mit einem Zeiger auf eine Klasse benutzt, die entweder undefiniert ist oder keine virtuellen Elementfunktionen besitzt.
-
Hallo
das liegt daran das void nicht mit dynamic_cast oder static_cast gecastet werden kann, denn es ist ein undefinierter Typ. Du must reinterpret_cast nehmen.
Ich würde aber lieber versuchen, das ohne void zu lösen, so das du einen sicheren cast mit Überprüfung nehmen kannst.
bis bald
akari
-
Ich flücke die Komponente grad auseinander und probiere rum.
Also das ganze hat nichts mit dem Pointer zu tun sondern wohl warum auch immer mit Left und Top zuweisung. Ohne das läuft es ja wie mehrmals bereits gesagt sauber durch. in Left und Top wird die SetBounds() Funktion aufgeruft und dort muss der Fehler hocken.. Bin ja mal gespannt ob ich rausbekommen warum.