Entwickler-Ecke
Sonstiges (Delphi) - ACCESS Violation bei TStrings.Free
mtm - Mo 20.03.17 17:19
Titel: ACCESS Violation bei TStrings.Free
Hallo zusammen,
ich hätte da mal ein Problem. Ich bastele mir gerade eine Chorverwaltung. Funktioniert soweit auch, bis auf ein kleines Problem.
Ich möchte ein Formular öffnen, in dem die Aufführungen und die dort aufgeführten Werke verwaltet werden können. Dabei möchte ich alle vorhandenen Werke in eine ComboList laden.
Das passiert in folgendem Codeschnipsel :
Delphi-Quelltext
1: 2: 3: 4:
| sl := TStringList.Create; aktChor.LoadPieces(sl); cboPiece.Items.Assign(sl); sl.Free; |
In der procedure LoadPieces der Klasse aktChor passiert nun folgendes :
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| procedure TChor.LoadPieces(var sl: TStrings); var i,a,s: Integer; cs: TCSKlasse; st: TStueck; txt: String; begin sl.Clear; for i := 0 to CSLst.Count - 1 do begin cs := TCSKlasse(CSLst.Objects[i]); if cs.Chor = fIdx then begin s := cs.Stueck; a := SLst.IndexOf(IntToStr(cs.Stueck)); if a > -1 then begin st := TStueck(SLst.Objects[a]); txt := st.Titel + ' (' + st.Komponist+')'; sl.AddObject(txt,TObject(s)); end; end; end; end; |
Dieser Teil funktioniert soweit auch ganz gut. Im Debugger ist die StringListe sl so gefüllt, wie ich mir das gedacht habe. Wenn ich den oberen CodeTeil schrittweise durchgehe funktioniert eigentlich alles wunderbar auch der Assign auf die Combobox wird ohne Murren ausgeführt.
Bei
tritt jedoch ein ACCESS VILOATION auf.
Da es wohl keinen Sinn ergibt, das komplette Projekt zu posten, hoffe ich, daß irgendjemand von Euch eine Idee hat, woran das liegen könnte.
Danke im Voraus
mtm
Edit : Ich bin scheinbar ein wenig blind. Der Aufruf des oberen Code-Schnipsels erfolgte zu früh.
Slipstream - Mo 20.03.17 19:17
Wieso sl.free ein exception wirft, weiss ich nicht. Aber ich sehe, dass du sl als Var-Parameter übergibst. Das ist falsch. TStrings wird nie als Var-Parameter übergeben, denn damit übergibst du lediglich den Pointer auf den Beginn der List. Der soll aber nicht verändert werden dürfen. Übergebe den sl als const.
haentschman - Di 21.03.17 08:29
Moin... :P
Ich hätte da mal ein paar Tips. :wink:
1. Da dein Delphi Generics hat kannst du sie auch nutzen. :zwinker:
Ich gehe davon aus das
CSLst die TObjectList ist... Da könnte man auch
TObjectList<TCSKlasse> draus machen. Erstens kann man sich den cast sparen und die Objekte sind vom Debugger einsehbar. :zustimm:
2. Die Stücke kannst du auch in der Klasse verwalten statt
TStringList...
TObjectList<TStueck>;
2. Bitte verwende keine Abkürzungen sondern sprechende Namen für die Variablen. Im Moment ist des gut weil du daran arbeitest. In 2 Monaten hast dann schon Schwierigkeiten
cs aufzulösen. :zwinker:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| CSLst: TObjectList<TCSKlasse>; ... procedure TChor.LoadPieces(var sl: TStrings); var i,a,s: Integer; cs: TCSKlasse; st: TStueck; begin sl.Clear; for i := 0 to CSLst.Count - 1 do begin cs := CSLst[i]; if cs.Chor = fIdx then begin s := cs.Stueck; a := SLst.IndexOf(IntToStr(cs.Stueck)); if a > -1 then begin st := SLst[a]; sl.AddObject(st.Titel + ' (' + st.Komponist+')', s); end; end; end; end; |
...nur so als Anregung. :zwinker:
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!