Ich habe eine
mySQL Datenbank und benutze dazu die
mysql.pas aus Chewies Tutorial. Ich muss sagen, dass ich heute schon ziemlich was geschaft habe: Datenbank anlegen, Tabelle anlegen, datensätze einfügen ein
Query ausführen, um die datensätze in einem StringGrid anzuzeigen. Und da habe ich jetzt ein etwas seltsames verhalten. Beim Start rufe ich diese Funktion auf:
Delphi-Quellcode:
function GetKontakte: TKontakte;
var
query : PChar;
MySQLRes : PMYSQL_RES;
MySQLRow : PMYSQL_ROW;
RecCount : Integer;
i : Integer;
ErrorCode : Integer;
begin
log('
Tabelle auslesen');
ErrorCode := mysql_select_db(Descriptor, DBNAME);
if ErrorCode = 0
then
begin
log('
Datenbank ausgewählt');
query := '
SELECT * FROM Kontakte ORDER BY name, vorname';
ErrorCode := mysql_real_query(Descriptor, PChar(
query), length(
query));
if ErrorCode = 0
then
begin
log('
Query: "SELECT * FROM Kontakte ORDER BY name, vorname"');
MySQLRes := mysql_store_result(Descriptor);
if Assigned(MySQLRes)
then
begin
log('
QueryResult wurde zugewiesen');
RecCount := mysql_num_rows(MySQLRes);
setlength(result, RecCount);
for i := 0
to RecCount - 1
do
begin
MySQLRow := mysql_fetch_row(MySQLRes);
result[i].ID := StrToInt(MySQLRow[0]);
result[i].
Name := MySQLRow[1];
result[i].Vorname := MySQLRow[2];
result[i].Strasse := MySQLRow[3];
result[i].Plz := StrToIntDef(MySQLRow[4], 0);
result[i].Ort := MySQLRow[5];
result[i].Telefon := MySQLRow[6];
result[i].Handy := MySQLRow[7];
result[i].EMail := MySQLRow[8];
log(Format('
fetch_row: %d', [i]));
end;
log(Format('
Betroffene Zeile: %d', [mysql_affected_rows(Descriptor)]));
mysql_free_result(MySQLRes);
end
else
log('
QueryResult = nil');
end
else
log('
Query: "SELECT * FROM Kontakte ORDER BY name" fehlgeschlagen');
end
else
log(Format('
Datenbank konnte nicht ausgewählzt werden [%d]', [ErrorCode]));
end;
Das Ergebnis wird der Routine FillStringGrid übergeben:
Delphi-Quellcode:
procedure TForm1.FillStringGrid(Kontakte: TKontakte);
var
i : Integer;
begin
Kontakte := GetKontakte;
StringGrid1.RowCount := length(Kontakte) + 1;
for i := 0 to length(Kontakte) - 1 do
begin
StringGrid1.Cells[0, i + 1] := IntToStr(Kontakte[i].ID);
StringGrid1.Cells[1, i + 1] := Kontakte[i].Name;
StringGrid1.Cells[2, i + 1] := Kontakte[i].Vorname;
StringGrid1.Cells[3, i + 1] := Kontakte[i].Strasse;
StringGrid1.Cells[4, i + 1] := IntToStr(Kontakte[i].Plz);
StringGrid1.Cells[5, i + 1] := Kontakte[i].Ort;
StringGrid1.Cells[6, i + 1] := Kontakte[i].Telefon;
StringGrid1.Cells[7, i + 1] := Kontakte[i].Handy;
StringGrid1.Cells[8, i + 1] := Kontakte[i].EMail;
end;
end;
Nur wird GetKontakte zweimal aufgerufen. Das ganze passiert im OnPaint der Form:
Delphi-Quellcode:
procedure TForm1.FormPaint(Sender: TObject);
begin
if FirstTime then
begin
log('OnPaint');
FirstTime := False;
Form1.Refresh;
StringGrid1.Refresh;
Descriptor := mysql_init(nil);
Connect(Descriptor, _HOST, _USER, _PW, _DB, _PORT);
FillStringGrid(GetKontakte);
end;
end;
Laut meines Logs (Ich schreibe das immer mit, damit ich weiß, was passiert.) wird der Code in OnPaint auch nur einmal aufgerufen, wie beabsichtigt. Trotzdem führt er die Funktion zweimal aus. Ich weiß jetzt nicht, ob das ein
VCL Problem ist oder ob es mit dem
Query der Datenbank zu tun hat, denn der Text:
log('Tabelle auslesen'); steht auch zweimal im Log. Ich bin da jetzt etwas ratlos. Weiß jemand von euch da weiter?