![]() |
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:
und hier die prozedur um die reihen zu speichern:
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;
Delphi-Quellcode:
Nun zu meinen problemen:
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; 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 |
Re: Zugriffsfehler bei eigner Funktion
du hast hier
Delphi-Quellcode:
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.
function TForm1.posproof(label_zahl,reihe:integer):boolean;
var zahl:integer; Mfg Frank |
Re: Zugriffsfehler bei eigner Funktion
joa stimmt, aber leider hat das nichts problem geändert.
Plautzer |
Re: Zugriffsfehler bei eigner Funktion
Zitat:
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. |
Re: Zugriffsfehler bei eigner Funktion
Hi,
an der globalen deklaraition hats auch net gelegen. Mein code:
Delphi-Quellcode:
Genau gesagt sind es zwei fehlermeldung: einmal "accessviolation" und zum anderen "Setpointer ungültig".
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; Plautzer |
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. |
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:
und somit zuerst einmal das array deklariert und den Wert von dem Label übergeben:
[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;
Delphi-Quellcode:
der Wert der variable 'zahl' wird immer kurz vorm ausführen eines prozesses definiert, so sollte es also keine Konflikte geben.
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; Plautzer |
Re: Zugriffsfehler bei eigner Funktion
jetzt dämmerts langsam.
Delphi-Quellcode:
1) du erhöhst aber nur die zahl
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; 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. |
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