Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Zugriffsfehler bei eigner Funktion (https://www.delphipraxis.net/37513-zugriffsfehler-bei-eigner-funktion.html)

plautzer 6. Jan 2005 17:44


Zugriffsfehler bei eigner Funktion
 
Hi,

ich speichere geänderte reihen aus stringgrid in einem label und diese später wieder benutzten zu können. Da ich keine doppelten reihen zu lassen will, habe ich mir eine funktion gebastelt:

Delphi-Quellcode:
var
a:array of integer;
zahl:integer;
Delphi-Quellcode:
function TForm1.posproof(label_zahl,reihe:integer):boolean;
var zahl:integer;
begin
if label_zahl > 1 then
  begin
    zahl:=1;
    while zahl < label_zahl do
      begin
      if reihe= a[zahl] then
      begin
      result:=true;
      exit;
      end
      else zahl:=zahl+1;
   end;
   result:=false;
end
else result:=false;
end;
und hier die prozedur um die reihen zu speichern:

Delphi-Quellcode:
procedure TForm1.stringgrid1SetEditText(Sender: TObject; ACol,
  ARow: Integer; const Value: Strin

g);
begin
if posproof(strtoint(label1.Caption),stringgrid1.Row) = false then
begin
setlength(a,2);
zahl:=strtoint(label1.Caption);
a[zahl]:=stringgrid1.Row;
label1.Caption:=inttostr(zahl+1);
end;
end;
Nun zu meinen problemen:

1) Die zweite zahl, die immer gespeichert wird, ist immer eine utopische (996855217). kA warum? habt ihr einen rat?
2) Es kommt immer ein Error: "zugriffverletzung...."

Stimmt irgentwas mit einem code nicht?

Plautzer

Keldorn 6. Jan 2005 17:52

Re: Zugriffsfehler bei eigner Funktion
 
du hast hier
Delphi-Quellcode:
function TForm1.posproof(label_zahl,reihe:integer):boolean;
var zahl:integer;
zahl nochmal deklariert, der compiler wird dir auch sagen, das der auf zahl zugewiesene Wert niemals benutzt wird. damit verwendest du hier nicht die global angelegte Variable zahl und da du sonst nirgends der globalen Variable Zahl etwas zuweist, hat sie halt irgendeinen Wert.

Mfg Frank

plautzer 6. Jan 2005 18:20

Re: Zugriffsfehler bei eigner Funktion
 
joa stimmt, aber leider hat das nichts problem geändert.

Plautzer

Jens Schumann 6. Jan 2005 18:29

Re: Zugriffsfehler bei eigner Funktion
 
Zitat:

Zitat von plautzer
joa stimmt, aber leider hat das nichts problem geändert.

Plautzer

Es sieht aber immer noch so aus, dass Dein Problem genau aus dem
besteht was Keldorn oben geschrieben hat. Da Du Deinen Source ja scheionbar geändert hast,
könntest Du ihn ja hier mal zeigen. Macht die Sache einfacher.

P.S. Das kommt davon wenn man globale Variablen verwendet.

plautzer 6. Jan 2005 18:55

Re: Zugriffsfehler bei eigner Funktion
 
Hi,

an der globalen deklaraition hats auch net gelegen.

Mein code:
Delphi-Quellcode:
function TForm1.posproof(label_zahl,reihe:integer):boolean;
begin
if label_zahl > 1 then
  begin
    zahl:=1;
    while zahl < label_zahl do
      begin
      if reihe= a[zahl] then
      begin
      result:=true;
      exit;
      end
      else zahl:=zahl+1;
   end;
   result:=false;
end
else result:=false;
end;
Genau gesagt sind es zwei fehlermeldung: einmal "accessviolation" und zum anderen "Setpointer ungültig".

Plautzer

Keldorn 6. Jan 2005 19:02

Re: Zugriffsfehler bei eigner Funktion
 
ehrlich gesagt seh ich bei dir überhaupt nicht mehr durch. Bei posproof rechnest du mit zahl, zum schluß sthet noch zahl:=zahl+1 warum? wird nie gebraucht, unabhängig davon, ob du zahl lokal oder global deklarierst.
bei SetEditText rechnset du auch wieder mit der zahl :gruebel:

welche zahl hat denn label1.caption? und wenn du bei posproof schoin mit dem array a arbeitest, wo wird das schonmal angelegt? geh mal deinen code einzeln durch und setz dir haltepunkte und kontollier die werte.

plautzer 6. Jan 2005 20:14

Re: Zugriffsfehler bei eigner Funktion
 
Gut, ich versuche mal meine Gehirngänge darzulegen:

label1 hat den start 1.

also wenn die funktion das erst mal durchlaufen wird, dann sie gleich auf false gesetz:

Delphi-Quellcode:
[b]if label_zahl > 1 then
  begin[/b]
    zahl:=1;
    while zahl < label_zahl do
      begin
      if reihe= a[zahl] then  //es wird geprüft ob die reihe schonmal gespeichert wurde
      begin
      result:=true;          //Bed. erfüllt, + verlassen der schleife
      exit;
      end
      else zahl:=zahl+1;     // Bed. nicht erfüllt: zahl wird erhöht um die folgenden arrays zu prüfen
   end;
   result:=false;  //falls keine zahlen übereinstimmen-> bed. stimmen nicht überein
[b]end
else result:=false;[/b]
end;
und somit zuerst einmal das array deklariert und den Wert von dem Label übergeben:

Delphi-Quellcode:
if posproof(strtoint(label1.Caption),stringgrid1.Row) = false then
begin
setlength(a,2);
zahl:=strtoint(label1.Caption);  //zahl wird jedes mal definiert
a[zahl]:=stringgrid1.Row;
label1.Caption:=inttostr(zahl+1); //zahl wird erhöht
end;
der Wert der variable 'zahl' wird immer kurz vorm ausführen eines prozesses definiert, so sollte es also keine Konflikte geben.


Plautzer

Keldorn 6. Jan 2005 20:30

Re: Zugriffsfehler bei eigner Funktion
 
jetzt dämmerts langsam.

Delphi-Quellcode:
if posproof(strtoint(label1.Caption),stringgrid1.Row) = false then
begin
setlength(a,2); //2)
zahl:=strtoint(label1.Caption);  //zahl wird jedes mal definiert
a[zahl]:=stringgrid1.Row;        //3)
label1.Caption:=inttostr(zahl+1); //zahl wird erhöht , 1)
end;
1) du erhöhst aber nur die zahl
2) dein array hat aber immer die Länge 2
3) wenn die zahl=2 ist, schepperts hier, weil du aufs 3. element zugreifst, das existiert aber gar nicht.

setlength(a,stringgrid.rowcount), mach dein array so groß wie dein grid.

plautzer 6. Jan 2005 20:56

Re: Zugriffsfehler bei eigner Funktion
 
achso, das hatte ich wohl falsch verstanden!

Vielen Dank, jetzt funktioniert es endlich.

Plautzer


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:03 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