Delphi-PRAXiS
Seite 1 von 2  1 2      

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:08 Uhr.
Seite 1 von 2  1 2      

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