Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi StringGrid refreshen (https://www.delphipraxis.net/77783-stringgrid-refreshen.html)

sexmagic 24. Sep 2006 20:51

Datenbank: SQLite • Version: 3 • Zugriff über: libsql

StringGrid refreshen
 
Hallo Freunde,

nachdem ich mich nun schon ca 2 Stunden mit diesem Probelm auseinandergesetzt habe muss ich hier um Hilfe bitten.

Ich habe auch schon die Suche benutzt aber ich werde nicht schlauer da ich denke das mein ich den richtigen Weg eingeschlagen habe aber falsch umgesetzt habe.

Mein Vorhaben:
Ich habe ein Pagecontrol auf dem ich Editfelder habe einen Button und ein Stringgrid.
Ich lasse mit beim OnShow aus einer Query an die DB die Datensätze in das Stringgrid schreiben, das funktioniert alles fein.
Ich möchte nun aber auch nach dem Buttonclick beim eintragen eines neuen Datensatzes in die DB automatisch die Abfrage an die DB ausfürhen damit das Stringgrid sozusagen akktualisiert wird.


Mein Problem:
Daten werden eingetragen, aber alles wird durcheinandergewürfelt im Stringgrid, ich habe immer vor dem Letzten eintrag der am Ende des Stringgrids erfolgreichgeladen wurde den Ersten Eintrag aus der 2 nochmal stehen, komisch nicht :).
Wenn ich das Programmm neu Starte werden alle Datensätze wieder richtig angezeigt und der Fehlerhafte eintrag ist weg.


Ich denke ich hab einen Fehler inn der Abfrage der Datensätze.

Vielleicht wäre einer so nett und schaut sich das mal an, ich habe an dem Ding sehr lange gesessen und die Programmierung ist sicher nicht grad das gelbe vom ein. Dafür hab ichs selber gemacht :P

Hier nun der Code, ich denke der Fehler liegt in der "procedure GetDataSmall;":
Delphi-Quellcode:
//TabSheet4 Datensatz eintragen
procedure TForm1.Button1Click(Sender: TObject);
begin
  if not DB.Query ('insert into kunden (name, leistung, dokumente) values (' + QuotedStr(Edit1.Text) + ', ' + QuotedStr(Edit2.Text) +' , ' + QuotedStr(Edit3.Text) + ') ') then
    ShowMessage('DB error: '+ DB.ErrorMessage);
    //Application.ProcessMessages;
    //StringGrid1.Repaint;
    //ClearStringGrid1; //StringGrid1 Leeren
    ClearEditsTab4Add; //Felder Leeren
    Form1.StringGrid1.Refresh;
    GetDataSmall; //Daten auslesen
   
end;


//Programm Close
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  //Datenbank Instanz - Memory freigben
  db.Free;
end;


//Programm OnCreate
procedure TForm1.ClearEditsTab4Add;
begin
  Form1.Edit1.Text := '';
  Form1.Edit2.Text := '';
  Form1.Edit3.Text := '';
  Form1.Edit4.Text := '';
end;


//StringGrid1 Leeren
procedure TForm1.ClearStringGrid1;
var
  irow,icol : Integer;
begin
  with StringGrid1 do
    for irow := 0 to RowCount -1 do
      for icol := 0 to ColCount -1 do
       Cells[irow,icol] := '';
end;


//Programm OnCreate
procedure TForm1.FormCreate(Sender: TObject);
begin
  //Datenbankverbindung erstellen
  db := TLiteDB.Create(Self);
  db.Use('database.s3db');
end;

//TabSheet4 - Daten auslesen und in Stringgrid schreiben
procedure TForm1.GetDataSmall;
var
  max: integer;
  i:integer;
  Zeile: integer;
begin
  //Querry an die DB
  db.Query ('select * from kunden');
  //Anzahl der Datensätze zählen
  max := db.RowCount;

  //Ausgabe der Datensätze im Stringgrid
  for I := 0 to max - 1 do
  begin
    Zeile:= StringGrid1.RowCount-1;
    if zeile < max -1 then
    StringGrid1.RowCount := StringGrid1.RowCount + 1;

    StringGrid1.Cells[0, Zeile] := db.Results[i][0];
    StringGrid1.Cells[1, Zeile] := db.Results[i][1];
    StringGrid1.Cells[2, Zeile] := db.Results[i][2];
  end;

end;

//TabSheet4 OnShow
procedure TForm1.TabSheet4Show(Sender: TObject);
begin
  ClearEditsTab4Add; //Felder Leeren
  GetDataSmall; //Datensätze abrufen
end;

raiguen 5. Okt 2006 22:28

Re: StringGrid refreshen
 
Moin :-)

Mal so aus der Hüfte geschossen bzw ungetestet würde ich die Routine etwa so schreiben:
Delphi-Quellcode:
//TabSheet4 - Daten auslesen und in Stringgrid schreiben
procedure TForm1.GetDataSmall;
var
  max: integer;
  i:integer;
  Zeile: integer;
begin
  //Querry an die DB
  db.Query ('select * from kunden');
  //Anzahl der Datensätze zählen
  max := db.RowCount;
 
  //Zeilenanzahl für das StringGrid1 anhand der Datensätze der Query anpassen
  StringGrid1.RowCount := db.RowCount;

  //Ausgabe der Datensätze im Stringgrid
  for I := 0 to db.RowCount - 1 do
  begin
    StringGrid1.Cells[0, i] := db.Results[i][0];
    StringGrid1.Cells[1, i] := db.Results[i][1];
    StringGrid1.Cells[2, i] := db.Results[i][2];
  end;
end;
Irgendwie beschleicht mich das Gefühl, dass mit deiner Version die Datensätze immer in die letzte Zeile geschrieben werden!? :gruebel:

Ähm, noch ein Tipp für's Löschen aller Zeilen in einem StringGrid:
Delphi-Quellcode:
//StringGrid1 Leeren
procedure TForm1.ClearStringGrid1;
var
  irow : Integer;
begin
  with StringGrid1 do
    for irow := 0 to RowCount -1 do
      Rows[iRow].Clear;
end;

hoika 6. Okt 2006 12:01

Re: StringGrid refreshen
 
Hallo,

du rufst dein ClearStringGrid nicht auf ? warum ?
Deine Implementierung war übrigens falsch.
Grid.Cells[Col,Row], nicht umgekehrt.

Ausserdem würde ich das ClearStringGrid erst NACH dem Grid.RowCount machen.
Das normale StringGrid von Delphi hat nen "Bug" eh Feature,
das dazu führt, dass wenn RowCount verkleinert und wieder vergrössert wird,
der originale Inhalt wieder drinsteht.


Ausserdem würde ich mal andere Variablen-Namen benutzen.

Bsp.

Delphi-Quellcode:
var
  iCurRow: Integer;
  iRec: Integer;
begin
  iCurRow:= 0;

  for iRec:= 0 to db.RowCount - 1 do
  begin
    StringGrid1.Cells[0, iCurRow] := db.Results[iRec][0];    

    Inc(iCurRow);

    Next;
  end;
end;
Das hat übrigens den Vorteil, dass man auch ohne grossen Rumhampeln
die Überschrift reinpackewn kann.
Grid.RowCount:= db.RowCount+1;
iCurRow:= 1;

Übrigens würde ich das Form1. eh weglassen.


Heiko

sexmagic 8. Okt 2006 09:39

Re: StringGrid refreshen
 
Hallo,

sorry das ich mich erst jetzt melde, habe die Antwort ganz übersehen, dachte der is in der Verseenkung verschwunden.
Werde das heute Abend ausprobieren, danke für die super Tips!

Melde mich sobald getestet.

;)

-SM


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz