![]() |
Daten anzeigen in StringGrid und TEdit
Hallo,
auf einer Form habe ich unter ein StringGrid einige TEdits platziert. Zu einer markierten Adresse im Grid sollen darin weitere Informationen z.B. die Tel-Nr. angezeigt werden. Diese Daten stehen bereits in der DB. Folgender Code hat leider nicht funktioniert:
Delphi-Quellcode:
Vielen Dank für Hilfe!
procedure TDemoForm.FormShow(Sender: TObject);
begin EdTelefon.Text := QueryAdr.FieldByName('Telefon').AsString; end; Gruß Lombi |
Re: Daten anzeigen in StringGrid und TEdit
Das FormShow wird lediglich einmal aufgerufen. Und wohl sowieso zu früh. Baue die Zeile mal ins OnSelectCell des Grids rein.
|
Re: Daten anzeigen in StringGrid und TEdit
Zitat:
wenn Du die Daten aus der Datenbank in ein StringGrid holst kommst Du mit dem Query auch nicht einfach so weiter. Der Datensatz bleibt ja immer auf dem selben Datensatz der Tabelle stehen. |
Re: Daten anzeigen in StringGrid und TEdit
Delphi-Quellcode:
Guter Vorschlag!
procedure TDemoForm.StringGridSelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean); begin QueryAdr.RecNo := StringGrid.Row; // Codezeile ergänzt! EdTelefon.Text := QueryAdr.FieldByName('Telefon').AsString; end; Eines stört aber: Im Grid muß ich jetzt auf eine markierte Zeile doppelt klicken, damit die passende Tel-Nr. im Edit erscheint. Wie bitte kann ich das abstellen? |
Re: Daten anzeigen in StringGrid und TEdit
Hai LOMBI,
dieses Verfahren hat einen großen Nachteil. Wenn Du die Daten im StringGrid umsortierst stimmen die Nummern der Zeilen nicht mehr mit den RecNo der Datensätze überein. Ich speichere mir Zusatzinfos immer in der ![]() Hier einmal ein Beispiel:
Delphi-Quellcode:
type
TExtraData = class(TObject) FID: Integer; FTelefon: string; public property ID: Integer read FID write FID; property Telefonnummer: string read FTelefon write FTelefon; end; procedure TDemo_Form.FormCreate(Sender: TObject); var MyData: TExtraData; ndx: Integer; begin for ndx := StringGrid1.FixedRows to StringGrid1.RowCount do begin MyData := TExtraData.Create; // Objekt erzeugen MyData.ID := ndx; // Objekt mit Daten füllen MyData.Telefonnummer := Format('Telefonnummer %d', [ndx]); StringGrid1.Cells[1, ndx] := Format('Zeile %d', [ndx]); StringGrid1.Objects[0, ndx] := MyData; // Das Objekt an eine Zeile des SG binden end; end; procedure TDemo_Form.FormDestroy(Sender: TObject); var ndx: Integer; begin // Beim beenden des Programmes den Speicher für die Objekte freigeben for ndx := StringGrid1.FixedRows to StringGrid1.RowCount do begin if Assigned(StringGrid1.Objects[0, ndx]) then begin StringGrid1.Objects[0, ndx].Free; end; end; end; procedure TDemo_Form.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean); var MyData: TExtraData; begin MyData := Pointer((Sender as TStringGrid).Objects[0, ARow]); // Objekt der Zeile auslesen Label1.Caption := MyData.Telefonnummer; // Daten anzeigen Label2.Caption := format('Datensatz-ID %D', [MyData.ID]); end; |
Re: Daten anzeigen in StringGrid und TEdit
Hallo Sharky,
mit Deinem Code kommt es leider zu einer 'Zugriffsverletzung'! |
Re: Daten anzeigen in StringGrid und TEdit
Zitat:
SCRaT |
Re: Daten anzeigen in StringGrid und TEdit
Zugriffsverletzung bei:
Delphi-Quellcode:
Statt dem Label verwende ich ein TEdit!
EdTelefon.Text := MyData.Telefonnummer; // Daten anzeigen
Wozu wird übrigens nachstehende Codezeile benötigt? Die Datensatz-ID muß nicht sichtbar gemacht werden.
Delphi-Quellcode:
Label2.Caption := format('Datensatz-ID %D', [MyData.ID]);
|
Re: Daten anzeigen in StringGrid und TEdit
Hallo Lombi,
setze einfach einen Haltepunkt auf die fragliche Zeile und inspiziere mal die Variable MyData. Wenn diese nil ist, dann hast du den Auslöser für die Zugriffsverletzung gefunden und kannst gezielt nach der Ursache forschen. Sharky konnte nicht wissen welche Felder du anzeigen möchtest und welche nicht. Lasse die Zeile mit der Zuweisung von ID an Label2 einfach weg. Freundliche Grüße |
Re: Daten anzeigen in StringGrid und TEdit
Zitat:
Delphi-Quellcode:
Diese Schreibweise ist besonders hilfreich wenn viele Variablen mittels '+' zu einem String zusammengeführt werden sollen. Hier ist die "format"-Schreibweise wesentlich kürzer. Im Internet (google) gibts einige Seiten, in denen der format-Befehl gut beschrieben ist. Sollte man sich mal zu Gemüte führen wenn man es öfters brauchen könnte!
Label2.Caption := 'Datensatz-ID ' + IntToStr(MyData.ID);
SCRaT |
Re: Daten anzeigen in StringGrid und TEdit
Ja, die Variable MyData ist nil.
Im Debug-Inspektor steht: FTelefon : Nicht verfügbarer Wert Aber das kann nicht sein, weil das Feld "Telefon" in der DB vorhanden ist! Gruß Lombi |
Re: Daten anzeigen in StringGrid und TEdit
Zitat:
Delphi-Quellcode:
?
for ndx := StringGrid1.FixedRows to StringGrid1.RowCount - 1 do
|
Re: Daten anzeigen in StringGrid und TEdit
Zitat:
nur weil das Feld in der DB vorhanden ist bedeutet es ja noch nicht das Du die Zusatzdaten auch richtig an das StringGrid bindest. Zeige doch einmal den Code mit dem Du das StringGrid mit Daten füllst. Zitat:
|
Re: Daten anzeigen in StringGrid und TEdit
Zitat:
|
Re: Daten anzeigen in StringGrid und TEdit
Zitat:
|
Re: Daten anzeigen in StringGrid und TEdit
Guten Morgen
und danke für die rege Beteiligung!
Delphi-Quellcode:
Natürlich wäre das Ganze mit DBGrid und DBEdits einfacher zu lösen, aber darauf möchte ich ungern
procedure TDemoForm.FormCreate(Sender: TObject);
var MyData: TExtraData; ndx: Integer; begin config := TMemIniFile.Create(ChangeFileExt(ParamStr(0), '.ini')); ... with StringGrid do begin if goRowSelect in Options then Row := Pred(RowCount) else Selection := TGridRect(Rect(FixedCols, Pred(RowCount), Pred(ColCount), Pred(RowCount))); if VisibleRowCount < (RowCount - FixedRows) then TopRow := Succ(RowCount - FixedRows - VisibleRowCount) else TopRow := FixedRows; zurückgreifen. Gruß Lombi |
Re: Daten anzeigen in StringGrid und TEdit
Hai LOMBI,
zeige doch einmal den Code in dem Du das StringGrid mit Daten füllst! In dem Codeausschnitt machst Du das ja nicht. |
Re: Daten anzeigen in StringGrid und TEdit
Zitat:
Eine Grundregel des ![]() Es soll die einfachste Lösung, die genau das Gewünschte erreicht, angestrebt werden. |
Re: Daten anzeigen in StringGrid und TEdit
Delphi-Quellcode:
procedure TDemoForm.cmdItemAddExecute(Sender: TObject);
begin with DatModul, ItemDlg do begin ... if ShowModal = mrOK then begin QueryAdr.Append; QueryAdr.FieldByName('Name1').AsString := EdName1.Text; ... QueryAdr.Post; if QueryAdr.Locate('name1', EdName1.Text, []) then StringGrid.Row := QueryAdr.RecNo; end; procedure TDemoForm.DataSetChanged(DataSet: TDataSet); begin if DataSet.Active then StringGrid.RowCount := Max(Succ(DataSet.RecordCount), 2) else StringGrid.RowCount := 2; StringGrid.Invalidate; end; procedure TFDemoForm.DataSourceDemoDataChange(Sender: TObject; Field: TField); begin if not Assigned(Field) then with Sender as TDataSource do if DataSet.Tag = 0 then DataSetChanged(DataSet); end; |
Re: Daten anzeigen in StringGrid und TEdit
Hallo Lombi,
Zitat:
Freundliche Grüße |
Re: Daten anzeigen in StringGrid und TEdit
Guten Morgen marabu,
in Beitrag #4 hatte ich nachträglich meinen Code ergänzt und damit war das Doppelklicken auf eine Gridzeile weg:
Delphi-Quellcode:
Sharky hat mir darauf im Beitrag #5 geantwortet:
...
QueryAdr.RecNo := StringGrid.Row; // Codezeile ergänzt! ... Zitat:
Gruß Lombi |
Re: Daten anzeigen in StringGrid und TEdit
Hallo Lombi,
Zitat:
Alternativ kannst du die Sortierung natürlich immer über SELECT ... ORDER BY erreichen. Dabei wird die Sortierung über LocalSQL erledigt, immer noch clientseitig, aber immerhin nicht durch deinen eigenen Code - und später vielleicht auf einem SQL Server. Willst du unbedingt in deiner Anwendung sortieren, dann kommt auch eine Entkopplung über einen Sortierindex (TIntegerDynArray) in Frage. Dann aber besser mit einem virtuellen Grid (dabei werden die Zellenwerte über OnDrawCell direkt aus den Datenpuffern geholt). Freundliche Grüße |
Re: Daten anzeigen in StringGrid und TEdit
Danke marabu für Deine Hilfe!
Nach dem Start der Anwendung ist im Grid stets die letzte Zeile markiert und dazu im TEdit darunter die Telefon-Nr. des ersten Datensatzes. Erst danach korrelieren die markierten Datensätze mit den jeweiligen Telefon-Nr. |
Re: Daten anzeigen in StringGrid und TEdit
Hallo Lombi,
du kannst das Ereignis OnSelectCell(), dessen Handler die Edit-Felder aktualisiert, auch per Code (vielleicht beim Ereignis OnShow der Form?) auslösen und musst nicht auf die erste Bedieneraktion warten, damit die Feldinhalte synchronisiert werden. Freundliche Grüße |
Re: Daten anzeigen in StringGrid und TEdit
Hallo marabu,
Dein Tipp war (wie immer) goldrichtig! Herzliche Grüße Lombi |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:04 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