AGB  ·  Datenschutz  ·  Impressum  







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

Records dynamisch durchlaufen

Ein Thema von mickmack · begonnen am 24. Sep 2003 · letzter Beitrag vom 26. Sep 2003
Antwort Antwort
mickmack

Registriert seit: 24. Sep 2003
Ort: Hamburg
51 Beiträge
 
#1

Records dynamisch durchlaufen

  Alt 24. Sep 2003, 21:00
Gibt es eine Möglichkeit ein Record dynamisch zu durchlaufen?

Hatte an etwa sowas gedacht:
Delphi-Quellcode:
TRec = record
        name:string;
        nachname:string;
        alter: 1..110;
       end;

MyRec:TRec;

//nur PseudoCode
while not AmRecordEnde do
begin
  -gebe aktuelles Recordelement aus
   (in ersten Fall das Element name etc)
  -gehe zum nächsten Recordelement
end;
Mir würde es auch schon reichen irgendwie die Elementanzahl des Records zu ermitteln (im Beispiel 3 Elem.).

Gibt es da ne Möglichkeit, oder muss man immer ein Array mitlaufen lassen, um eine gewisse Dynamik zu erhalten.

Also ich hoffe das ist soweit einigermaßen verständlich. War gar nicht so leicht zu formulieren
Tu es oft - Bald bist du zu alt.
  Mit Zitat antworten Zitat
Benutzerbild von Tonic1024
Tonic1024

Registriert seit: 10. Sep 2003
Ort: Cuxhaven
559 Beiträge
 
RAD-Studio 2009 Ent
 
#2

Re: Records dynamisch durchlaufen

  Alt 25. Sep 2003, 07:59
Moin...


Du könntest deinen Record mir nem Array "kreuzen". zum Bleistiel so:
Delphi-Quellcode:
TRec = record
        name:Array of string;
        nachname:Array of string;
        alter:Array of integer;
       end;
dann musst du zwar immernoch name, nachname und alter ausschreiben, aber brauchst das nur einmal machen und kannst den rest in einer Schleife abarbeiten.

Erstellst du denn den record dynamisch? sonst weisst du doch wie lang der ist?!?

bis denne...
Der frühe Vogel fängt den Wurm, richtig.
Aber wird nicht auch der frühe Wurm vom Vogel gefressen?
  Mit Zitat antworten Zitat
mickmack

Registriert seit: 24. Sep 2003
Ort: Hamburg
51 Beiträge
 
#3

Re: Records dynamisch durchlaufen

  Alt 25. Sep 2003, 09:39
Zitat von Tonic1024:
Erstellst du denn den record dynamisch? sonst weisst du doch wie lang der ist?!?
Ja aber das ist ja das Problem. Ich lese an mehreren Stellen das Record aus, zB um es in ein StringGrid einzulesen. Wenn ich jetzt aber das Record verändere, dh ein Element hinzufüge oder entferne muss ich überall den gesamten Code anpassen.
Ganz praktisch wäre so etwas auch im folgenden Fall: wenn man zB das Record über ein Form einlesen möchte, muss man jetzt noch dieses Form statisch zur Erstellungszeit erzeugen. Toll wäre es doch aber, wenn es ne Möglichkeit gäbe, dieses Form in Abhängigkeit von der Anzahl der Recordelemente zur Laufzeit zu erstellen.
Das Einzige was mir dazu einfiel, ist entweder eine Konstante mit der Länge des Records, bzw ein Array in dem nocheinmal die Elementnamen des Records gespeichert sind. Dieses Array könnte man dann dynamisch durchlaufen.
Aber das ist ja eigentlich das, was ich umgehen möchte. So muss ich zwar nicht ständig den ganzen Code ändern, aber immerhin noch zwei Quellen pflegen, das Record und das Array.
Mir schwebt halt vor, nur das Record pflegen zu müssen.
Tu es oft - Bald bist du zu alt.
  Mit Zitat antworten Zitat
Tpercon

Registriert seit: 7. Jun 2002
638 Beiträge
 
Delphi 5 Professional
 
#4

Re: Records dynamisch durchlaufen

  Alt 25. Sep 2003, 10:03
@ Tonic1024:
Das wäre aber praktischer (wobei ich auch nicht ganz die Frage verstehe):
Delphi-Quellcode:
TRec = record
        name:string;
        nachname:string;
        alter: 1..110;
       end;

MyRec:array of TRec;
  Mit Zitat antworten Zitat
mickmack

Registriert seit: 24. Sep 2003
Ort: Hamburg
51 Beiträge
 
#5

Re: Records dynamisch durchlaufen

  Alt 25. Sep 2003, 10:20
Ich versuch mein Problem noch einmal über das Beispiel mit dem Einlesen der Recorddaten deutlich zu machen.
Um die Daten einzulesen, brauch ich doch ein Form, das für jedes Recordelement ein Editfeld besitzt. Dieses Form erstellt man doch aber zur Designzeit.
Wenn ich jetzt aber den Typen des Records ändere(siehe Beispiel), muss ich doch auch per Hand das Formular anpassen. Ich muss ein weiters Editfeld für die Telefonnummer hinzufügen.
Delphi-Quellcode:
TRec = record
        name:string;
        nachname:string;
        alter: 1..110;
        Tel: String; //hinzugefuegt
       end;
Ich würde aber gerne eine Möglichkeit haben den Recordtypen dynamisch zu durchlaufen und für jedes Element ein Editfeld zur Laufzeit zu erzeugen, ähnlich wie man beim Array von low to high gehen kann.
Tu es oft - Bald bist du zu alt.
  Mit Zitat antworten Zitat
Tpercon

Registriert seit: 7. Jun 2002
638 Beiträge
 
Delphi 5 Professional
 
#6

Re: Records dynamisch durchlaufen

  Alt 25. Sep 2003, 10:39
Ich versuchs nochmal:
Delphi-Quellcode:
  TFeld = record
    Text,
    inhalt: string;
  end;

  TRec = record
    gruppe: string;
    feld: array of TFeld;
  end;

MyRec: array of TRec;
Jetzt kannst du jedes MyRec Element einen Gruppennamen verpassen und die ganzen Feldbezeichnungen der Gruppe legst du unter dem dyn. Array feld an. Die Bezeichnung unter Text und den Inhalt unter inhalt.
Bsp. für MyRec[0]:
gruppe -> Gruppexy
feld[0].Text -> name
feld[0].inhalt -> 'meinnachname'
feld[1].Text -> vorname
feld[1].inhalt -> 'meinname'
feld[2].Text -> alter
feld[2].inhalt -> '20'
  Mit Zitat antworten Zitat
Benutzerbild von Tonic1024
Tonic1024

Registriert seit: 10. Sep 2003
Ort: Cuxhaven
559 Beiträge
 
RAD-Studio 2009 Ent
 
#7

Re: Records dynamisch durchlaufen

  Alt 25. Sep 2003, 10:55
Moin...

@Tpercon: Normal würde ich dir Recht geben, aber er wollte ja den Record dynamisch durchlaufen und nicht ein Array mit Records... [Haarspalterei ON]


Ist das dann nicht auch der falsche weg mit den records? Ich wüde assoziative arrays vorschlagen... irgentwo gabs da was zum free-download für delphi.

Dann hättest du die Möglichkeit den feldern namen zu geben und es würden Funktionen wie high() und Length() ziehen...

Zu dem Code von Tpercon: Aber wo steckt darin die dynamik im Sinne von Mickmack's Problem? Dann muss er doch immernoch den Record "von Hand" ändern, oder doch, oder wie?!? - [beinahe_völlig_verwirrt_nu]

Bis denne...
Der frühe Vogel fängt den Wurm, richtig.
Aber wird nicht auch der frühe Wurm vom Vogel gefressen?
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#8

Re: Records dynamisch durchlaufen

  Alt 25. Sep 2003, 13:53
Hallo Tonic1024,
ich denke so wie Du das vor hast geht das nicht.
Ich wüßte nicht das Records mit RTTI Info's abgelet werden.
Nachfahren vom TComponent haben jedoch RTTI Info's.
Anstatt eines Record's habe ich in dem Beispiel einen TComponent Nachfahren verwendet. Die Properties, die dynamisch editieren möchte
müssen published sein. Wenn Du im Quelltext TMyObject eine String-Property hinzufügst wird auch ein passendes TEdit erzeugt und über dieses TEdit kannst Du die Eigenschaft auch setzen.

Es handelt sich um ein rudimentäres Beispiel (gerade getippt)
Angehängte Dateien
Dateityp: zip dynedt.zip (180,6 KB, 18x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Tonic1024
Tonic1024

Registriert seit: 10. Sep 2003
Ort: Cuxhaven
559 Beiträge
 
RAD-Studio 2009 Ent
 
#9

Re: Records dynamisch durchlaufen

  Alt 26. Sep 2003, 08:01
Moin...

Erstmal muss ich sagen, dass ich mir bestimmt nicht soviel Gedanken gemacht habe wie Jens... Ist schon ein beachtliches Stück Code... - für mal eben getippt...

Ist vielleicht auch ein wenig unhandlich... Aber ich glaube wir schweifen ab... Nur um das Thema noch mal zu vervollständigen und damit ein weiterer Suchender auch eine Antwort bekommt...

Das war es was ich gemeint hatte.

Delphi-Quellcode:
TRec = record
        name:Array of string;
        nachname:Array of string;
        alter:Array of integer;
       end;

implementation

procedure TForm1.Button1Click(Sender: TObject);
var Daten: TRec;
begin
  setlength(Daten.name,length(Daten.name)+1);
  setlength(Daten.nachname,length(Daten.nachname)+1);
  setlength(Daten.alter,length(Daten.alter)+1);

  Daten.name[0]:='Mick';
  Daten.nachname[0]:='Mack';
  Daten.alter[0]:=23;

  Label1.Caption:=Daten.name[0];
  Label2.Caption:=Daten.nachname[0];
  Label3.Caption:=inttostr(Daten.alter[0]);
end;
Basierte aber darauf, dass ich Frage falsch interpretiert hatte... Das was MichMack wirklich will ist ja mit einem assoziativen Array viel besser gelöst.

Hier im Forum suchenassoziatives array
Hash wäre noch so ein stichwort nach dem man suchen könnte...

Bis denne...
Der frühe Vogel fängt den Wurm, richtig.
Aber wird nicht auch der frühe Wurm vom Vogel gefressen?
  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 18:07 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