AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Access Violation bei FindComponent

Ein Thema von Chrissi91 · begonnen am 16. Jan 2006 · letzter Beitrag vom 16. Jan 2006
Antwort Antwort
Seite 1 von 2  1 2      
Chrissi91

Registriert seit: 28. Jul 2005
849 Beiträge
 
#1

Access Violation bei FindComponent

  Alt 16. Jan 2006, 17:47
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.
Angehängte Grafiken
Dateityp: bmp fehlermeldung_186.bmp (221,3 KB, 10x aufgerufen)
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Access Violation bei FindComponent

  Alt 16. Jan 2006, 17:53
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]
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Chrissi91

Registriert seit: 28. Jul 2005
849 Beiträge
 
#3

Re: Access Violation bei FindComponent

  Alt 16. Jan 2006, 18:07
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?
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#4

Re: Access Violation bei FindComponent

  Alt 16. Jan 2006, 18:24
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.
Andreas
  Mit Zitat antworten Zitat
Chrissi91

Registriert seit: 28. Jul 2005
849 Beiträge
 
#5

Re: Access Violation bei FindComponent

  Alt 16. Jan 2006, 18:33
Ich glaube ich bin zu blöd dazu.

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.
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Access Violation bei FindComponent

  Alt 16. Jan 2006, 18:38
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
  Mit Zitat antworten Zitat
Chrissi91

Registriert seit: 28. Jul 2005
849 Beiträge
 
#7

Re: Access Violation bei FindComponent

  Alt 16. Jan 2006, 19:03
Ups, danke, habe ich übersehen.

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.
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#8

Re: Access Violation bei FindComponent

  Alt 16. Jan 2006, 19:08
Abgesehen davon, dass FindComponent sowieso schrecklich ist und dein Code wirklich nicht übersichtlich ist, wird bei jedem Aufruf nochmals in Components nach deinem Label gesucht. Etwas redundant, nicht ?
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Access Violation bei FindComponent

  Alt 16. Jan 2006, 19:11
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Chrissi91

Registriert seit: 28. Jul 2005
849 Beiträge
 
#10

Re: Access Violation bei FindComponent

  Alt 16. Jan 2006, 19:26
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:44 Uhr.
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