Autor Beitrag
Danny87
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 688

Windows 10 Pro 64bit
Sprachen: HTML, PHP, JavaScript, Delphi || IDE: RAD Studio 10.1 Berlin Starter, WeBuilder
BeitragVerfasst: Di 20.12.05 12:08 
Ich bin dabei ein einfaches Kybernetikprogramm zu schreiben (Auftrag vom Chef) und habe jetzt folgendes Problem:

Wenn ich das Programm ausführe funktionniert alles einwandfrei (Darstellung, OnClick, OnKeyDown), aber
wenn ich einen Eintrag mittels DeleteSelected lösche und danach auf einen Eintrag klicke bekomme ich eine Fehlermeldung
die besagt, dass eine Zugriffsverletzung bei Adresse.... aufgetreten ist.
Kann mir hier jemand weiterhelfen?

Hier noch ein paar Infos:

- In der Datei Records/data.ekl stehen einträge im Stil von: Eintrag1|Wert1|Kanal1|Prozess1
- lstbxGesagt ist eine TListBox
- edtWert, edtKanal, edtProzess und edtAddGesagt sind TEdit


ausblenden volle Höhe Das ist (fast) der ganze Code
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
function TfrmMain.FilterGesagt() : TStringList;
var slBuffer : TStringList;
    sBuffer : string;
    i : integer;
begin
slBuffer := TStringList.Create;
slBuffer.LoadFromFile('Records/data.ekl');

for i := 0 to slBuffer.Count - 1 do
  begin
  sBuffer := slBuffer[i];

  delete(sBuffer,pos('|',sBuffer),Length(sBuffer));
  slBuffer[i] := sBuffer;
  end;

result := slBuffer;
end;

function TfrmMain.FilterWert(iCount : integer) : String;
var slBuffer : TStringList;
    sBuffer : string;
begin
slBuffer := TStringList.Create;
slBuffer.LoadFromFile('Records/data.ekl');

sBuffer := slBuffer[iCount];
delete(sBuffer,1,pos('|',sBuffer));
delete(sBuffer,pos('|',sBuffer),Length(sBuffer));

result := sBuffer;
end;

function TfrmMain.FilterKanal(iCount : integer) : String;
var slBuffer : TStringList;
    sBuffer : string;
begin
slBuffer := TStringList.Create;
slBuffer.LoadFromFile('Records/data.ekl');

sBuffer := slBuffer[iCount];
delete(sBuffer,1,pos('|',sBuffer));
delete(sBuffer,1,pos('|',sBuffer));
delete(sBuffer,pos('|',sBuffer),Length(sBuffer));

result := sBuffer;
end;

function TfrmMain.FilterProzess(iCount : integer) : String;
var slBuffer : TStringList;
    sBuffer : string;
begin
slBuffer := TStringList.Create;
slBuffer.LoadFromFile('Records/data.ekl');

sBuffer := slBuffer[iCount];
delete(sBuffer,1,pos('|',sBuffer));
delete(sBuffer,1,pos('|',sBuffer));
delete(sBuffer,1,pos('|',sBuffer));

result := sBuffer;
end;

procedure TfrmMain.FormCreate(Sender: TObject);
begin
lstbxGesagt.Items := FilterGesagt();

end;

procedure TfrmMain.lstbxGesagtClick(Sender: TObject);
begin
edtAddGesagt.Text := lstbxGesagt.Items.Strings[lstbxGesagt.ItemIndex];
edtWert.Text := FilterWert(lstbxGesagt.ItemIndex);
edtKanal.Text := FilterKanal(lstbxGesagt.ItemIndex);
edtProzess.Text := FilterProzess(lstbxGesagt.ItemIndex);
end;

procedure TfrmMain.lstbxGesagtKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var slSave : TStrings;
    sWert, sKanal, sProzess  : string;
    i : integer;
begin
slSave := TStringList.Create;

case Key of
  VK_DELETE: begin
             lstbxGesagt.DeleteSelected;
             slSave := lstbxGesagt.Items;

             for i := 0 to slSave.Count - 1 do
              begin
              edtWert.Text := FilterWert(i);
              edtKanal.Text := FilterKanal(i);
              edtProzess.Text := FilterProzess(i);

              sWert := edtWert.Text;
              sKanal := edtKanal.Text;
              sProzess := edtProzess.Text;

              slSave[i] := slSave[i] +'|'+ sWert +'|'+ sKanal +'|'+ sProzess;
              end;
             slSave.SaveToFile('Records\data.ekl');
             end;
  end;

edtAddGesagt.Text := '';
edtWert.Text := '';
edtKanal.Text := '';
edtProzess.Text := '';
lstbxGesagt.Items := FilterGesagt();

slSave.Free;
end;
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 20.12.05 12:40 
Moin!

Kannst du mal bitte die konkrete Stelle im Code benennen, an der der Fehler auftritt?

Ansonsten: Klassisch ist, auf Komponenten-Referenzen zuzugreifen, die nicht mehr gültig sind, Indexüberschreitungen, etc.

cu
Narses
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: Di 20.12.05 13:08 
Hallo,

vermute der Fehler ist in der Zeile begraben:
ausblenden Delphi-Quelltext
1:
slSave := lstbxGesagt.Items;					

Wenn Du die Items einer Listbox in eine StringList laden willst,
dann solltest Du folgendes nehmen:
ausblenden Delphi-Quelltext
1:
2:
3:
MyStrList.AddStrings(ListBox1.Items);
//... oder
MyStrList.Assign(ListBox1.Items);


Abgesehen davon,
warum lädst Du die Items erst in eine Stringlist um danach die Einträge zu verändern?

Sind edtWert.Text ... Editfelder?
In diese schreibst Du Ergebnisse aus Funktionen,
deren Inhalt wird wieder in lokale Variablen gesetzt,
diese Variablen werden ausgewertet,
anschließend werden die Editfelder mit einem Leerstring gefüllt :?

Du kannst doch die Funktion direkt verwenden.
Ich würde das so in etwa coden:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
for i := 0 to ListBox1.Items.Count - 1 do  
   begin 
   MyStrList.Add(ListBox.Items[i] +'|'
                 + FilterWert(i) +'|'
                 + FilterKanal(i) +'|'
                 + FilterProzess(i));  
   end;


Ps.: slBuffer.Free fehlt noch in Deinen Funktionen :wink:

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
Danny87 Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 688

Windows 10 Pro 64bit
Sprachen: HTML, PHP, JavaScript, Delphi || IDE: RAD Studio 10.1 Berlin Starter, WeBuilder
BeitragVerfasst: Di 20.12.05 13:35 
Danke für die Hilfe, aber in der zwischenzeit hat unser anderer Azubi mir geholfen. ;-)
Der Fehler lag darin, dass ich slSave nicht freigeben darf.

Trotzdem vielen dank für die tipps.

...und danke für den hinweis, dass ich die slBuffer noch nicht freigegeben habe.
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: Di 20.12.05 19:31 
allo,
user profile iconDanny87 hat folgendes geschrieben:

Der Fehler lag darin, dass ich slSave nicht freigeben darf.
Eine in einer Prozedur lokal erzeugte StringListe nicht freigeben :shock:

Was mir da noch gerade aufgefallen ist,
in Deinem Code erstellst Du bei jedem Tastendruck (wenn die ListBox den Focus hat)
eine Stringliste und die darf nicht freigegeben werden?

Kurzfassung:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
begin  
slSave := TStringList.Create; 
case Key of  
  VK_DELETE: begin
             //hier wird was ausgeführt, aber nur wenn [Entf]
             end;  
  end;
  slSave.Free;  
end;

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
Danny87 Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 688

Windows 10 Pro 64bit
Sprachen: HTML, PHP, JavaScript, Delphi || IDE: RAD Studio 10.1 Berlin Starter, WeBuilder
BeitragVerfasst: Mi 21.12.05 12:16 
slSave nicht freigeben weil

ausblenden Delphi-Quelltext
1:
slSave := lstbxGesagt.Items;					


den Pointer slSave auf die StringList hinter der ListBox lstbxGesagt setzt.
Wenn ich den slSave jetzt Freigebe, dann .... keine Ahnung.

Mein Chef hats mir zwar erklärt, aber hab die hälfte schon wieder vergessen ;-)

Hab jetzt ohnehin ne bessere Lösung bei der ich slSave auch freigeben darf (und sollte):

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
procedure TfrmMain.lstbxGesagtKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var slSave : TStringList;
begin
slSave := TStringList.Create;
if not FileExists('Records/'+cbxAnrufer.Text+'.ekl') then
  MessageBox(Handle,'Eine Datei für diesen Anrufer ist nicht Vorhanden! Um eine Datei anzulegen füllen Sie bitte alle Felder aus und klicken Sie auf "Hinzufügen"','Fehler',MB_OK or MB_ICONEXCLAMATION)
 else
  begin
  case Key of
    VK_DELETE: begin
               slSave.LoadFromFile('Records/'+cbxAnrufer.Text+'.ekl');
               slSave.Delete(lstbxGesagt.ItemIndex);

               slSave.SaveToFile('Records/'+cbxAnrufer.Text+'.ekl');
               end;
    end;

  cbxAnrufer.Items.LoadFromFile('Records\index.inf');
  lstbxGesagt.Items := FilterGesagt();
  slSave.Free;
  end;
end;