Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi DBGrid- und TLabel-Anzeige nicht identisch (https://www.delphipraxis.net/66446-dbgrid-und-tlabel-anzeige-nicht-identisch.html)

LOMBI 29. Mär 2006 19:52

Datenbank: Paradox7 • Zugriff über: TTable

DBGrid- und TLabel-Anzeige nicht identisch
 
Hi,

mit folgendem Code möchte ich die gespeicherten Daten in TLabels anzeigen:

Delphi-Quellcode:
procedure TDemoForm.DBGridDemoDrawColumnCell (Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn;
  State: TGridDrawState;)
begin
  LabelTel.Caption := FAdr.EditTel.Text;
  LabelFax.Caption := FAdr.EditFax.Text;
  LabelMob.Caption := FAdr.EditMob.Text;
  ...
end;
Problem:

Die Anzeige der Labels paßt nicht zu der aktuell markierten Adresse im
DBGrid. Es werden die Daten des vorherigen Datensatzes gezeigt.

Wer hilft mir bitte? Vielen Dank schon mal!

Gruß Lombi

marabu 29. Mär 2006 20:34

Re: DBGrid- und TLabel-Anzeige nicht identisch
 
Hallo Lombi,

die Ausgangskomponenten auf deiner Form FAdr enthalten wahrscheinlich noch nicht die richtigen Daten. Übrigens würde ich die Anzeigewerte immer direkt aus dem DataSet holen. Das passende Ereignis wäre TTable.OnAfterScroll() und nicht DbGrid.OnDrawColumnCell().

Grüße vom marabu

LOMBI 30. Mär 2006 07:07

Re: DBGrid- und TLabel-Anzeige nicht identisch
 
Guten Morgen marabu,

leider auch mit OnAfterScroll keine Veränderung. Bei den Adressen
sind die korrekten Tel./Fax-Nummern gespeichert. Also, wenn im
DBGrid zwei Adressen stehen, dann werden dazu die passenden Tel./Fax-
Nummern vertauscht in den Labels ausgegeben. AdrA erhält die Nummern
von AdrB.

Grüße
Lombi

mkinzler 30. Mär 2006 07:13

Re: DBGrid- und TLabel-Anzeige nicht identisch
 
Morgen Lombi,

du holst die werte aber aus irgend welchen Editfeldern und nicht aus dem DataSet (wie dir marabu vorgeschlagen hat). Anhand des wenigen Codes, den du uns gezeigt hast, kann man nicht abschätzen, ob und wie die Editfelder über den aktuellen Datensatnd bzw. ob die Vertauschung in dieser Zuweisung entstanden ist. Am Besten ist die Labelbeschriftung aus dem DataSet ( TTable, TQuery) zu setzen.

dfried 30. Mär 2006 07:49

Re: DBGrid- und TLabel-Anzeige nicht identisch
 
Wenn du nur die identischen Werte wie im Grid als Label anzeigen willst, dann nimm doch einfach ein DBLabel und häng es an das entsprechende DB-Feld.

LOMBI 30. Mär 2006 16:03

Re: DBGrid- und TLabel-Anzeige nicht identisch
 
Jetzt habe ich mich schon ein bisschen an die Flat-TEdits gewöhnt und möchte gerne damit weiterarbeiten, wenn möglich ohne die DB-Komponenten.

Ich denke, dass es eher eine Edit/Post-Sache ist. Könnt Ihr bitte mal
nachsehen, wo der Fehler liegt:

Delphi-Quellcode:
procedure TFAdrListe.BtnNeuClick(Sender: TObject); //Daten eingeben
begin
  FAdr.Show;
  with TableAdr do
  begin
  Insert;
  FieldByName('Anrede').AsString := FAdr.CBAnrede.Text;
  FieldByName('Name').AsString := FAdr.EditName.Text;
  FieldByName('Vorname').AsString := FAdr.EditVorname.Text;
  FieldBaName('Strasse').AsString := FAdr.EditStrasse.Text;
  ...
end;

procedure TFAdrListe.DBGridAdrListeCellClick(Column: TColumn);
//Daten ändern
begin
  FAdr.Show;
  with TableAdr do
  begin
  Edit;
  FAdr.CBAnrede.Text := FieldByName('Anrede').AsString;
  FAdr.EditName.Text := FieldByName('Name').AsString;
  FAdr.EditVorname.Text := FieldByName('Vorname').AsString;
  FAdr.EditStrasse.Text := FieldByName('Strasse').AsString;
  ...
end;

procedure TFAdr.BtnSpeichernClick(Sender: TObject); //Speichern
begin
  if FAdrListe.DataSourceAdr.DataSet.State=dsEdit then
    FAdrListe.TableAdr.Post
    else
  if FAdrListe.DataSourceAdr.DataSet.State=dsInsert then
    FAdrListe.TableAdr.Post;
    FAdrListe.Show;
end;
Im Forum lese ich häufiger auch "ParamByName". Was hat es damit auf sich?

Gruß
Lombi

mkinzler 30. Mär 2006 16:10

Re: DBGrid- und TLabel-Anzeige nicht identisch
 
Zitat:

Im Forum lese ich häufiger auch "ParamByName". Was hat es damit auf sich?
Dies benutzt man bei parametrisierten Abfragen.

Wenn man öfters die gleichen Abfragen mit verschiedenen Werte durchführt.

SQL-Code:
select * from tabelle where id = :id;
Dann reicht

Delphi-Quellcode:
Query.sql.Text = 'select * from tabelle where id = :id;';
...
Query.Close;
Query.ParamByName('id').value := 4711;
Query.Open;
...
Query.Close;
Query.ParamByName('id').value := 247;
Query.Open;

LOMBI 30. Mär 2006 16:24

Re: DBGrid- und TLabel-Anzeige nicht identisch
 
Hallo mkinzler,

und was ist Deine Meinung zu meinen Codes?

Gruß
Lombi

mkinzler 30. Mär 2006 16:33

Re: DBGrid- und TLabel-Anzeige nicht identisch
 
Meine Antwort bezog sich auf die Frage bezüglich Parameter ( habe meinen letzten Beitrag in diese Richtung abgeändert).
Zitat:

und was ist Deine Meinung zu meinen Codes?
Ich bevorzuge halt Query-Komponenten und keine Tables.
Zu was brauchst du das Edit in der Fkt DBGridAdrListeCellClick? Du liest doch Werte aus der Tabelle aus.

shmia 30. Mär 2006 18:34

Re: DBGrid- und TLabel-Anzeige nicht identisch
 
Zitat:

Zitat von LOMBI
mit folgendem Code möchte ich die gespeicherten Daten in TLabels anzeigen:
Delphi-Quellcode:
procedure TDemoForm.DBGridDemoDrawColumnCell (Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn;
  State: TGridDrawState;)
begin
  LabelTel.Caption := FAdr.EditTel.Text;
  LabelFax.Caption := FAdr.EditFax.Text;
  LabelMob.Caption := FAdr.EditMob.Text;
  ...
end;

Das ist GANZ falsch! OnDrawColumnCell wird 1. extrem oft aufgerufen und 2. für alle
im DBGrid sichtbaren Datensätze aufgerufen.
Richtig:
Das Event [TTable].AfterScroll benützen:
Delphi-Quellcode:
procedure TForm1.Table1AfterScroll(Dataset:TDataset);
begin
   LabelTel.Caption := Dataset.FieldByName('Tel').AsString;
   ...
end;

LOMBI 31. Mär 2006 07:03

Re: DBGrid- und TLabel-Anzeige nicht identisch
 
Guten Morgen,

habe das schon wie von marabu empfohlen auf OnAfterScroll geändert.
Aber was ist mit meinen Codes Insert,Edit,Speichern von gestern?
Da scheint etwas nicht in Ordnung zu sein.

Gruß
Lombi

mkinzler 31. Mär 2006 07:13

Re: DBGrid- und TLabel-Anzeige nicht identisch
 
Ich vermut mal, das hier der Fehler liegt, da hier was zu fehlen scheint:

Du versuchst in .BtnSpeichernClick was in die Datenbank zurückzuschhreiben hat aber in Table1AfterScroll nur die Werte des aktuellen DS in die Editfelder kopiert. Wenn du nun Änderungen zurückschreiben willst, mußt du zuerst die werte der Edits wieder in das DS zurückschreiben.

marabu 31. Mär 2006 10:33

Re: DBGrid- und TLabel-Anzeige nicht identisch
 
Hallo Lombi.

Ich vermute FAdrListe ist die Form mit der mittels DBGrid realisierten Listenansicht und FAdr ist die Form mit den Detailinformationen zu einem Datensatz. Vermutlich hast du das DBGrid auf ReadOnly gesetzt, um den Datensatz auf deine Weise bearbeiten zu können. Du benutzt das DBGrid dann nur zum verschieben des Satzzeigers. Für das Einfügen eines neuen Datensatzes hast du einen Button, wie für das Speichern.

Das Ändern eines Datensatzes über das klicken in eine Zelle zu beginnen halte ich für keine gute Idee. Ich verwende dazu oft ein Kontextmenü. In deiner Detailform könntest du eine Methode zum Bearbeiten des aktuellen Datensatzes bereit halten:

Delphi-Quellcode:
function TFAdr.UpdateRecord(ds: TDataSet): Boolean;
begin
  CBAnrede.Text := ds['Anrede'];
  EditName.Text := ds['Name'];
  Result := ShowModal = mrOK;
  if Result then
  begin
    ds.Edit;
    ds['Anrede'] := CBAnrede.Text;
    ds['Name'] := EditName.Text;
    ds.Post;
  end;
end;
Wenn du dann eine EditAction auf deiner Listenform hast, dann würde folgendes funktionieren:

Delphi-Quellcode:
procedure TFadrListe.EditAction(Sender: TObject);
begin
  with TFadr.Create(nil) do
    if UpdateRecord(TableAdr) then
      TableAdr.Refresh;
end;
Getippt und nicht getestet.

Grüße vom marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:38 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