AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Record-Feld über Variable ansprechen

Ein Thema von Berserker · begonnen am 15. Aug 2007 · letzter Beitrag vom 15. Aug 2007
Antwort Antwort
Benutzerbild von Berserker
Berserker

Registriert seit: 15. Dez 2002
Ort: Chemnitz
164 Beiträge
 
Delphi 6 Professional
 
#1

Record-Feld über Variable ansprechen

  Alt 15. Aug 2007, 11:38
Servus.

Ich will ein Feld in einem Record mit über eine Variable ansprechen.

Angenommen das Record sieht wie folgt aus:

Delphi-Quellcode:
type TTestRecord = record
    Test1: integer;
    Test2: integer;
    Test3: integer;
    Test4: integer;
end;
nun will ich mittels einer Funktion einen Wert auslesen:

z.B. function getValueFromRecord(fieldname: string): integer; also

i := getValueFromRecord('Test1'); Wie ist das zu bewerkstelligen?
Da ich bisher nur mit Datenbanken hantiere ist das neu für mich.

Bei einer DBTable kann ich den Wert vom aktuellen Datensatz mit

FieldByName(varibale).AsInteger; holen.

MfG, Ronny
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Record-Feld über Variable ansprechen

  Alt 15. Aug 2007, 11:50
einfach
<Recordvariable>.<Feldname>
z.b.
Delphi-Quellcode:
    TestRecord: TTestRecord;
...
    TestRecord.Test1
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von jim_raynor
jim_raynor

Registriert seit: 17. Okt 2004
Ort: Berlin
1.251 Beiträge
 
Delphi 5 Standard
 
#3

Re: Record-Feld über Variable ansprechen

  Alt 15. Aug 2007, 12:12
Man kann nicht über den Namen als String direkt auf ein Feld zugreifen, da dazu ganz einfach, die Informationen zur Laufzeit fehlen. Man könnte es über Objekte mit published-Properties machen. Diese kann man dann über die Hier im Forum suchenRTTI abfragen. Aber mit Records würde nur eine feste "Verdrahtung" funktionieren. Also:

Delphi-Quellcode:
function getValueFromRecord(fieldname: string): integer;
begin
  if fieldname='Test1then
    result:=myRec.Test1
  else if fieldname='Test2then
    result:=myRec.Test2
  ...
end;
Christian Reich
Schaut euch mein X-COM Remake X-Force: Fight For Destiny ( http://www.xforce-online.de ) an.
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Record-Feld über Variable ansprechen

  Alt 15. Aug 2007, 12:20
Was natürlich auch gehen würde:

Delphi-Quellcode:
function getValueFromRecord(fieldname: string; rec: TTestRecord): integer;
var index: Integer;
begin
  if TryStrToInt(copy(fieldname, 5, length(fieldname)-4), index) then
    Result:=PInteger(Cardinal(@rec)+(index-1)*4)^
  else
    Result:=0;
end;
Müsste gehen. Aber natürlich nur, wenn die Zahl drinsteht.

Ansonsten könntest du dir einfach eine Funktion basteln, die per if den Parameter fieldname auf bestimmte Werte überprüft und dann das richtige zurückgibt.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: Record-Feld über Variable ansprechen

  Alt 15. Aug 2007, 12:32
Zitat von jim_raynor:
Man kann nicht über den Namen als String direkt auf ein Feld zugreifen, da dazu ganz einfach, die Informationen zur Laufzeit fehlen
Warum sollte dies nicht gehen?

/edit:
Aus der Delphi7-Hilfe:
Zitat:
Ein Record (in einigen Programmiersprachen auch als Struktur bezeichnet) stellt eine heterogene Menge von Elementen dar. Die Elemente werden Felder genannt. In der Deklaration eines Record-Typs wird für jedes Feld ein Name und ein Typ festgelegt. Die Syntax für die Deklaration eines Record-Typs lautet

type RecordTypName = record
Felderliste1: Typ1;
...
Felderlisten: Typn;
end

Recordtypname ist ein gültiger Bezeichner, Typ gibt einen Typ an, und Feldliste ist ein gültiger Bezeichner oder eine Liste von Bezeichnern, die durch Kommas voneinander getrennt sind. Der letzte Strichpunkt ist optional.

Die folgende Deklaration legt einen Record-Typ namens TDateRec an:

type
TDateRec = record
Year: Integer;
Month: (Jan, Feb, Mar, Apr, May, Jun,
Jul, Aug, Sep, Oct, Nov, Dec);
Day: 1..31;
end;

Jeder TDateRec-Record enthält drei Felder: einen Integer-Wert namens Year, einen Aufzählungswert namens Month und einen weiteren Integer-Wert zwischen 1 und 31 namens Day. Die Bezeichner Year, Month und Day sind Feldbezeichner für TDateRec und verhalten sich wie Variablen. Die Typdeklaration für TDateRec weist den Feldern Year, Month und Day aber keinen Speicherplatz zu. Die Reservierung des Speichers erfolgt erst, wenn der Record instantiiert wird:

var Card1, Card2: TDateRec;

Diese Variablendeklaration erzeugt zwei Instanzen von TDateRec namens Record1 und Record2.

Sie können auf die Felder eines Records zugreifen, indem Sie die Feldbezeichner mit dem Record-Namen qualifizieren:

Record1.Year := 1904;
Record1.Month := Jun;
Record1.Day := 16;

Alternativ dazu ist auch die Verwendung einer with-Anweisung möglich:

with Record1 do
begin
Year := 1904;
Month := Jun;
Day := 16;
end;

Nun können die Werte der Felder von Record1 nach Record2 kopiert werden:

Record2 := Record1;

Da der Gültigkeitsbereich eines Feldbezeichners auf den Record beschränkt ist, in dem er sich befindet, brauchen Sie nicht auf eventuelle Namenskonflikte zwischen Feldbezeichnern und anderen Variablen zu achten.
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Record-Feld über Variable ansprechen

  Alt 15. Aug 2007, 13:06
Also: Du hast jetzt einen Record. Und du hast einen String. In dem String steht der Name irgendeines Feldes des Records. Wie willst du jetzt von dem Feld direkt auf das Record-Feld zugreifen?
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Benutzerbild von jim_raynor
jim_raynor

Registriert seit: 17. Okt 2004
Ort: Berlin
1.251 Beiträge
 
Delphi 5 Standard
 
#7

Re: Record-Feld über Variable ansprechen

  Alt 15. Aug 2007, 13:10
Zitat von RavenIV:
Zitat von jim_raynor:
Man kann nicht über den Namen als String direkt auf ein Feld zugreifen, da dazu ganz einfach, die Informationen zur Laufzeit fehlen
Warum sollte dies nicht gehen?
Ähh. Vielleicht hast du es nicht mitbekommen, aber er möchte anhand des Names zur Laufzeit auf ein Feld zugreifen. Also in einer String-Variable steht 'Test1' und dann möchte er über eine Funktion auf das Feld Test1 des Records zu greifen.
Christian Reich
Schaut euch mein X-COM Remake X-Force: Fight For Destiny ( http://www.xforce-online.de ) an.
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#8

Re: Record-Feld über Variable ansprechen

  Alt 15. Aug 2007, 13:10
Zitat von RavenIV:
Zitat von jim_raynor:
Man kann nicht über den Namen als String direkt auf ein Feld zugreifen, da dazu ganz einfach, die Informationen zur Laufzeit fehlen
Warum sollte dies nicht gehen?
Weil dazu ganz einfach die Informationen zur Laufzeit fehlen ? Die Beziehung zwischen Namen und Offset eines Recordfeldes ist nur zur Compilezeit bekannt und wird nicht in der Exe gespeichert. Hat man also zur Laufzeit nur einen String des Feldnamens (und auf nichts anderes hat sich jim_raynor bezogen), kommt man nur über Umwege wie der von 3_of_8, der ja auch wieder auf Informationen zur Compilezeit basiert, an den entsprechenden Wert.

[edit]....[/edit]
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:31 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