AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi StringGrid refreshen
Thema durchsuchen
Ansicht
Themen-Optionen

StringGrid refreshen

Ein Thema von sexmagic · begonnen am 24. Sep 2006 · letzter Beitrag vom 8. Okt 2006
Antwort Antwort
sexmagic

Registriert seit: 16. Sep 2006
56 Beiträge
 
Delphi 2006 Professional
 
#1

StringGrid refreshen

  Alt 24. Sep 2006, 21:51
Datenbank: SQLite • Version: 3 • Zugriff über: libsql
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

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;
  Mit Zitat antworten Zitat
raiguen
(Gast)

n/a Beiträge
 
#2

Re: StringGrid refreshen

  Alt 5. Okt 2006, 23:28
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!?

Ä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;
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: StringGrid refreshen

  Alt 6. Okt 2006, 13:01
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
Heiko
  Mit Zitat antworten Zitat
sexmagic

Registriert seit: 16. Sep 2006
56 Beiträge
 
Delphi 2006 Professional
 
#4

Re: StringGrid refreshen

  Alt 8. Okt 2006, 10:39
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:16 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