Delphi-PRAXiS

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 Bezeichnungen eines Records über Item ermitteln (https://www.delphipraxis.net/64557-bezeichnungen-eines-records-ueber-item-ermitteln.html)

Ralf Stehle 5. Mär 2006 09:09


Bezeichnungen eines Records über Item ermitteln
 
Ist es möglich, die Bezeichnungen in einem Record über einen Pointer oder eine Art von Item-Funktion zu ermitteln?

Beispiel:

Delphi-Quellcode:
type TStammdaten = record
  TITEL                    :String[20];
  NACHNAME                 :String[40];
  VORNAME                  :String[28];
  GEBURTSNAME              :String[40];
  GEBURTSDATUM             :String[12];
  GESCHLECHT               :String[1];
  STRASSE                  :String[40];
  PLZ                      :String[7];
  ORT                      :String[40];
end;
und jetzt möchte ich in einer Schleife alle Stammdatennamen herausbekommen:
(der Code ist natürlich völlig falsch und soll nur zeigen, was ich eigentlich suche)

Delphi-Quellcode:
for i := 0 to 8 do
begin
  if TStammdaten.Item[i].Name = 'Ort' then Showmessage('das ist der Wohnort des Mitglieds');
end;
geht das irgendwie mit einem Pointer auf das Record?

Delphi-Quellcode:
  myStammdaten = ^TStammdaten

mkinzler 5. Mär 2006 09:19

Re: Bezeichnungen eines Records über Item ermitteln
 
Du hast ja 2 Scahen vermischt, du hast einen Record und eine Klase welche eine Eigenschaft Items hat welche eine Liste oder eienen Array von diesem Recird besitzt
Du könntest wie folgend vorgehen

Delphi-Quellcode:
type
  TStammdatum = record
    TITEL                    :String[20];
    NACHNAME                 :String[40];
    VORNAME                  :String[28];
    GEBURTSNAME              :String[40];
    GEBURTSDATUM             :String[12];
    GESCHLECHT               :String[1];
    STRASSE                  :String[40];
    PLZ                      :String[7];
    ORT                      :String[40];
  end;

  TStammdaten = class
     ..
     Items: Array of TStammDatum;
     ..
     procedure add ( wert: TStammdatum);
     var
        pos: Integer;
     begin
        pos := Length( items) +1 :
        SetLength( Items, pos);
        Items[pos] := Wert;
     end;
     ...
  end;

Ralf Stehle 5. Mär 2006 09:26

Re: Bezeichnungen eines Records über Item ermitteln
 
Das sieht ja ganz gut aus, da ich mich aber mit Klassen nicht auskenne, konnte ich das nicht in meinem Programm übernehmen. Ich habe Dein Beispiel 1:1 in meiner Deklaration übernommen, aber mit der Procedure innerhalb der Deklaration kommt Delphi nicht zurecht. Wo muss ich denn Deinen Aufruf

Zitat:

TStammdaten = class
innerhalb meiner Unit plazieren?

mkinzler 5. Mär 2006 09:33

Re: Bezeichnungen eines Records über Item ermitteln
 
zieh sie raus: also in der Klassendefinition nur den Kopf und später im Implementationsteil die Implementierung
Delphi-Quellcode:
type
  ...
  TStammdaten = class
     ..
     Items: Array of TStammDatum;
     ..
     procedure add ( wert: TStammdatum);
     ...
  end;

procedure TStammdaten.add ( wert: TStammdatum);
     var
        pos: Integer;
     begin
        pos := Length( items) +1 :
        SetLength( Items, pos);
        Items[pos] := Wert;
end;

Ralf Stehle 5. Mär 2006 09:50

Re: Bezeichnungen eines Records über Item ermitteln
 
Entschuldige, aber ich bin etwas schwer von Begriff.
Die Deklaration ist jetzt klar und ohne Fehlermeldung, ich habe aber Verständnisschwierigkeiten, was die Procedure eigentlich macht und wann Sie aufgerufen werden muss. Wie wird der Item denn jetzt ermittelt? Kannst Du mir noch mit einem kleinen Beispiel helfen?


So sieht das jetzt bei mir aus:

In einer Unit Main wird der Record mit Daten gefüllt, dort möchte ich den Record aber ja nicht über die Bezeichnung sondern über eine Zahl (Item) ansprechen:

Delphi-Quellcode:
unit uMain;

interface

uses
  uDefinitionen;

implementation

var
  Mitgliedsdaten: TStammdaten;
begin
  Mitgliedsdaten.Nachname := 'Maier'; //so nicht gewünscht
  Mitgliedsdaten.Item[2] := 'Maier'; //so ähnlich soll es aussehen
end;
hier stehen die Deklarationen

Delphi-Quellcode:
unit uDefinitionen;

interface

type
  TStammdatum = record
    TITEL                    :String[20];
    NACHNAME                 :String[40];
    VORNAME                  :String[28];
    GEBURTSNAME              :String[40];
    GEBURTSDATUM             :String[12];
    GESCHLECHT               :String[1];
    STRASSE                  :String[40];
    PLZ                      :String[7];
    ORT                      :String[40];
  end;

type
  TStammdaten = class
     Items: Array of TStammDatum;
     procedure add(wert: TStammdatum);
  end;

implementation

procedure TStammdaten.add(wert:TStammdatum);
var
  pos: Integer;
begin
  pos := Length(items) + 1;
  SetLength(Items, pos);
  Items[pos] := Wert;
end;

end.

mkinzler 5. Mär 2006 09:59

Re: Bezeichnungen eines Records über Item ermitteln
 
Delphi-Quellcode:
unit uMain;

interface

uses
  uDefinitionen;

implementation

var
  Mitgliedsdaten: TStammdaten;
  Datum : TStammdatum;
begin
  Mitgliedsdaten := TStammdaten.Create; // Instanz der Klasse erzeugen
  Datum.Nachname := Maier;
  Mitgliedsdaten.Add( Datum);
end;
 
end;
Zugriff dananch durch
Delphi-Quellcode:
Mitgliedsdaten.Item[0]
auf TMitglieddatum-Struktur oder auf Nachname über
Delphi-Quellcode:
Mitgliedsdaten.Item[0].Nachname
möglich.

Ralf Stehle 5. Mär 2006 10:12

Re: Bezeichnungen eines Records über Item ermitteln
 
:-D :-D :-D :-D :-D :-D :-D :-D :-D :-D :-D :-D :-D :-D :-D

Super, jetzt habe ich einiges dazugelernt
Vielen Dank dass Du dafür Deine Zeit geopfert hast

:-D :-D :-D :-D :-D :-D :-D :-D :-D :-D :-D :-D :-D :-D :-D


Viele Grüsse
Ralf

Waldteufel 5. Mär 2006 10:45

Re: Bezeichnungen eines Records über Item ermitteln
 
Hi Ralf.

Ähem... Bist du dir sicher, dass das das ist, was du willst? :gruebel:
Mit der Methode von mkinzler erstellst du eine Liste von Stammdaten, deine Problembeschreibung hört sich aber eher danach an, dass du folgendermaßen auf den Record zugreifen willst:

Delphi-Quellcode:
type TStammdaten = record
  TITEL       : String[20];
  NACHNAME    : String[40];
  VORNAME     : String[28];
  GEBURTSNAME : String[40];
  GEBURTSDATUM : String[12];
  GESCHLECHT  : String[1];
  STRASSE     : String[40];
  PLZ         : String[7];
  ORT         : String[40];
end;

// ...

var
  a : TStammdaten;
begin
  a[1].Value := 'Prof. Dr. med. dent.'; // a[1] ist TITEL
  a[2].Value := 'Schneider'; // a[2] ist NACHNAHME

  if a[3].Name = 'VORNAME' then ShowMessage('Alles in Ordnung');
  { usw... }
end.
Nun, um es kurz zu machen: Es geht nicht. Man kann Records nicht wie Arrays indizieren.

PS: Unter .NET wäre es über Reflection und Konsorten möglich, aber das führt zu weit vom Thema weg...

Ralf Stehle 5. Mär 2006 11:40

Re: Bezeichnungen eines Records über Item ermitteln
 
Ich möchte die Bezeichnung im Record über einen Index abfragen und nicht den Inhalt
Das muss ich mal alles in Ruhe durchprobieren. Leider muss ich für heute Schluss machen


Einen schönen Sonntag wünscht euch

Ralf

Ralf Stehle 5. Mär 2006 21:33

Re: Bezeichnungen eines Records über Item ermitteln
 
So, jetzt habe ich das alles noch mal durchprobiert. Der Vorschlag von mkinzler funktioniert leider nicht. Ich kann immer noch nicht auf die Record.Namen über einen Index zugreifen
Ich suche eine Methode um anstatt

Stammdaten.Nachname := 'Müller';
Stammdaten[1] := 'Müller'; oder Stammdaten[1].name := 'Müller';

einzugeben

Der Aufruf
Delphi-Quellcode:
Mitgliedsdaten.Items[0]
ergibt nur eine Fehlermeldung

Delphi-Quellcode:
Mitgliedsdaten.Items[0].Nachname
ist ja nichts anderes als ein Array von meinem Record. Den kann ich auch einfacher haben:

Delphi-Quellcode:
type TStammdaten = record
  TITEL                    :String[20];
  NACHNAME                 :String[40];
  VORNAME                  :String[28];
  GEBURTSNAME              :String[40];
  GEBURTSDATUM             :String[12];
  GESCHLECHT               :String[1];
  STRASSE                  :String[40];
  PLZ                      :String[7];
  ORT                      :String[40];
end;

type
  StammdatenArray = array of TStammdaten;


.....
StammdatenArray[0].Nachname := 'Müller';
....

Ralf Stehle 5. Mär 2006 21:40

Re: Bezeichnungen eines Records über Item ermitteln
 
Eine kleine Anmerkung warum ich das unter anderem brauche:

wie kann man die Daten eines Array von Typ eines Record löschen?

Mein Record hat z.B. 9 Datentypen und eine Datenlänge von 30 mit Setlength festgelegt. Muss ich eine Schleife basteln, die die 9 x 30 Datenfelder einzeln wieder mit einem Nullstring belegt?

mkinzler 5. Mär 2006 21:41

Re: Bezeichnungen eines Records über Item ermitteln
 
Mir ist ehrlich gesagt noch nicht ganz klar was du eigentlich suchst.

mkinzler 5. Mär 2006 21:42

Re: Bezeichnungen eines Records über Item ermitteln
 
Zitat:

Zitat von Ralf Stehle
Eine kleine Anmerkung warum ich das unter anderem brauche:

wie kann man die Daten eines Array von Typ eines Record löschen?

Mein Record hat z.B. 9 Datentypen und eine Datenlänge von 30 mit Setlength festgelegt. Muss ich eine Schleife basteln, die die 9 x 30 Datenfelder einzeln wieder mit einem Nullstring belegt?

SetLength auf 0

Ferber 5. Mär 2006 22:01

Re: Bezeichnungen eines Records über Item ermitteln
 
Vielleicht blöde Frage: Warum verwendet Du nicht TList ?

Zitat:

wie kann man die Daten eines Array von Typ eines Record löschen?
Verwende einen 'Packed Record' und
Delphi-Quellcode:
Fillchar(MyRec, SizeOf(MyRec), 0)

Ralf Stehle 5. Mär 2006 22:12

Re: Bezeichnungen eines Records über Item ermitteln
 
mkinzler schreibt

Zitat:

Mir ist ehrlich gesagt noch nicht ganz klar was du eigentlich suchst.
Ich möchte die Bezeichner meines Records wie in einer TList über den Index ansprechen,
also anstatt

Mitgliedsdaten.Nachname := 'Müller'
Mitgliedsdaten.Vorname := 'Max'
Mitgliedsdaten.Telefon := '01234-5678'


Mitgliedsdaten.Item[1] := 'Müller'
Mitgliedsdaten.Item[2] := 'Max'
Mitgliedsdaten.Item[3] := '01234-5678'

nur dass das ich es nicht schaffe, Dein Beispiel zu übernehmen, sondern ich erhalte statt einem Record ein Array von Records.

Ferber hat gerade vorgeschlagen, TList zu benutzen. Mein entgültiges Ziel ist aber tatsächlich ein Array des TStammdaten-Records, praktisch wie in einer Datenbank. Ich habe auch schon mal den Umweg über ein AdoDataSet benutzt, das geht eigentlich auch ganz gut, ist aber etwas zweckentfremdet. Die Alternative wäre wohl das dpCollection-Projekt. dpCollection. Das kapiere ich aber nicht so recht

Ferber 5. Mär 2006 22:23

Re: Bezeichnungen eines Records über Item ermitteln
 
TList ist im Prinzip nichts anderes als ein Array !
TStringlist ist zB ein Nachfahre von TList, und kann ua. sortieren.
Collections sind für Dein Problem nicht relevant.

mkinzler 5. Mär 2006 22:30

Re: Bezeichnungen eines Records über Item ermitteln
 
Ich habe dich da falsch verstanden, mit einem normalen Record wird das aber sicherlich schwer. Ween du aber einen Klasse benutzt könnte man das über properies erreichen.

Delphi-Quellcode:
type
   TStammdaten = class
    Items: Array[0..8] of string[40];
  public
    function getTitel: ShortString;
    procedure setTitel( value: ShortString);
    property TITEL: ShortString read getTitel write setTitel;
    ...
end;

 ...

function TStammdaten.getTitel: ShortString;
begin
   result := Items[0];
end;

procedure TStammdaten.setTitel(value: ShortString);
begin
  Items[0] := value;
end;

mkinzler 5. Mär 2006 22:31

Re: Bezeichnungen eines Records über Item ermitteln
 
Einmal reicht ;-)

Ferber 5. Mär 2006 22:42

Re: Bezeichnungen eines Records über Item ermitteln
 
Delphi-Quellcode:
type
  PStammdaten = ^TStammdaten;
  TStammdaten = packed record
    TITEL      :String[20];
    NACHNAME   :String[40];
    VORNAME    :String[28];
    GEBURTSNAME :String[40];
    GEBURTSDATUM:String[12];
    GESCHLECHT :String[1];
    STRASSE    :String[40];
    PLZ        :String[7];
    ORT        :String[40];
  end;

//Ungefähre Verwendung:

procedure TForm1.Button1Click(Sender: TObject);
var
  li:TList;
  sd:PStammDaten;
begin
  li:=TList.Create;
  sd:=New(PStammdaten);
  sd.TITEL :='Hugo';

  li.Add(sd);
end;

Ralf Stehle 5. Mär 2006 23:19

Re: Bezeichnungen eines Records über Item ermitteln
 
Ferber hat mir ein Beispiel aus der Delphi-Hilfe gepostet, damit habe ich aber nur einen Index durch die TList auf den einzelnen Datensatz, nicht jedoch auf die Titel der einzelnen Felder wie Nachname, Vorname usw.

Das Beispiel von mkinzler verstehe ich nicht ganz, sieht gut aus, ein bisschen Beispielcode drumherum könnte vielleicht zu einem geglückten Abschluss des Themas führen

Euer

Ralf

Ferber 5. Mär 2006 23:26

Re: Bezeichnungen eines Records über Item ermitteln
 
@Ralf: Delphi-Hilfe ? :shock:
Selbverständlich hast Du Zugriff auf alle Datenfelder des Records.
Brauchst Du dazu auch noch ein Code-Beispiel ?

Delphi-Quellcode:
  li.Items[i]^.Name='Hugo';
@mkinzler: Ist es nicht etwas übertrieben einen simplen Record in ein Objekt zu packen
und mit Methoden auf die DatenFelder zuzugreifen ?
Bitte lies Deinen Code nochmal durch, ist wohl schon spät !!! :???:

mkinzler 6. Mär 2006 06:15

Re: Bezeichnungen eines Records über Item ermitteln
 
Er möchte ja auf Felder des Record indizier zugreifen. Deshalb habe ich ihm den Vorschalg gemacht, einen Array zu nehmen und den Zugriff per Name über proprties zu erledigen.
Zitat:

Zitat von Ralf Stehle
also anstatt

Mitgliedsdaten.Nachname := 'Müller'
...
Mitgliedsdaten.Item[1] := 'Müller'



Alle Zeitangaben in WEZ +1. Es ist jetzt 02:40 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