Zugriff auf ein Recordelement über 'Namen'

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
charlytango
Beiträge: 1095
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Zugriff auf ein Recordelement über 'Namen'

Beitrag von charlytango »

Habe da ein Syntaxproblem. Möchte die Editfelder auf einem Formular automatisiert aus einem Record befüllen (weil der Record eigentlich recht groß ist und ich mir Schreibarbeit und Fehler vermeiden will.

Code: Alles auswählen

type
  TLabelSettings = record
    ESID: integer;
    CutmarkOffsetTop: integer;
    CutmarkOffsetBottom: integer;
    LabelOffsetTop: integer ;
    Name: string ;
end; 

Die Editfelder sind TDBEdit deren Datenbankfeld genauso heißt wie die Entsprechung im Record, also z.B 'LabelOffsetTop'

Code: Alles auswählen

  for i:=0 to ComponentCount-1 do begin
    sName:=TComponent(Components[i]).Name;
    c:=FindComponent(sName);

  if (c is TDBEdit) then
     TDBEdit(c).Text:= ??? //<irgendwie auf den Inhalt von TLabelsettings zugreifen mittels TDBEdit(c).Datafield> ;

  end;  


Wie stelle ich es an Zugriff auf ein Recordelement zu bekommen wenn ich nur den Feldnamen habe. Und dann ist noch das Problem der Umwandlung von zb integer weil ich ja auch nicht weiß welchen Datentyp das Recordelement hat???

Geht das elegant?

paweld
Beiträge: 92
Registriert: So 11. Jun 2023, 16:01
OS, Lazarus, FPC: Lazarus trunk, FPC fixes

Re: Zugriff auf ein Recordelement über 'Namen'

Beitrag von paweld »

Im Falle ein Recordelement, nein. Sie können jedoch Klassen und RTTI verwenden - ein Beispiel finden Sie im Anhang.

In Ihrem Fall würde der Code mehr oder weniger so aussehen (unter Verwendung der Unit "ClassInfoU.pas"):

Code: Alles auswählen

type

  TLabelSettings = class
  private
    FCutmarkOffsetBottom: integer;
    FCutmarkOffsetTop: integer;
    FESID: integer;
    FLabelOffsetTop: integer;
    FName: string;
  published
    property ESID: integer read FESID write FESID;
    property CutmarkOffsetTop: integer read FCutmarkOffsetTop write FCutmarkOffsetTop;
    property CutmarkOffsetBottom: integer read FCutmarkOffsetBottom write FCutmarkOffsetBottom;
    property LabelOffsetTop: integer read FLabelOffsetTop write FLabelOffsetTop;
    property Name: string read FName write FName;
  end;

// ...

implementation

uses
  ClassInfoU;

procedure TForm1.GetDataFormLabelSettings(aSrc: TLabelSettings);
var
  i: Integer;
  sName: String;
begin
  for i:=0 to ComponentCount - 1 do
  begin
    sName := TComponent(Components[i]).Name;
    if TObject(Components[i]).ClassType is TDBEdit then
       TDBEdit(TObject(Components[i])).Text := GetClassPropertyAsString(aSrc, TDBEdit(TObject(Components[i])).DataField);
  end;
end;                 
Bearbeiten: Die Möglichkeit, Werte nach Eigenschaftsindex abzurufen, wurde hinzugefügt.
Dateianhänge
Project1.zip
(5.39 KiB) 55-mal heruntergeladen
Grüße / Pozdrawiam
paweld

charlytango
Beiträge: 1095
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Zugriff auf ein Recordelement über 'Namen'

Beitrag von charlytango »

Danke für die Antwort.

Diese Strategie/Technik ist mir durchaus bekannt, ich hoffte nur auf eine elegante Syntax um Schreibarbeit zu sparen.

In diesem Fal würde ich die Zuweisungen per Record durch eine Unmenge an Properties tauschen. Würde die Sache nur unübersichtlicher machen.

THX.

BTW: soweit ich weiß, sind wir hier im Forum "per du"

Mathias
Beiträge: 6964
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Zugriff auf ein Recordelement über 'Namen'

Beitrag von Mathias »

BTW: soweit ich weiß, sind wir hier im Forum "per du"
Ist OffTopic, solche Probleme können vom Übersetzer kommen.
"Könntest du mir dies bitte übersetzen ?" -> "Could you please translate this for me?" -> "Könnten Sie mir das bitte übersetzen?"
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

paweld
Beiträge: 92
Registriert: So 11. Jun 2023, 16:01
OS, Lazarus, FPC: Lazarus trunk, FPC fixes

Re: Zugriff auf ein Recordelement über 'Namen'

Beitrag von paweld »

charlytango hat geschrieben: BTW: soweit ich weiß, sind wir hier im Forum "per du"
@charlytango: Es tut mir leid, wenn ich Sie beleidigt habe, aber wie @Mathias sagte, stammt der Text von einem Übersetzer (deepl).
Grüße / Pozdrawiam
paweld

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Zugriff auf ein Recordelement über 'Namen'

Beitrag von Socke »

Im FPC trunk gibt es schon (experimentelle) Unterstützung für Extended RTTI. Damit kann man auch zur Laufzeit auf Recordelemente zugreifen.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Soner
Beiträge: 739
Registriert: Do 27. Sep 2012, 00:07
OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
CPU-Target: x86_64-win64
Wohnort: Hamburg

Re: Zugriff auf ein Recordelement über 'Namen'

Beitrag von Soner »

Ich würde es so machen, siehe Kommentare:

Code: Alles auswählen

var aFieldVal: string;
begin
  //....
  for i:=0 to ComponentCount-1 do begin
    sName:=TComponent(Components[i]).Name;
    //wie so denn doppelt suchen?  c:=FindComponent(sName);                               
    c:=Components[i]; // <-- du hast doch schon die Komponente
  
  if (c is TDBEdit) then begin
     aFieldVal:='_Nicht gefunden 123';
     case  (c as TDBEdit).FieldName of
       'ESID': aFieldVal:= MyLabelsettings.ESID.AsInteger;
       'CutmarkOffsetTop': aFieldVal:= MyLabelsettings.CutmarkOffsetTop.AsInteger;
       // ....     
     end;       
     if aFieldVal<>'_Nicht gefunden 123' then TDBEdit(c).Text:= aFieldVal;
  end;
end;

charlytango
Beiträge: 1095
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Zugriff auf ein Recordelement über 'Namen'

Beitrag von charlytango »

paweld hat geschrieben: Fr 21. Jun 2024, 10:08
charlytango hat geschrieben: BTW: soweit ich weiß, sind wir hier im Forum "per du"
@charlytango: Es tut mir leid, wenn ich Sie beleidigt habe, aber wie @Mathias sagte, stammt der Text von einem Übersetzer (deepl).
@paweld
Ich bin es, der um Verzeihung bitten muss, weil ich nicht bedacht habe, dass da noch ein Übersetzer dazwischen ist. Und ich damit jemanden in eine unangenehme Lage gebracht habe.

Ich bin gar nicht beleidigt, im Gegenteil. Ich bin hocherfreut ein so aktives Mitglied im Forum begrüßen zu dürfen und habe nur eine freundschaftliche Anrede angeboten.

Ich hoffe ich kann mich mit Tips irgendwann auch revanchieren, den die Hilfestellung in Sachen Lazreport war genial und hat mich auf einen Weg geführt den ich vorher nicht kannte -- Danke noch einmal

Antworten