AGB  ·  Datenschutz  ·  Impressum  







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

Records auswerten

Ein Thema von c-bob · begonnen am 11. Jun 2009 · letzter Beitrag vom 12. Jun 2009
Antwort Antwort
c-bob

Registriert seit: 11. Jun 2009
12 Beiträge
 
#1

Records auswerten

  Alt 11. Jun 2009, 10:19
Hallo DP-Community!

Ist mein erster Beitrag hier und ausserdem bin ich noch bzw. wieder in den Kinderschuhen der Programmierung unter Delphi/Pascal angelangt.

Mein erstes kleines Problem ist:
Ich habe eine ini/config-Datei mit mehreren sections und indents. Diese möchte ich beim Start des Programmes komplett auslesen und in einem Record eines Objects zur weiteren Verwendung ablegen, die Daten sind ja schließlich relevant.

Um den Aufwand beim auslesen gering zu halten bzw. beim Überprüfen, ob alle Werte vollständig sind und später ggf. auch einfach erweiterbar zu machen, habe ich mir nun ein array of string mit den verschiedenen Bezeichnungen, wie sie auch in der ini-Datei vorkommen, angelegt. Dieses könnte ich dann zentral verwalten bzw. eben erweitern.

Nun habe ich aber ein Problem, wenn ich das Record mit den einzelnen Werten befüllen will.
Ich dachte da an eine for id in idlist Schleife. Dabei habe ich aber leider keine Idee, wie ich dann mit Hilfe von id das Record anspreche. XYRecord.id geht ja nicht.
Gibt es da eine Möglichkeit, welche mir nicht bekannt ist, oder ist der Programmieransatz einfach schlecht gewählt?
Als Ausweg habe ich mir anstelle eines Records ein Array überlegt, welches dann über die Indexe anzuprechen ist, allerdings eben nicht mehr so schön im restlichen Programm zu verwenden ist.

Vielen Dank und danke für die Geduld beim Durchlesen
Grüße
-C-

Ach PS: Ich verwende Lazarus/FreePascal. Ist augenscheinlich sehr ähnlich dem letzten Delphi, was ich benutzt hatte - Delphi5 - was es noch an Neuerungen gegenüber Delphi5 zu bieten hat, kann ich leider noch nicht überblicken.
  Mit Zitat antworten Zitat
Apollonius

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

Re: Records auswerten

  Alt 11. Jun 2009, 10:25
Mit Records funktioniert das nicht, da die Feld-Namen nicht mehr im Kompilat auftauchen. Wenn du auf Klassen umsteigen würdest, könnte man das Problem mit Hilfe der RTTI lösen.
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 himitsu
himitsu

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

Re: Records auswerten

  Alt 11. Jun 2009, 10:33
Oder du mußt im Array die Position im Record und notfalls den Typ des Eintrags mit speichern.

bei der Record-Serialisierung in meinem Hier im Forum suchenhimXML kann man sich z.B. eine "Liste" erstellen, wo der Aufbau des Records drinsteht ... so daß die Serialisierungsfunktion weiß was wo im Record steht.
Probem ist da, man muß die Definition und den Aufbau des Records selber aktuell halten und von Hand abgleichen.

Denn die RTTI kennt bei Records nur Typ und Position der initialisierungspflichtigen Elemente, aber nicht deren Namen.
$2B or not $2B
  Mit Zitat antworten Zitat
11. Jun 2009, 10:57
Dieses Thema wurde von "MrSpock" von "Programmieren allgemein" nach "FreePascal / Lazarus IDE" verschoben.
Es geht um Freepascal.
c-bob

Registriert seit: 11. Jun 2009
12 Beiträge
 
#5

Re: Records auswerten

  Alt 11. Jun 2009, 15:02
Zitat von Apollonius:
Mit Records funktioniert das nicht, da die Feld-Namen nicht mehr im Kompilat auftauchen. Wenn du auf Klassen umsteigen würdest, könnte man das Problem mit Hilfe der RTTI lösen.
Wie würde das denn ungefähr aussehen? Momentan wollte ich folgende Struktur nutzen:

Delphi-Quellcode:
type TDBconf=record
     host:string;
     user:string;
     password:string;
     db:string;
     ident:string;
end;

type
 { TInisettings }
 TInisettings = class(TObject)
 private
 public
   LConfig:TDBconf;
   constructor Create;
   destructor Destroy; override;
 end;

constructor TInisettings.Create;
var Inicontrol:TInicontrol;
    i:int;
    idlist : array[0..4] of string = ('host', 'user', 'password', 'db', 'ident');
    id, sec : string;

begin
     Inicontrol:=TInicontrol.Create;
    try
            sec:='local';
            for id in idlist do
            begin
                 Inicontrol.getId(sec,id,LConfig."id"); <-- die beiden Zeilen funktionieren nicht,
                 ShowMessage(LConfig."id"); <-- weiss ich. ging ums Prinzip... (php ist doch schön ;-)
            end;
     finally
           Inicontrol.Free;
     //      ShowMessage(LConfig.host);
     end;
end;
Wie wäre dann der Ansatz mittels Objecten? Einfach anstelle des records den Typ auf Object setzen und constructor/destructor hinzufügen und einfach weitermachen?

Und nochwas, warum bin ich nun im Lazarus-Forum? Ist doch eher ne allgemeine und Systemunabhängige Frage gewesen?!

Gruß
-C-
  Mit Zitat antworten Zitat
Apollonius

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

Re: Records auswerten

  Alt 11. Jun 2009, 15:10
Bei Klassen werden im Kompilat einfach mehr Informationen gespeichert. Wenn du auf Klassen umsteigst, kannst du deine Felder um entsprechende Eigenschaften ergänzen, die als published deklariert werden sollten. Mit den Routinen aus der Unit TypInfo kannst du dann recht einfach die Eigenschaften mit ihren Namen als String ansprechen. Dein Array idlist brauchst du damit auch nicht mehr, weil du auch eine Liste aller Eigenschaften bekommen kannst; das ist dann einfacher zu pflegen.
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
Cyf

Registriert seit: 30. Mai 2008
407 Beiträge
 
Lazarus
 
#7

Re: Records auswerten

  Alt 11. Jun 2009, 15:13
Ohne Objekt und dem Rumspielen mit der RTTI wäre wahrscheinlich am einfachsten einen zusätzlichen Enum-Typen einzuführen und dann entweder diesen als Index für ein Array zu verwenden oder beim Einlesen in einen Rekord mit case of auszuwählen. Allerdings muss auch diese Lösung von Hand um neue Einträge erweitert werden.
Man kann einen Barbier definieren als einen, der alle diejenigen rasiert, und nur diejenigen, die sich nicht selbst rasieren.
Rasiert sich der Barbier?
  Mit Zitat antworten Zitat
c-bob

Registriert seit: 11. Jun 2009
12 Beiträge
 
#8

Re: Records auswerten

  Alt 11. Jun 2009, 16:32
Oookay,

ich denke, ich werde die Idee von Apollonius aufgreifen. Das Mehr an Resourcen durch das Object spielt bei dem Programm sowieso keine Rolle.

Sagt mal, eine andere, vielleicht zu allgemeine Frage: könnt ihr Seiten oder Literatur empfehlen, welche sich eher mit der Programmierung und der Herangehensweise beschäftigen und nicht so sehr Programmiersprachen-spezifisch sind?
Sicherlich spielt die Sprache schon eine Rolle, wenn es um die Realisierbarkeit bestimmter Problem auf bestimmten Wegen geht. Mir gehts aber eben um die Strukturierung und Konzeption eines Programms.
Bin kein gelernter bzw. studierter Programmierer/Informatiker und im NAchrichtentechnik-Studium ging die Programmierung über einfaches C bzw. rudimentäres C++ mit dem wohl allseits beliebten Beispiel für OOP "Kraftfahrzeug - Räder - Motor" leider nicht hinaus, daher die Frage.

Danke und Gruß
-C-
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#9

Re: Records auswerten

  Alt 11. Jun 2009, 23:17
Zitat von c-bob:
könnt ihr Seiten oder Literatur empfehlen, welche sich eher mit der Programmierung und der Herangehensweise beschäftigen und nicht so sehr Programmiersprachen-spezifisch sind?
http://openbook.galileocomputing.de/oo/index.htm
fork me on Github
  Mit Zitat antworten Zitat
quendolineDD

Registriert seit: 19. Apr 2007
Ort: Dresden
781 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Records auswerten

  Alt 12. Jun 2009, 00:12
Zitat:
idlist : array[0..4] of string = ('host', 'user', 'password', 'db', 'ident');
In Delphi gibt es etwas namens Enum, welches du hier verwenden kannst. Das sieht dann ca. so aus
TIdListItems = (ilHost, ilUser, ilPassword, ilDb, ilIdent); Und dann deiner Klasse ein set of TIdListItems hinzufügen.
Nur zur Anregung.
Und um dein .getId, da solltest du dir halt eine eigene Funktion herum kapseln und schon funktioniert das auch so wie du es willst
Lars S.
Wer nicht mit der Zeit geht, geht mit der Zeit.
  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 23:01 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