Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Daten anzeigen in StringGrid und TEdit (https://www.delphipraxis.net/92688-daten-anzeigen-stringgrid-und-tedit.html)

LOMBI 24. Mai 2007 12:12


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:
 procedure TDemoForm.FormShow(Sender: TObject);
begin
  EdTelefon.Text := QueryAdr.FieldByName('Telefon').AsString;
end;
Vielen Dank für Hilfe!

Gruß
Lombi

Hansa 24. Mai 2007 12:29

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.

Sharky 24. Mai 2007 12:59

Re: Daten anzeigen in StringGrid und TEdit
 
Zitat:

Zitat von LOMBI
....StringGrid einige TEdits platziert. ...

Hai Lombi,

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.

LOMBI 24. Mai 2007 13:59

Re: Daten anzeigen in StringGrid und TEdit
 
Delphi-Quellcode:
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;
Guter Vorschlag!

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?

Sharky 25. Mai 2007 05:49

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 Delphi-Referenz durchsuchenObjects Eigenschaft.

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;

LOMBI 26. Mai 2007 12:15

Re: Daten anzeigen in StringGrid und TEdit
 
Hallo Sharky,

mit Deinem Code kommt es leider zu einer 'Zugriffsverletzung'!

scrat1979 28. Mai 2007 09:52

Re: Daten anzeigen in StringGrid und TEdit
 
Zitat:

Zitat von LOMBI
Hallo Sharky,

mit Deinem Code kommt es leider zu einer 'Zugriffsverletzung'!

An welcher STelle wird die Zugriffsverletzung ausgelöst?

SCRaT

LOMBI 29. Mai 2007 11:21

Re: Daten anzeigen in StringGrid und TEdit
 
Zugriffsverletzung bei:

Delphi-Quellcode:
EdTelefon.Text := MyData.Telefonnummer; // Daten anzeigen
Statt dem Label verwende ich ein TEdit!

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]);

marabu 29. Mai 2007 12:05

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

scrat1979 29. Mai 2007 12:33

Re: Daten anzeigen in StringGrid und TEdit
 
Zitat:

Zitat von LOMBI

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]);

Die Zeile ist die einfachere Lösung für folgenden Syntax (gleichwertig):

Delphi-Quellcode:
Label2.Caption := 'Datensatz-ID ' + IntToStr(MyData.ID);
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!


SCRaT


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:23 Uhr.
Seite 1 von 3  1 23      

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