Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Access Violation bei FindComponent (https://www.delphipraxis.net/61067-access-violation-bei-findcomponent.html)

Chrissi91 16. Jan 2006 17:47


Access Violation bei FindComponent
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi :hi:,

ich bin gerade dabei, ein eigentlich simples LottoTippProgramm zu schreiben. Allerdings hat es so seine Macken.

Delphi-Quellcode:
var
  frmMain: TfrmMain;
  lottozahlen: array [1..49] of integer;
  durchlaeufe: integer;

implementation

{$R *.dfm}

procedure MixNumber(Anzahl: Integer);
var
 i, a, zwischenspeicher: integer;
begin
 for i:= 1 to 49 do lottozahlen[i]:=i;
 for a:= 1 to Anzahl do
  begin
   for i:= 1 to 49 do
    begin
     zwischenspeicher:=random(49)+1;
     lottozahlen[zwischenspeicher]:=i;
     lottozahlen[i]:=zwischenspeicher;
    end;
  end;
end;

procedure TfrmMain.FormCreate(Sender: TObject);
begin
 Durchlaeufe:=0;
 randomize;
end;

procedure TfrmMain.btnRandomClick(Sender: TObject);
var
 Getippte_Zahlen: Array [1..6] of integer;
 i: integer;
begin
 MixNumber(10);
 if durchlaeufe > 0 then
  begin
   for i:= 1 to 6 do
    begin
     TLabel(FindComponent('label'+inttostr(Getippte_Zahlen[i]))).Font.color:=clblack; //Hier kommt die Fehlermeldung beim 2. Tippen.
     TLabel(FindComponent('label'+inttostr(Getippte_Zahlen[i]))).Font.size:=14;
     TLabel(FindComponent('label'+inttostr(Getippte_Zahlen[i]))).Top:=TLabel(FindComponent('label'+inttostr(Getippte_Zahlen[i]))).Top+2;
     TLabel(FindComponent('label'+inttostr(Getippte_Zahlen[i]))).Left:=TLabel(FindComponent('label'+inttostr(Getippte_Zahlen[i]))).Left+2;
    end;
  end;

 for i:= 1 to 6 do
  begin
   Getippte_Zahlen[i]:=Lottozahlen[i];
   TLabel(FindComponent('label'+inttostr(lottozahlen[i]))).Font.color:=clred;
   TLabel(FindComponent('label'+inttostr(lottozahlen[i]))).Font.size:=18;
   TLabel(FindComponent('label'+inttostr(lottozahlen[i]))).Top:=TLabel(FindComponent('label'+inttostr(lottozahlen[i]))).Top-2;
   TLabel(FindComponent('label'+inttostr(lottozahlen[i]))).Left:=TLabel(FindComponent('label'+inttostr(lottozahlen[i]))).Left-2;
  end;

 Durchlaeufe:=Durchlaeufe+1;
end;
Die Fehlermeldung ist im Anhang. Wahrscheinlich ist es ein logischer Fehler. Deshalb habe ich es auch schon mit Breakpoints versucht und Zwischenwerte ausgegeben. Aber ich konnte den Fehler trotzdem nicht finden.

Christian Seehase 16. Jan 2006 17:53

Re: Access Violation bei FindComponent
 
Moin Christopher,

Du sollest Dir beim FindComponent erst einmal den Wert in eine Variable schreiben, und diese dann auf gültigen Inhalt prüfen, bevor Du sie benutzt, wenn Du nicht sicher sein kannst, dass die Komponente auch gefunden werden kann.

[EDIT]
Du kannst Dir dann ja mal die Werte ausgeben lassen, für die die Label nicht gefunden werden, um dem Fehler auf die Spur zu kommen.
[/EDIT]

Chrissi91 16. Jan 2006 18:07

Re: Access Violation bei FindComponent
 
Tatsache. Sie sind ale 0, aber warum?

Die Getippten_Zahlen sind im 2.Durchgang alle 0. Dabei schreibe ich doch in die Procedure beim 1.Durchlauf:

Delphi-Quellcode:
 for i:= 1 to 6 do
  begin
   Getippte_Zahlen[i]:=Lottozahlen[i];
   TLabel(FindComponent('label'+inttostr(lottozahlen[i]))).Font.color:=clred;
   TLabel(FindComponent('label'+inttostr(lottozahlen[i]))).Font.size:=18;
   TLabel(FindComponent('label'+inttostr(lottozahlen[i]))).Top:=TLabel(FindComponent('label'+inttostr(lottozahlen[i]))).Top-2;
   TLabel(FindComponent('label'+inttostr(lottozahlen[i]))).Left:=TLabel(FindComponent('label'+inttostr(lottozahlen[i]))).Left-2;
  end;
Bin ich heute zu blöd dafür? :gruebel:

shmia 16. Jan 2006 18:24

Re: Access Violation bei FindComponent
 
Grausam!! Fällt dir nichts auf, wenn du den gleichen Code 5 Mal hinschreibst ?
Nicht bös gemeint, musste aber gesagt werden.
Du brauchst einfach eine Zwischenvariable:
Delphi-Quellcode:
var
   c : TComponent;
for i:= 1 to 6 do
  begin
   Getippte_Zahlen[i]:=Lottozahlen[i];
   c := FindComponent('label'+inttostr(lottozahlen[i]));
   if Assigned(c) then
   begin
   TLabel(c).Font.color:=clred;
   TLabel(c).Font.size:=18;
   TLabel(c).Top:=TLabel(c).Top-2;
   ...
  end;
Mit einer 2. Variablen vom Typ TLabel geht's noch leichter.

Chrissi91 16. Jan 2006 18:33

Re: Access Violation bei FindComponent
 
Ich glaube ich bin zu blöd dazu. :gruebel:

Delphi-Quellcode:
for i:= 1 to 6 do
  begin
   Getippte_Zahlen[i]:=Lottozahlen[i];
   c := FindComponent('label'+inttostr(lottozahlen[i]));
   if Assigned(c) then
    begin
     TLabel(FindComponent('label'+inttostr(lottozahlen[i]))).Font.color:=clred;
     TLabel(FindComponent('label'+inttostr(lottozahlen[i]))).Font.size:=18;
     TLabel(FindComponent('label'+inttostr(lottozahlen[i]))).Top:=TLabel(FindComponent('label'+inttostr(lottozahlen[i]))).Top-2;
     TLabel(FindComponent('label'+inttostr(lottozahlen[i]))).Left:=TLabel(FindComponent('label'+inttostr(lottozahlen[i]))).Left-2;
    end;
  end;
Nicht hauen, aber ich verstehe nicht, was ich jetzt wieder falsch mache.

omata 16. Jan 2006 18:38

Re: Access Violation bei FindComponent
 
Moin,

wie wäre es wenn du c dann auch benutzt?

Delphi-Quellcode:
for i:= 1 to 6 do
  begin
   Getippte_Zahlen[i]:=Lottozahlen[i];
   c := FindComponent('label'+inttostr(lottozahlen[i]));
   if Assigned(c) then
    begin
     TLabel(c).Font.color:=clred;
     TLabel(c).Font.size:=18;
     TLabel(c).Top:=TLabel(c).Top-2;
     TLabel(c).Left:=TLabel(c).Left-2;
    end;
  end;
Edit:
So wäre es allerdings etwas besser...
Delphi-Quellcode:
var c:TObject;
    Label:TLabel;
for i:= 1 to 6 do begin
  Getippte_Zahlen[i]:=Lottozahlen[i];
  c := FindComponent('label'+inttostr(lottozahlen[i]));
  if Assigned(c) and (c is TLabel) then begin
    Label:=TLabel(c);
    Label.Font.color:=clred;
    Label.Font.size:=18;
    Label.Top:=Label.Top-2;
    Label.Left:=Label.Left-2;
  end;
end;

MfG
Thorsten

Chrissi91 16. Jan 2006 19:03

Re: Access Violation bei FindComponent
 
Ups, danke, habe ich übersehen. :lol:

Versuch ich mal. ^^

Aber warum brauch ich eine Zwischenablage? Es sieht doch so ganz logisch aus...

P.S.:

Ich glaube ich erhänge mich gleich.

Delphi-Quellcode:
procedure TfrmMain.btnRandomClick(Sender: TObject);
var
 Getippte_Zahlen: Array [1..6] of integer;
 i: integer;
 c: TObject;
 Label2: TLabel;
begin
 MixNumber(10);
 if durchlaeufe > 0 then
  begin
   for i:= 1 to 6 do
    begin
     if Assigned(c) and (c is TLabel) then
      begin
       Label2:=TLabel(c);
       Label2.Font.color:=clblack;
       Label2.Font.size:=14;
       Label2.Top:=Label2.Top+2;
       Label2.Left:=Label2.Left+2;
      end;
     end;
   end;
 for i:= 1 to 6 do
  begin
   Getippte_Zahlen[i]:=Lottozahlen[i];
   c := FindComponent('label'+inttostr(lottozahlen[i]));
   if Assigned(c) and (c is TLabel) then
    begin
     Label2:=TLabel(c);
     Label2.Font.color:=clred;
     Label2.Font.size:=18;
     Label2.Top:=Label2.Top-2;
     Label2.Left:=Label2.Left-2;
    end;
  end;
 Durchlaeufe:=Durchlaeufe+1;
end;
Selber Fehler.

Khabarakh 16. Jan 2006 19:08

Re: Access Violation bei FindComponent
 
Abgesehen davon, dass FindComponent sowieso schrecklich ist :wink: und dein Code wirklich nicht übersichtlich ist, wird bei jedem Aufruf nochmals in Components nach deinem Label gesucht. Etwas redundant, nicht :wink: ?

SirThornberry 16. Jan 2006 19:11

Re: Access Violation bei FindComponent
 
erstens aus performancegründen (weil FindComponent langsamer ist als der Zugriff auf die Komponente) und zweitens um zu prüfen ob die Komponente auch wirklich gefunden wurde oder ob die zwischenvariable dann nil ist etc.

Chrissi91 16. Jan 2006 19:26

Re: Access Violation bei FindComponent
 
Sehe ich ein. Ich würde ja von FindComponent absehen, wenn es erstmal funktionieren würde. Ich gebe nicht so leicht auf, auch wenns net klappt. ich habe ja noch ein paar jahre zu leben, um den fehler zu finden. :-D

omata 16. Jan 2006 19:26

Re: Access Violation bei FindComponent
 
Welcher Fehler? Welche Zeile?

Delphi-Quellcode:
procedure TfrmMain.btnRandomClick(Sender: TObject);
var
  Getippte_Zahlen: Array [1..6] of integer;
  i: integer;
  c: TObject;
  Label2: TLabel;
begin
  MixNumber(10);
  if durchlaeufe > 0 then begin
    for i:= 1 to 6 do begin
      if Assigned(c) and (c is TLabel) then begin
        Label2:=TLabel(c);
        Label2.Font.color:=clblack;
        Label2.Font.size:=14;
        Label2.Top:=Label2.Top+2;
        Label2.Left:=Label2.Left+2;
      end;
    end;
  end;

  for i:= 1 to 6 do begin
    Getippte_Zahlen[i]:=Lottozahlen[i];
    c := FindComponent('label'+inttostr(lottozahlen[i]));
    if Assigned(c) and (c is TLabel) then begin
      Label2:=TLabel(c);
      Label2.Font.color:=clred;
      Label2.Font.size:=18;
      Label2.Top:=Label2.Top-2;
      Label2.Left:=Label2.Left-2;
    end;
  end;
  Durchlaeufe:=Durchlaeufe+1;
end;
Tu uns und dir doch bitte den Gefallen und rücke ordentlich ein.

Wo wird den im ersten Teil c initalisiert?

MfG
Thorsten

Chrissi91 16. Jan 2006 19:37

Re: Access Violation bei FindComponent
 
Beim 1. Tippenwird am Ende c zugewiesen. Beim 2. Tippen ist es doch immer noch zugewiesen, oder etwa nicht?

Im 1.Beitrag habe ich geschrieben wo der fehler ist. In allen anderen Beiträgen habe ich auch erwähnt, dass der Fehler immer noch der Gleiche ist.

omata 16. Jan 2006 19:42

Re: Access Violation bei FindComponent
 
Ja, das da eine Access Violation raus kommt ist klar. Die Frage ist eher wo, sprich in welcher Zeile.

Und der Code aus dem Ursprungsthread hat nicht mehr viel mit dem Code weiter unten in diesem Thread zu tun. Wie gesagt wo wird c (im ersten Bereich deiner Prozedur) initialisiert?
Ich habe deinen Code extra anders eingerückt, damit du selber drauf kommst.

Thorsten

Chrissi91 16. Jan 2006 19:56

Re: Access Violation bei FindComponent
 
Also.

Es funktioniert jatzt, auch so wie es vorher war. Ich habe nur vergessen, das Array Getippte_Zahlen global (Heißt das so?) zu deklarieren.

Die Access Violation kam ohne das trotzdem immer an der selben STelle, wie ich in jedem meiner Beiträge extra darauf hingewiesen habe.

omata 16. Jan 2006 20:00

Re: Access Violation bei FindComponent
 
Schön, dass es jetzt geht.

Zitat:

Zitat von Chrissi91
Die Access Violation kam ohne das trotzdem immer an der selben STelle, wie ich in jedem meiner Beiträge extra darauf hingewiesen habe.

Ja? dann bin ich blind.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:27 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz