Button und OnClick = Fehler
-
Ich hab da ma nen großes Problem:
public: void show(TForm* F)
{
for(int i=0; i<termine.size();i++)
{
TButton* button=new TButton(F);
button->Parent=F;
button->Caption="Ändern";
button->SetBounds(450,32+60*i,75,25);
button->Name="b"+IntToStr(i);
button->OnClick=ButtonClick;
}
//Hier läufts noch
}
};
public: void __fastcall ButtonClick(TObject Sender)
{
String n = ((TButton)Sender)->Name;
int c=StrToInt(n.SubString(2,1));
n.Delete(2,1);
//irgendwann passiert hier noch was
show(this); //FEHLER!!!!!
};Das Problem liegt hier darin, das ich in der Methode "ButtonClick" wierde show()
aufrufe!
Beides alleine funzt super(show() alleine oder ButtonClick ohne show()).
Aber sobald ich show() in ButtonClick schreibe läuft das Programm bis zu dem Augenblick wo ich show() wieder verlasse und das Ende von ButtonClick erreiche.
Ich hab das mit ShowMessage() nach jeder Zeileauspropiert wo der Fehler entsteht.
Ich hoffe das einer ne gute idee hat
wichtig ist nur das ich unterscheide von welchem Button der Click kam!!
Der Fehler schimpft sich EAccessViolationViel Spass bei der Lösung
-
Es wird versucht, das Objekt button in der Liste mehrmals zu erstellen!
Da es aber schon nach dem ersten Ablauf besteht, kannst du nicht noch eins mit
dem Namen erstellen. Soll heißen: Ich würde nen DynamicArray benutzen.
Wenn du nicht weißt, wie du das machst, gucke in die Faq.
Man kann natürlich auch noch was anderes machen, aber mir fällt jetzt grad
nichts anderes ein.MFG Aoeke
-
Jetzt hab ich doch glatt noch nen Stück code vergessen:
public: void ClearAll(TForm* c) { while(c->ComponentCount>18) { for(int i=0; i<c->ComponentCount; ++i) { if(!c->Components[i]->ClassNameIs("TMenuItem")&& !c->Components[i]->ClassNameIs("TMainMenu")) delete(c->Components[i]); } } };
wird jedesmal als erstes in show() ausgeführt.
hatte ich völlig vergesse zu Posten....
-
Hallo,
Ich denk mal das
delete(c->Components[i]);
ein Problem darstellt. Du gibst zwar den Speicherbereich frei auf den dein Buttonpointer zeigt entfernst ihn aber nicht aus der ComponentList.
Schau mal in der Hilfe unter RemoveComponent nach.Ach so, ich würd die Buttons auch lieber in einer List verwalten, da gibt es ja viele Möglichkeiten (TComponentList, DynamicArray, vector etc.). Als Identifikation ist auch die Tag Eigenschaft des Buttons verwendbar.
Ciao
[ Dieser Beitrag wurde am 15.04.2003 um 17:46 Uhr von Braunstein editiert. ]
-
Ich mag mich täuschen, aber ich denke doch das der Button aus der Componentenliste verschwindet, wenn ich ihn dann neu erstelle gibts ja keine Fehlermeldung "Butto b0 exestiert schon". Die hatte ich mal als ich das ClearAll vergessen hatte. Weg ist der denke ich schon.
Ich befürchte es liegt eher daran, das ich mich noch in der Methode OnClick befinde während ich sie nem Button zuweise, da ich den Fehler ja erst erhalte wenn show() fertig mit der arbeit ist.
Ich hab am ende von ButtonClick ne ShowMessage() die ich auch noch sehe, wenn ich da dann auf OK klicke gibbets nen Fehler. Da sollte aber eigendlich nichts mehr gemacht werden. Genauso kann ich 100x show aufrufen ohne das was passiert, nur wenn ButtonClick aufgerufen wird gibts !danach! nen Fehler.
*denkoppschüttelundeinstoßgebetzumhimmelschick*
-
Natürlich gibts dann keine Fehlermeldung, da der Button b0 (oder so ähnlich) nicht mehr existiert. Du wirst aber einen ungültigen Pointer in deiner ComponentList haben. Kann sein das es dann einen Fehler gibt wenn die Form versucht den zu löschen. Hast du mal geschaut ob sich nach dem delete dein ComponentCount verringert ?
-
Ja das ist der Fall
while(c->ComponentCount<18)
Ich habe 18 MenuItems, heißt er löscht alles bis auf die Menüs. Wenn delet nich funzen würde hätte ich da ne endlosschleife.
-
FEHLER hab mich gerade verschrieben
while(c->ComponentCount>18)
so muss es heißen