| Autor |
Beitrag |
Danny87
      
Beiträge: 688
Windows 10 Pro 64bit
Sprachen: HTML, PHP, JavaScript, Delphi || IDE: RAD Studio 10.1 Berlin Starter, WeBuilder
|
Verfasst: 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
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
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: 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
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: Di 20.12.05 13:08
Hallo,
vermute der Fehler ist in der Zeile begraben:
Delphi-Quelltext 1:
| slSave := lstbxGesagt.Items; |
Wenn Du die Items einer Listbox in eine StringList laden willst,
dann solltest Du folgendes nehmen:
Delphi-Quelltext 1: 2: 3:
| MyStrList.AddStrings(ListBox1.Items); 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:
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 
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
Danny87 
      
Beiträge: 688
Windows 10 Pro 64bit
Sprachen: HTML, PHP, JavaScript, Delphi || IDE: RAD Studio 10.1 Berlin Starter, WeBuilder
|
Verfasst: 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
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: Di 20.12.05 19:31
allo,
Danny87 hat folgendes geschrieben: |
Der Fehler lag darin, dass ich slSave nicht freigeben darf. |
Eine in einer Prozedur lokal erzeugte StringListe nicht freigeben
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:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| begin slSave := TStringList.Create; case Key of VK_DELETE: begin end; end; slSave.Free; end; |
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
Danny87 
      
Beiträge: 688
Windows 10 Pro 64bit
Sprachen: HTML, PHP, JavaScript, Delphi || IDE: RAD Studio 10.1 Berlin Starter, WeBuilder
|
Verfasst: Mi 21.12.05 12:16
slSave nicht freigeben weil
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):
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; |
|
|
|