AGB  ·  Datenschutz  ·  Impressum  







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

Anzahl der Felder in einem Record

Ein Thema von Carsten1234 · begonnen am 19. Jan 2009 · letzter Beitrag vom 21. Jan 2009
Antwort Antwort
Seite 2 von 3     12 3      
Carsten1234

Registriert seit: 9. Apr 2008
Ort: Vechelde
178 Beiträge
 
Delphi 8 Professional
 
#11

Re: Anzahl der Felder in einem Record

  Alt 19. Jan 2009, 11:52
Zitat von himitsu:
Welche Delphiversion nutzt du denn?
D2007
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#12

Re: Anzahl der Felder in einem Record

  Alt 19. Jan 2009, 12:05
Properties im Varianten Teil sind leider auch nicht möglich, aber sowas wäre da schon möglich:

- intern alle nötigen Felder jedes Types erstellen
- und nach Außen, dann jeweils pasend zu den Einzelrecords, die Properties auf diese Felder verteilen
- hier könnte man auch Setter-/Gettermethoden verwenden, um z.B. noch einen Identifierer su beschreiben, welcher angibt, welche Version (welche Property-Gruppe) verwendet wurde
Delphi-Quellcode:
Type
  MyRecord = Record
  Private
    iFeld1: Integer;
    iFeld2: String;
    iFeld3: String;
    iFeld4_1: String;
    iFeld4_2: Integer;
  Public
    Property Rec1_Feld1: Integer Read iFeld1 Write iFeld1;
    Property Rec1_Feld2: String Read iFeld2 Write iFeld2;
    Property Rec1_Feld3: String Read iFeld3 Write iFeld3;

    Property Rec2_Feld1: Integer Read iFeld1 Write iFeld1;
    Property Rec2_Feld2: String Read iFeld2 Write iFeld2;
    Property Rec2_Feld3: String Read iFeld3 Write iFeld3;
    Property Rec2_Feld4: String Read iFeld4_1 Write iFeld4_1;

    Property Rec3_Feld1: Integer Read iFeld1 Write iFeld1;
    Property Rec3_Feld2: String Read iFeld2 Write iFeld2;
    Property Rec3_Feld3: Integer Read iFeld4_2 Write iFeld4_2;
  End;
Delphi-Quellcode:
Type
  MyRecord = Record
  Private
    iType: Integer; // oder 'nen SET
    iFeld1: Integer;
    iFeld2: String;
    iFeld3: String;
    iFeld4_1: String;
    iFeld4_2: Integer;
  Public
    Property Rec1_Feld1: Integer Read iFeld1 Write SetRec1Feld1;
    Property Rec1_Feld2: String Read iFeld2 Write SetRec1Feld2;
beim Speichern dann entweder über iType die Speichermethode wählen, alles speichern oder alles abweichend von einem Defaultwert speichern.
$2B or not $2B
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#13

Re: Anzahl der Felder in einem Record

  Alt 19. Jan 2009, 20:50
Was spricht eigentlich gegen RTTI? Zumindest Recordgröße und Position von Strings (und anderen finalisierungsbedürftigen Typen) ist abrufbar.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.144 Beiträge
 
Delphi 10.3 Rio
 
#14

Re: Anzahl der Felder in einem Record

  Alt 20. Jan 2009, 14:58
Warum so kompliziert!


Delphi-Quellcode:
var
  MyRec : byte;
begin
  ...
  MyRec := 1; // oder 2 3

  Blockwrite(Datei,MyRec,1);

  Case MyRec of
    1 : Blockwrite(Datei,Rec1,sizeof(Rec1));
    2 : Blockwrite(Datei,Rec2,sizeof(Rec2));
    3 : Blockwrite(Datei,Rec3,sizeof(Rec3));
  end; // of case

  ...
end;
Und umgekehrt einlesen! Fertig!

Mavarik
  Mit Zitat antworten Zitat
Carsten1234

Registriert seit: 9. Apr 2008
Ort: Vechelde
178 Beiträge
 
Delphi 8 Professional
 
#15

Re: Anzahl der Felder in einem Record

  Alt 21. Jan 2009, 08:57
Zitat von Mavarik:
Warum so kompliziert!
Weil die Einzelwerte (Felder) der unterschiedlichen Records als CSV-Datei weggeschrieben werden sollen.
Ich könnte ja jetzt (umständlicher Weg) für jedes Record eine eigene Speicherroutine schreiben, ich hätte hingegen aber (einfacher Weg[?]) eine Speicherroutine, die zunächst (auch im rekursiven Aufruf) die Feldtypen der Records (und Unterrecords) ermittelt, daraus Strings bastelt und diese Strings dann speichern.

Viel "lustiger" wird es ja bei diesem Konstrukt:
Delphi-Quellcode:
  TKontaktartenEingang = packed record
    Kontaktart: word;
    case Word of
      EINGANG_KONTAKT_SCHLIESSER,
      EINGANG_KONTAKT_OEFFNER : (
                                        Dummy: byte;
                                        Ansprechzeit_Digital: word;
                                      );
      EINGANG_KONTAKT_ANALOG_0_10V,
      EINGANG_KONTAKT_ANALOG_0_20MA,
      EINGANG_KONTAKT_ANALOG_4_20MA : (
                                        KonfigID : word;
                                        Ansprechzeit_Analog : word;
                                        Sensorausfall : boolean;
                                        MinValue : word;
                                        MaxValue : word;
                                        Schwellwert1 : word;
                                        Schwellwert2 : word;
                                        Invert : boolean;
                                      );
  end;

  TEingang = packed record
    Kennung : string;
    Kontaktart: TKontaktartenEingang;
  end;
Was ja - zumindest schon im Ansatz - klappt, ist das hier.
Allerdings fehlt mir nach wie vor eine Routine oder ggf. eine Schleife ala ForEach in PHP zum zählen, die mir die Anzahl der Recordfelder zurück gibt und bei Unterrecords meckert leider der Compiler "Inkompatible Typen: Variant und {Unterrecord}".

Gruß, Carsten
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.144 Beiträge
 
Delphi 10.3 Rio
 
#16

Re: Anzahl der Felder in einem Record

  Alt 21. Jan 2009, 10:14
Zitat von Carsten1234:
Weil die Einzelwerte (Felder) der unterschiedlichen Records als CSV-Datei weggeschrieben werden sollen.
Gruß, Carsten
Hää CSV Dateien sind doch so aufgebaut, wenn ich mich nicht irre, das pro Zeile immer alle Felder enthalten seien müssen.

Waraum dann so Heckmeck mit Varianten Records und vielen verschiedenen Typen?

Grüsse Mavarik
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#17

Re: Anzahl der Felder in einem Record

  Alt 21. Jan 2009, 11:11
Delphi-Quellcode:
// statt
Kontaktart: word;
case Word of

// geht auch (ist eventuell auch besser zu erkennen, wofür "Kontaktart" genutzt wird)
case Kontaktart: Word of
Zitat von Apollonius:
Was spricht eigentlich gegen RTTI? Zumindest Recordgröße und Position von Strings (und anderen finalisierungsbedürftigen Typen) ist abrufbar.
klar, wenn er der Speicher-/Ladeprozedur jeweil die RTTI-Infos mit übergibt, dann kann er daraus auswählen ... aber ohne dn exta RTTI-Parameter kann die Prozedur nicht erkennen, welchen RecordTyp man z.B. per offenen Var/Const-Parameter übergibt.

@Carsten1234: vielleicht wäre es an dieser Stelle dann doch nicht schlecht, wenn du statt Records Klassen verwendest?

Zitat:
Viel "lustiger" wird es ja bei diesem Konstrukt:
wieso?
da kannst doch ganz leicht, beim Speichern, über Kontaktart auswählen welche Teil gespeichert werden muß ... und beim Laden dann andersrum
$2B or not $2B
  Mit Zitat antworten Zitat
Carsten1234

Registriert seit: 9. Apr 2008
Ort: Vechelde
178 Beiträge
 
Delphi 8 Professional
 
#18

Re: Anzahl der Felder in einem Record

  Alt 21. Jan 2009, 11:51
Zitat von himitsu:
Delphi-Quellcode:
// geht auch (ist eventuell auch besser zu erkennen, wofür "Kontaktart" genutzt wird)
case Kontaktart: Word of
"Stümmt", kannte ich so in der (Schreib-) Form noch nicht. Danke.

Zitat von himitsu:
@Apollonius: vielleicht wäre es an dieser Stelle dann doch nicht schlecht, wenn du statt Records Klassen verwendest?
Ähem, Du meintest sicher mich!?

Gruß, Carsten
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#19

Re: Anzahl der Felder in einem Record

  Alt 21. Jan 2009, 11:55
ups ... stimmt, mein natürlich dich (da hat sich wohl ein copy&paste verlaufen )
$2B or not $2B
  Mit Zitat antworten Zitat
Carsten1234

Registriert seit: 9. Apr 2008
Ort: Vechelde
178 Beiträge
 
Delphi 8 Professional
 
#20

Re: Anzahl der Felder in einem Record

  Alt 21. Jan 2009, 12:22
Zitat von Mavarik:
Hää CSV Dateien sind doch so aufgebaut, wenn ich mich nicht irre, das pro Zeile immer alle Felder enthalten seien müssen.
Waraum dann so Heckmeck mit Varianten Records und vielen verschiedenen Typen?
Das Gerät, von dem CSV-Dateien gelesen bzw. wieder hingeschrieben, ist entfernbar. Trotzdem soll die Möglichkeit bestehen, dass ich nenne es mal Setup als ganzes Paket auch auf Festplatte speichern zu können.
Stelle Dir (abstraktes Bsp.) ein intelligentes Auto vor. Dieses Auto schließt Du an Deinen PC an und kannst dessen Setup auslesen als da wären Farbe, Reifen (Typ, Größe), Motor. Das Auto ist ferner so intelligent, dass Du ihm auch ein geändertes Setup zukommen lassen kannst.
Nun könnte sich der Reifentyp je nach Jahreszeit ändern. Das könnte dann so aussehen:
Delphi-Quellcode:
  TReifentyp = packed record
    case Jahreszeit: byte of
      Sommerzeit: (
                    Breite_Sommer : word;
                    Querschnitt_Sommer : word;
                    Felgengroesse_Sommer: word;
                    Index_Sommer : word;
                    Hersteller_Sommer : string;
                  );
      Winterzeit: (
                    Breite_Winter : word;
                    Querschnitt_Winter : word;
                    Felgengroesse_Winter: word;
                    Index_Winter : word;
                    Hersteller_Winter : string;
                  );
  end;

  TMotortypen = packed record
    case Motortyp: byte of
      Benziner: (
                  KW_Benziner : word;
                  Hubraum_Benziner: word;
                )
      Diesel: (
                  KW_Diesel : word;
                  Hubraum_Diesel: word;
                )
     
  end;

  TAuto = packed record
    Farbe : string;
    Reifen : TReifenTyp;
    Motor : TMotortypen;
    Kennzeichen: string;
    Land : string;
    Bemerkungen: array[1..1024] of char;
  end;
Das Auto stellt Dir die Infos als CSV-Datei zur Verfügung, diese Infos sollen jedoch auch als ganzes "Paket" auf HDD gespeichert werden können. Ferner kannst Du dem Auto aber auch über einem sog. Teilsetup (in CVS-Form) sagen, dass es nun keine Sommereifen mehr hat, sondern Winterreifen. Es muss also nicht das komplette Record "TAuto" geschickt werden, es reicht das Record "Reifen" zu schicken.
Wieder bezogen auf mein Problem wäre es nun ganz schön, wenn es zur Konvertierung Record => CVS und Speicherung des Teilsetups nur eine Routine geben würde, der einfach nur das entsprechende (Teil-)Record übergeben wird.
Jetzt kann man natürlich die Zusatzfrage stellen, warum man nicht vor dem Speichern auf HDD erst nochmal das aktuelle Komplettsetup ausliest. Nun, im Record "TAuto" gibt es weitere Zusatzinfos, die das Auto nicht kennt wie sein Kennzeichen, das Land, in dem es zugelassen ist und Bemerkungen zum Auto ("Heckklappe rostet" oder so). Diese Informationen braucht das Auto auch nicht, sie sollen aber zur Verfügung stehen, wenn das Setup von HDD ins Programm geladen wird.
Nun etwas klarer?

Gruß, Carsten
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 23:15 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 by Thomas Breitkreuz