Shapes ansprechen



  • Hallo miteinander,

    Ich verzweifel gerade an meinem Programm. Folgendes Problem und zwar
    spreche ich verschiedene Shapes in einer Schleife an aber bei dem 99-igsten
    Schleifendurchlauf wenn ich dass 101-ste Shape ansprechen bekomme ich eine Zugriffsverletzung. Mit meinen Werten is aber alles in Ordnung. Die Fehlermeldung kommt ab dem Zeitpunkt wo ich aufs Shape zugreife. Kann mir vielleicht jemand helfen?

    Grüße Andy

    Fehlermeldung:
    http://img291.imageshack.us/img291/4121/fehlermeldungnt.jpg

    Quellcode:

    do
     {
    
      ...
    
      dynamic_cast<TShape*>(Form2->Components[i+2])->Visible = true;
      dynamic_cast<TShape*>(Form2->Components[i+2])->Left = koordinate_x + 347;
      dynamic_cast<TShape*>(Form2->Components[i+2])->Top = 322 - koordinate_y;
    
      i++;
    
     }while(i<Form1->Memo1->Lines->Count);
    


  • Punkt 1: nur einmal casten.
    Punkt 2: wer sagt das die i+2. Komponente wirklich ein Shape ist? evtl. zwischendurch nen Button erstellt?
    Punkt 3: Wo prüfst du, das Komponente i+2 wirklich vom Typ Shape ist? (wozu dynamic_cast, wenn man die info ob / ob nicht doch nicht nutzen möchte?)

    mfg
    xXx



  • Hallo

    Alles was die Fehlermeldung sagt, ist, das du auf ungültigen Speicher zugreifst. Die von die genannten Zeilen bieten dafür zwei Möglichkeiten :
    - (i + 2) >= Form2->Components->Count
    - Das Element i + 2 ist gar kein TShape. In Components stehen ja nicht nur TShapes, sondern auch alle anderen Elemente deines Forms.

    Und wenn du schon dynamic_cast einsetzt, solltest du auch prüfen ob das Ergebnis nicht NULL ist

    TShape* s
    do
     {
    
      ...
    
      s = dynamic_cast<TShape*>(Form2->Components[i+2]);
      if (s)
      {
        s->Visible = true;
        s->Left = koordinate_x + 347;
        s->Top = 322 - koordinate_y;
      }
      i++;
    
     }while(i<Form1->Memo1->Lines->Count);
    

    bis bald
    akari



  • Danke für die schnellen Antworten. Das Element war scho von TShape und meine Zählfolge hat auch gestimmt. Ich hab jetzt denk Code von dir Akari mal abgeschrieben und jetzt gehts. Kommt keine Meldung mehr vllt lag es iwie daran.

    Danke



  • Hallo

    Wenn mein Code dir geholfen hat, dann gibt es in deinem Components mindestens ein Element, das nicht TShape ist.

    bis bald
    akari



  • while(i<Form1->Memo1->Lines->Count)
    

    Was hat denn die Anzahl der Zeilen im Textfeld mit der Anzahl der Komponenten auf dem Formular zu tun? 🙂



  • naja ich hab für jede Zeile ein Shape 😉



  • Hallo

    Um solche Probleme in Zukunft zu vermeiden, solltest du deine Shapes besser nicht über Components sammeln, sondern in einem extra Array. Vorteile : Es beinhaltet dann bereits Elemente von Typ TShape, du must nicht mehr casten und prüfen. Und es sind nur genau die Shapes im Array, die du selber für diesen Zweck erstellt hast. Nachteil : du must dieses Array selber füllen und beim Löschen des Arrays must du manuell auch das Element aus dem Array entfernen.
    Mehr dazu findest du in der FAQ hier im Forum, Abschnitt Komponenten benutzen, Beitrag Dynamische Arrays von Komponenten.

    bis bald
    akari


Anmelden zum Antworten