Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Zugriffsverletzung beim dynamischen Zugriff auf TCheckBox


bf109g.01 - Di 23.03.10 19:45
Titel: Zugriffsverletzung beim dynamischen Zugriff auf TCheckBox
Meine Idee: Ich habe 6 Checkboxen von denen jede für einen bestimmten Typ steht.
Wenn jetzt bei einer bereits abgehackten Checkbox der Haken manuell entfernt wird, soll der zugehörige Typ der jeweiligen Checkbox ermittelt werden, damit ich den weiterverarbeiten kann.
Allerdings gibt es schon bevor ich die Prozedur überhaupt aufrufe, Probleme und eine Fehlermeldung bei Zeile 9.
Zugegeben, die Konstruktion ist etwas abenteuerlich, aber ich sehe nicht, warum die nicht funktionieren sollte...

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm6.cb1Click(Sender: TObject);
var typ: string;
      I: Integer;
begin
  if (Sender as TCheckBox).Checked = true then
    begin
      (Sender as TCheckBox).Checked:= false;
      
      for I := 1 to 6 do
        if (Sender as TCheckBox).Name = TCheckbox(Form6.FindComponent('CB'+inttostr(i))).name then
          case i of
            0: typ:='..';
            {...}
            4: typ:='...';
          end;


Dank euch.

Edit: Habs wieder schon selbst. Die for-Schleife geht bis 6, allerdings gibt es nur 5 Objekte, da kommt der Fehler her.

Was ich allerdings nciht verstehe ist, warum, sobald die Prozedur einfach nur da ist, ohne dass sie durch den benötigten Klick auf cb1 aufgerufen wird, der Haken der Checkbox cb1 einfach nicht mehr gesetzt / bzw sofort wieder entfernt wird.

Kann es sein, dass wenn eine andere Prozedur cb1.checked:=true; ausführt, dieser Befehl dann gleichzeitig "procedure cb1click" auslöst? Anders kann ich mir das jetzt nicht erklären...

Moderiert von user profile iconNarses: Titel geändert, war: "ZUgriffsverletzung, verstehe den Fehler nicht... :(".


Jakob_Ullmann - Di 23.03.10 19:48

Was sind denn diese "Probleme"?


bf109g.01 - Di 23.03.10 19:56

user profile iconJakob_Ullmann hat folgendes geschrieben Zum zitierten Posting springen:
Was sind denn diese "Probleme"?

"EAccessViolation mit der Meldung 'Zugriffsverletzung bei Adresse 0048D175 in Modul Seafight.exe'." Wenn es dich glücklich macht. Wie ich das genauer ausdifferenziert hinschreiben soll, weiß ich nicht.
Hat sich aber schon erledigt (s.o.Edit).


Jakob_Ullmann - Di 23.03.10 20:04

zu deinem EDIT: Was hast du erwartet? Du prüfst, ob die checkbox gecheckt ist, und falls ja, wird sie "entcheckt". (abgesehen davon, dass man nie auf True vergleichen sollte! TCheckBox.Checked ist schon Boolean.)


Marc. - Di 23.03.10 20:04

user profile iconbf109g.01 hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
  if (Sender as TCheckBox).Checked = true then                    

Der Vergleich mit Booleanwerten sollte dringenst vermieden werden.
Warum das so ist, siehe http://www.delphi-forum.de/viewtopic.php?p=548760#548760 und http://www.delphi-treff.de/tutorials/objectpascal/programmierung-mit-boolean-werten/page/4/ ;)

Darüber hinaus bietet es sich an, die Funktionen Low() und High() zur dynamischen Bestimmung der Array-Länge zu verwenden. :zustimm:


ALF - Di 23.03.10 20:06

user profile iconbf109g.01 hat folgendes geschrieben Zum zitierten Posting springen:
Kann es sein, dass wenn eine andere Prozedur cb1.checked:=true; ausführt, dieser Befehl dann gleichzeitig "procedure cb1click" auslöst? Anders kann ich mir das jetzt nicht erklären...

Nein,
es sei denn, das Du wo anders im Quelltext noch mal cb1.checked:=false drin hast!
aussversehen!?
Gruss Alf

Moderiert von user profile iconNarses: Zitat-Syntax korrigiert.


Narses - Di 23.03.10 21:11

Moin!

user profile iconALF hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconbf109g.01 hat folgendes geschrieben Zum zitierten Posting springen:
Kann es sein, dass wenn eine andere Prozedur cb1.checked:=true; ausführt, dieser Befehl dann gleichzeitig "procedure cb1click" auslöst? Anders kann ich mir das jetzt nicht erklären...

Nein,
Doch doch, genau so ist es, Zuweisung auf .Checked einer TCheckBox löst auch das OnClick-Ereignis aus. ;)

Hier gibt´s nochmal Details [http://www.delphi-library.de/topic_Zustand+von+TCheckBox+setzen+ohne+OnClick+auszuloesen_91692.html]. :idea:

cu
Narses


ALF - Di 23.03.10 21:23

:oops: hab ich das doch verwechselt mit meinem Menu.checked!
Sooorry :?
Gruss ALf