Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Access Violation bei einer TListBox


Roidsear Ó Ghearmáin - Mi 02.07.03 15:55
Titel: Access Violation bei einer TListBox
(zumindest denke ich, daß dies die Ursache sein könnte...)

Hallo zusammen!

Ich habe folgendes Problem: Ich habe ein Formular (in f_ankauf.pas) mit 2 Eingabefeldern für eine Artikelsuche. Beim Verlassen des 1. Feldes wird ein SQL über ADO an mySQL abgesetzt. Führt dieser zu keinem Ergebnis, wird eine Suche via Matchcode im 2. Feld angestoßen. Das Ergebnis dieses SQLs (getriggert bei OnExit des TEdit Feldes), der dann auch mehrere Ergebnisse liefern kann, soll dann in einem Popup zur Auswahl angezeigt werden. Dazu habe ich in f_ankauf.pas ein array mit entsprechenden Records angelegt und als public deklariert. Bei 'OnCreate' des Popupfensters (f_matchlist.pas) wird dann das Array, dessen Größe je nach Größe des ResultSets gesetzt wird, ausgelesen und in eine TListBox gestellt.

(Hier ist auch noch ein Workaround im Code, da ich immer den letzten Eintrag doppelt hatte, keine Ahnung, warum...)
Das Popup wird mit

Delphi-Quelltext
1:
2:
  Application.CreateForm(TF_MatchList, f_MatchList);
  f_MatchList.Show;

zur Laufzeit kreiert.

Wenn ich jetzt die Applikation starte, bekomme ich die Exception:
Zitat:
EAccessViolation (At address: 00404BEB, Read of Address: 00000022).

Sobald ich die CreateForm - routine kommentiere, läuft das Ding.

Mache ich hier irgendwelche grundlegenden Fehler?

Dank schonmal im Voraus... ;)

Rüdiger

Kurze Info zum System:
W2k SP3
mySQL 3.23.57
MDAC 2.7
D6 Prof.
Ich nutze ADO Objekte via myODBC 3.51


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:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
===============================================
f_ankauf.pas
===============================================
TMatchListElement = Record
                          art_id,
                          titel1,
                          titel2,
                          artist,
                          komposer : string;
                      end;
[...]
public
      MatchList       : array of TMatchListElement;
[...]

===============================================
f_matchlist.pas
===============================================
[...]
procedure Tf_MatchList.FormCreate(Sender: TObject);
var _length : integer;
    _entry,
    _prev   : string;

begin
     MatchedHitList.Clear;
     _prev := '';
     for _length := 0 to length(Form_Ankauf.MatchList) do
     begin
          if (Form_Ankauf.MatchList[_length].art_id <> '')
          and (Form_Ankauf.MatchList[_length].art_id <> _prev)} then
          begin
                _entry := Form_Ankauf.MatchList[_length].art_id + ' | '
                        + Form_Ankauf.MatchList[_length].artist + ' | '
                        + Form_Ankauf.MatchList[_length].titel1;
                MatchedHitList.AddItem(_entry, MatchedHitList);
                _prev := Form_Ankauf.MatchList[_length].art_id;
          end;
     end;
end;


Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt.


TomT - Mi 02.07.03 23:32

Ersetze mal :

Delphi-Quelltext
1:
for _length := 0 to length(Form_Ankauf.MatchList) do                    


durch

Delphi-Quelltext
1:
for _length := 0 to (length(Form_Ankauf.MatchList)-1do                    


Weil Länge die anzahl angibt, du aber bei 0 anfängst, damit hast du einen zuviel.


Roidsear Ó Ghearmáin - Do 03.07.03 15:51
Titel: Danke... ;)
TomT hat folgendes geschrieben:
Weil Länge die anzahl angibt, du aber bei 0 anfängst, damit hast du einen zuviel.


Ja, danke! Das wars...
...dabei ist es doch eine alte Weisheit, daß es in der EDV immer einer weniger ist, als man denkt.... ;)

Slán,
Rüdiger