![]() |
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:
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.
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; |
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] |
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:
Bin ich heute zu blöd dafür? :gruebel:
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; |
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:
Mit einer 2. Variablen vom Typ TLabel geht's noch leichter.
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; |
Re: Access Violation bei FindComponent
Ich glaube ich bin zu blöd dazu. :gruebel:
Delphi-Quellcode:
Nicht hauen, aber ich verstehe nicht, was ich jetzt wieder falsch mache.
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; |
Re: Access Violation bei FindComponent
Moin,
wie wäre es wenn du c dann auch benutzt?
Delphi-Quellcode:
Edit:
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; 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 |
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:
Selber Fehler.
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; |
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: ?
|
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.
|
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 22:47 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