Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Zugriffsverletzung in Funktion (https://www.delphipraxis.net/113033-zugriffsverletzung-funktion.html)

if-else 1. Mai 2008 16:05


Zugriffsverletzung in Funktion
 
Hallo!
In der folgenden Funktion tritt eine Zugriffsverletzung auf...
Ich versuchte schon den Fehler allein zu finden, habe das aber nicht geschaft. Ich hoffe jemand von euch kann mir helfen? Vielen Dank!

Delphi-Quellcode:
procedure TForm2.addhistory;
var
fh : file of PData;
datap : PData;
y, posi,seekk : integer;
gefunden : boolean;
fname, filep : string;

begin

filep := OpenDialog1.FileName;

//Name der ausgewählten Datei auslesen
pos('.txt',filep);
y := 0;
repeat
  inc(y);
posi := pos('.txt',filep)-y;

until filep[posi] = '\';

fname := copy(filep,length(filep)-y-2,y-1);

gefunden := false;
seekk := 0;
 AssignFile(fh,'C:\WINDOWS\Voka_history.dat');
{$I-}

reset(fh);

repeat

  seek(fh,seekk);

  read(fh,datap);

  if (POS(fname,Datap.name) <> 0) then begin
    gefunden := true;
  end;
inc(seekk);
until eof(fh) or gefunden;

if not gefunden then begin
seek(fh,FileSize(fh)-1);
with datap do begin
  pfad := filep;
  name := fname;
end;
write(fh,datap);
closefile(fh);
end;
end;
Einen schönen Tag noch,
mfg

mkinzler 1. Mai 2008 16:07

Re: Zugriffsverletzung in Funktion
 
In welcher Zeile? (Debugger)

if-else 1. Mai 2008 16:09

Re: Zugriffsverletzung in Funktion
 
Es wird keine angegeben... Sonst hätte ich den Fehler sicherlich gefunden :wink:

mkinzler 1. Mai 2008 16:11

Re: Zugriffsverletzung in Funktion
 
Dann setzte einen Breakpoint und alsse das Programm Zeile für Zeile ausführen.

if-else 1. Mai 2008 16:16

Re: Zugriffsverletzung in Funktion
 
Danke für den Tipp!
Der Fehler wird in der Zeile angezeigt, wo Begin steht...

Delphi-Quellcode:
var
fh : file of PData;
datap : PData;
y, posi,seekk : integer;
gefunden : boolean;
fname, filep : string;

begin //->Hier

filep := OpenDialog1.FileName;

//Name der ausgewählten Datei auslesen
pos('.txt',filep);

Thorben_Ko 1. Mai 2008 16:17

Re: Zugriffsverletzung in Funktion
 
Nur mal ne (wahrscheinlich) doofe randfrage:

File of PData

Steht das P bei dir für Pointer? Wenn ja geht das so überhaupt mit Pointern? Dachte man muss erst mal mit ^ casten... Wenn das überhaupt geht, weil woher soll das FIle wissen wie gross PData ist, der kennt doch nur die Grösse eines Pointer, odeR? Ich weiss es nicht, ich frag nur ;)

Thorben

if-else 1. Mai 2008 16:20

Re: Zugriffsverletzung in Funktion
 
Ich benutze Records, die in eine Datei schreibe...

mkinzler 1. Mai 2008 16:21

Re: Zugriffsverletzung in Funktion
 
Dann muss der Fehler vorher sein. Poste mal die komplette Unit

if-else 1. Mai 2008 16:43

Re: Zugriffsverletzung in Funktion
 
Kann es sein, das ich die Prozeduren (sorry, das ich vorhin Funktionen schrieb) falsch aufrufe bzw. definiere?

Delphi-Quellcode:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, StdCtrls, Buttons, ExtCtrls;

type
  TForm2 = class(TForm)
    Panel1: TPanel;
    GroupBox1: TGroupBox;
    Panel3: TPanel;
    Panel4: TPanel;
    Panel5: TPanel;
    Panel6: TPanel;
    Label1: TLabel;
    Edit1: TEdit;
    Label2: TLabel;
    Edit2: TEdit;
    Label3: TLabel;
    Edit3: TEdit;
    Edit4: TEdit;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Edit5: TEdit;
    BitBtn1: TBitBtn;
    StringGrid1: TStringGrid;
    BitBtn2: TBitBtn;
    SaveDialog1: TSaveDialog;
    OpenDialog1: TOpenDialog;
    Label7: TLabel;
    Label8: TLabel;
    BitBtn3: TBitBtn;
    procedure FormCreate(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
   // procedure Button1Click(Sender: TObject);
    procedure Panel4Click(Sender: TObject);
    procedure Panel5Click(Sender: TObject);
    procedure savedialog();
    procedure BitBtn2Click(Sender: TObject);
    procedure Panel6Click(Sender: TObject);
    procedure StringGrid1Click(Sender: TObject);
    procedure addhistory();
    procedure updatehistory();
//    procedure BitBtn3Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;

implementation
 uses Unit1;
{$R *.dfm}
type TData = record

  Id : string[20];
  fremd : string[20];
  bed1  : string[20];
  bed2  : string[20];
  bed3  : string[20];
  bed4  : string[20];

end;

type PData = record
  pfad : string[100];
  name : string[20];
  end;

var
filep, title : string;

procedure TForm2.BitBtn1Click(Sender: TObject);
var
fremdwort, bed1, bed2, bed3, bed4 : string;
i : integer;
begin

fremdwort := edit1.text;
bed1      := edit2.text;
bed2      := edit3.text;
bed3      := edit4.text;
bed4      := edit5.text;

i := StringGrid1.RowCount-1;

if StringGrid1.RowCount = 2 then begin

  With StringGrid1 do begin

  Cells[0,1] := inttostr(i);
  Cells[1,1] := fremdwort;
  Cells[2,1] := bed1;
  Cells[3,1] := bed2;
  Cells[4,1] := bed3;
  Cells[5,1] := bed4;

end;
Stringgrid1.RowCount := StringGrid1.RowCount + 1;

end else

  With StringGrid1 do begin

  Cells[0,StringGrid1.RowCount-1] := inttostr(i);
  Cells[1,StringGrid1.RowCount-1] := fremdwort;
  Cells[2,StringGrid1.RowCount-1] := bed1;
  Cells[3,StringGrid1.RowCount-1] := bed2;
  Cells[4,StringGrid1.RowCount-1] := bed3;
  Cells[5,StringGrid1.RowCount-1] := bed4;

Stringgrid1.RowCount := StringGrid1.RowCount + 1;

end;

fremdwort := '';
bed1      := '';
bed2      := '';
bed3      := '';
bed4      := '';

edit1.text := '';
edit2.text := '';
edit3.text := '';
edit4.text := '';
edit5.text := '';

Edit1.SetFocus;

if filep <> '' then Form2.Caption := 'Vokabelliste verwalten    '+filep+'*';

end;

procedure TForm2.BitBtn2Click(Sender: TObject);
var
sel, i : integer;
warning : PChar;
begin

sel := Stringgrid1.Selection.TopLeft.Y;

warning := 'Soll dieser Datensatz wirklich gelöscht werden?';

if Application.MessageBox(PChar(warning), 'Löschen bestätigen', 52) = 6 then begin

for i := sel To StringGrid1.RowCount - 1 do

begin
  StringGrid1.Rows[i] := StringGrid1.Rows[i+ 1];
end;

StringGrid1.RowCount := StringGrid1.RowCount - 1;

for i := 0 to StringGrid1.RowCount - 1 do
begin
  StringGrid1.Cells[0,I+1] := inttostr(I+1);
end;

end;

end;
{
procedure TForm2.BitBtn3Click(Sender: TObject);
begin

if StringGrid1.Selection.TopLeft.Y <> -1 then
begin


end else
ShowMessage('Es muss ein Datensatz ausgewählt werden!');
end;
}
procedure TForm2.FormCreate(Sender: TObject);
begin

Form2.Caption := 'Vokabelliste verwalten';

With StringGrid1 do begin

width := 530;
ColWidths[0] := 30;
ColWidths[1] := 100;
ColWidths[2] := 100;
ColWidths[3] := 100;
ColWidths[4] := 100;
ColWidths[5] := 100;
Cells[0,0] := 'Nr.';
Cells[1,0] := 'Fremdwort';
Cells[2,0] := 'Bedeutung 1';
Cells[3,0] := 'Bedeutung 2';
Cells[4,0] := 'Bedeutung 3';
Cells[5,0] := 'Bedeutung 4';

end;

end;


procedure TForm2.savedialog;
var
f : file of TData;
data : TData;
x: integer;
begin

if SaveDialog1.Execute then begin
  filep := SaveDialog1.FileName;
end;

AssignFile(f,filep);
    {$I-}
Rewrite(f);

x := 0;
while x <> StringGrid1.RowCount -1 do begin
inc(x);

seek(f,Filesize(f));

with data do begin

  Id         := StringGrid1.Cells[0,x];
  fremd      := StringGrid1.Cells[1,x];
  bed1        := StringGrid1.Cells[2,x];
  bed2        := StringGrid1.Cells[3,x];
  bed3        := StringGrid1.Cells[4,x];
  bed4        := StringGrid1.Cells[5,x];

end;

write(f,data);

end;
closefile(f);
{$I+}
end;

procedure TForm2.StringGrid1Click(Sender: TObject);
begin
label7.caption := inttostr(Stringgrid1.Selection.TopLeft.X);
label8.Caption := inttostr(Stringgrid1.Selection.TopLeft.Y);
end;

procedure TForm2.Panel4Click(Sender: TObject);
begin
savedialog();
updatehistory;
addhistory;
end;

procedure TForm2.Panel5Click(Sender: TObject);
var
f : file of TData;
fh : file of PData;
datap : PData;
data : TData;
x, y, posi,rows,seekk : integer;
gefunden : boolean;
fname : string;
begin

if filep = '' then begin

savedialog();
end else

AssignFile(f,filep);
{$I-}
Rewrite(f);
{$I-}
x := 0;
while x <> StringGrid1.RowCount -1 do begin
inc(x);
{$I-}
seek(f,Filesize(f));
{$I-}

with data do begin

  Id         := StringGrid1.Cells[0,x];
  fremd      := StringGrid1.Cells[1,x];
  bed1        := StringGrid1.Cells[2,x];
  bed2        := StringGrid1.Cells[3,x];
  bed3        := StringGrid1.Cells[4,x];
  bed4        := StringGrid1.Cells[5,x];

end;

write(f,data);
end;
closefile(f);

Form2.Caption := 'Vokabelliste verwalten    '+filep+'';

updatehistory;
addhistory;
end;

procedure TForm2.Panel6Click(Sender: TObject);
var
f : file of TData;
data : TData;
x,rows: integer;
endid : string;
begin

if OpenDialog1.Execute then begin
  filep := OpenDialog1.FileName;


AssignFile(f,filep);
{$I-}
reset(f);

//Zeileanzahl auslesen
seek(f,FileSize(f)-2);
read(f,data);
rows := strtoint(data.ID);

x := 0;

while x <> rows do begin
  Stringgrid1.RowCount := StringGrid1.RowCount + 1;
  inc(x);
end;

x := 0;
repeat
  seek(f,x);
  read(f,data);
  StringGrid1.Cells[0,x+1] := data.Id;
  StringGrid1.Cells[1,x+1] := data.fremd;
  StringGrid1.Cells[2,x+1] := data.bed1;
  StringGrid1.Cells[3,x+1] := data.bed2;
  StringGrid1.Cells[4,x+1] := data.bed3;
  StringGrid1.Cells[5,x+1] := data.bed4;
  inc(x);
until x = 100;
{$I+}
end;

end;

procedure TForm2.updatehistory;
var
fh : file of PData;
datap : PData;
x : integer;
begin

AssignFile(fh,'C:\WINDOWS\voka_history.dat');
{$I-}

reset(fh);
x := 0;
repeat
 seek(fh,x);
 read(fh,datap);

inc(x);
until eof(fh);
label2.caption := inttostr(x);
{$I+}


end;

procedure TForm2.addhistory;
var
fh : file of PData;
datap : PData;
y, posi,seekk : integer;
gefunden : boolean;
fname, filep : string[100];
begin

filep := OpenDialog1.FileName;

//Name der ausgewählten Datei auslesen
pos('.txt',filep);
y := 0;
repeat
  inc(y);
posi := pos('.txt',filep)-y;

until filep[posi] = '\';

fname := copy(filep,length(filep)-y-2,y-1);

//copy(filep,)
gefunden := false;
seekk := 0;
 AssignFile(fh,'C:\WINDOWS\Voka_history.dat');
{$I-}


reset(fh);

repeat

  seek(fh,seekk);

  read(fh,datap);

  if (POS(fname,Datap.name) <> 0) then begin
    gefunden := true;
  end;
inc(seekk);
until eof(fh) or gefunden;

if not gefunden then begin
seek(fh,FileSize(fh)-1);
with datap do begin
  pfad := filep;
  name := fname;
end;
write(fh,datap);
closefile(fh);
end;
end;

end.

mkinzler 1. Mai 2008 17:11

Re: Zugriffsverletzung in Funktion
 
Könntest du das Programme im Anhang bereitstellen. Dank deiner Codeformatierung ist es schwer durchzublicken.


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