H
Braunstein schrieb:
Wenn du dir sicher bist, dass du den Typ des Objektes in Sender genau kennst, kannst du auch statt dynamic_cast einen static_cast verwenden und die Prüfung auf 0 weglassen. Falls es aber nicht stimmt, bekommst du interessante Fehlermeldungen.
Ich denke mal es kommt im schlimmsten Fall eine Speicherzugriffsverletzung.
Ich würde das ganze etwas anders Formulieren, in deinem Kommentar sieht es so aus
als ob bei beiden Cast Arten im Fehler Fall ein NULL Pointer zurückgegeben
wird "kannst du auch statt dynamic_cast einen static_cast verwenden und die Prüfung auf 0 weglassen."
Natürlich kommt im beim static_cast im Fehlerfall kein NULL Pointer zurück.
. Wenn du die zu castende Variable mehrfach benötigst erzeuge dir eine temporäre Variable und verwende dann diese
Bsp. statt
((TPanel*)Alarme->Items[Index])->Parent = AlarmBox;
((TPanel*)Alarme->Items[Index])->Alignment = taLeftJustify;
((TPanel*)Alarme->Items[Index])->Height = PANEL_HEIGHT;
((TPanel*)Alarme->Items[Index])->Width = PANEL_WIDTH;
((TPanel*)Alarme->Items[Index])->Top = PANEL_TOP+(TextIndex*20);
((TPanel*)Alarme->Items[Index])->Left = PANEL_LEFT;
lieber
TPanel* panel = dynamic_cast<TPanel*>(Alarme->Items[Index]);
if( panel )
{
panel->Parent = AlarmBox;
panel->Alignment = taLeftJustify;
panel->Height = PANEL_HEIGHT;
panel->Width = PANEL_WIDTH;
panel->Top = PANEL_TOP+(TextIndex*20);
panel->Left = PANEL_LEFT;
// usw.
Warum denn.
Alarme->Items[Index] = new TPanel(this);
((TPanel*)Alarme->Items[Index])->Parent = AlarmBox;
((TPanel*)Alarme->Items[Index])->Alignment = taLeftJustify;
((TPanel*)Alarme->Items[Index])->Height = PANEL_HEIGHT;
((TPanel*)Alarme->Items[Index])->Width = PANEL_WIDTH;
((TPanel*)Alarme->Items[Index])->Top = PANEL_TOP+(TextIndex*PANEL_HEIGHT);
((TPanel*)Alarme->Items[Index])->Left = PANEL_LEFT;
((TPanel*)Alarme->Items[Index])->Caption = AnsiString().sprintf(" %3d",Index)+" "+ (List+(TextIndex*29)); //
((TPanel*)Alarme->Items[Index])->OnMouseMove = MouseOnPanel;
((TPanel*)Alarme->Items[Index])->DoubleBuffered = true;
((TPanel*)Alarme->Items[Index])->Visible = true;
Hier Instanziere ich mir ein Panel Object und schreibe es gleich in das
List Object, nun greife ich mit einem C Style Cast auf den in der Liste
instanzierten Pointer des Panels zu. Ist doch OK so.
((TPanel*)Alarme->Items[Index])->Parent = AlarmBox;
Warum sollte ich hier nicht einen C Style Cast nehmen, ist doch kein Unterschied
zum static_cast in beiden Fällen wird der Pointer Typ nicht überprüft.
Zu meinem anfänglichem Problem, das habe ich nun so gelöst.
if( NULL != (TmpPanel = dynamic_cast<TPanel*>(((TCheckBox*)AlarmCheck->Items[Cb+(Index*5)])->Parent)) )
PanelCaption = TmpPanel->Caption.SubString(7,8);
if( !((1<<Cb)&Mask) || (PanelCaption == "Reserved") )
{
((TCheckBox*)AlarmCheck->Items[Cb+(Index*5)])->Enabled = false;
}