![]() |
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:
Problem:
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; 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 |
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 |
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 |
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. |
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.
|
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:
Im Forum lese ich häufiger auch "ParamByName". Was hat es damit auf sich?
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; Gruß Lombi |
Re: DBGrid- und TLabel-Anzeige nicht identisch
Zitat:
Wenn man öfters die gleichen Abfragen mit verschiedenen Werte durchführt.
SQL-Code:
Dann reicht
select * from tabelle where id = :id;
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; |
Re: DBGrid- und TLabel-Anzeige nicht identisch
Hallo mkinzler,
und was ist Deine Meinung zu meinen Codes? Gruß Lombi |
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:
Zu was brauchst du das Edit in der Fkt DBGridAdrListeCellClick? Du liest doch Werte aus der Tabelle aus. |
Re: DBGrid- und TLabel-Anzeige nicht identisch
Zitat:
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; |
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 |
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. |
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:
Wenn du dann eine EditAction auf deiner Listenform hast, dann würde folgendes funktionieren:
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;
Delphi-Quellcode:
Getippt und nicht getestet.
procedure TFadrListe.EditAction(Sender: TObject);
begin with TFadr.Create(nil) do if UpdateRecord(TableAdr) then TableAdr.Refresh; end; Grüße vom marabu |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:18 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz