Universell Daten speichern, möglich?
-
Hallo,
ich habe eine kleine Scruct mit Daten
typedef struct ExternStructTag { int ID; int Active; CString Description; CString Program; CString Parameter; } ExternStruct;Nun habe ich eine Function der ich "parameter" als String übergebe und den Inhalt von .Parameter erhalten möchte.
Geht sowas überhaupt?
Wenn ja, wie kann ich den Typ von Parameter als CString erkennen?vielen Dank
Stefan
Hintergrund
immer wenn ich für ein kleines Tool Daten speichern/laden möchte dauert das umsetzen so ewig...
Stellt Euch einen Dialog vor in dem einigen Controls sind (Edit, Combobox, Checkbox).
Ich speichere Daten immer noch oldschool in ini-Dateien. Das ist zwar nicht soo zeitgemäß, aber einfach und man kann die Daten einfach und schnell ändern und sichern.Ich habe also eine Ini-Datei mit Sektionen und Werten, dann eine Scruct zum zwischenspeichern und ein Dialog zum darstellen und eingeben.
Folgende Informationen benötigt man ja nun
Dateiname, Sektionsname, Wertename, Variable, Membervariable oder ID des ElementsAlso einmal LoadPrivateProfileString und dann m_EditName.SetWindowText
Also tippe/kopiere ich für jede Variable einige Zeilen.
Perfect wären ja vier Funktion der ich jeweils nur eine Liste übergebe
Laden, Speichern, Setzen, AuslesenFolgendes würde für alle Werte gelten:
Dateiname, Sektionsname und Dialog-PointerDie Liste müßte ja "nur" folgendes enthalten
Variablename, ID des Elements
-
Ja klar geht sowas, programmier es doch einfach.

Was natürlich nicht geht ist Variablen per Name "nachzuschlagen", aber für sowas gibts ja netterweise Zeiger und Referenzen. Mal ganz davon abgesehen dass du die Werte auch direkt aus den Controls rauslesen und dir den Umweg über DoDataExchange (oder wie die Funktion heisst) sparen kannst.
-
Lass es mich mal anders formulieren:
Ich habe das Struct mit gemischenten Typen (CString, int, BOOL).
Nun möchte ich mit einer Routine einen Typ davon in eine Datei speichern.
Folgende Vorraussetzungen:
- Diese Routine gekommt nur einen Pointer auf die Struktur übergeben. (Nicht auf den Typ)
- Diese Routine hat keine Kenntnis über den Aufbau dieser StrukturDas wird so nicht gehen (denke ich)
Aber kann ich der Routine eine Liste übergeben die das Problem löst?
Diese Liste enhält:
-Name (zum suchen) oder Index
-Offset
-TypOffset in Liste suchen
CEdit *edit = [Pointer Struktur] + [Offset]
edit.GetWindowText()Das müßte doch gehen
Stefan
-
Ist zwar bei Dialog nicht so einfach denn bei SDI und MDI ist es bereits dabei aber Serialisieren nennt man das.
Da kannst Du alles einfach in eine Datei schreiben und wieder auslesen.
Es bringt aber nichts dir das hier zu erklären denn da muss man sich einarbeiten.
-
Ich würde wahrscheinlich ein Template für die Elemente des structs erstellen und als Templateparameter den Typ und den Typstring übergeben:
typedef struct ExternStructTag { TMember< int,"ID" > ID; TMember< int,"Active" > Active; TMember<CString,"Description"> Description; //... } ExternStructFür das Template noch eine Funktion GetTypeString o.ä. definieren und man hat schon mal ein komfortables Werkzeug. Das ganze ließe sich auch noch mit Funktionen wie Get-/SetValueString erweitern (Stichwort: Spezialisierung von Templates).
-
connan schrieb:
Ich würde wahrscheinlich ein Template für die Elemente des structs erstellen und als Templateparameter den Typ und den Typstring übergeben:
typedef struct ExternStructTag { TMember< int,"ID" > ID; TMember< int,"Active" > Active; TMember<CString,"Description"> Description; //... } ExternStructFür das Template noch eine Funktion GetTypeString o.ä. definieren und man hat schon mal ein komfortables Werkzeug. Das ganze ließe sich auch noch mit Funktionen wie Get-/SetValueString erweitern (Stichwort: Spezialisierung von Templates).
Sieht doch prima aus. Ich werde mich mal daran versuchen
Danke
Stefan
-
StefanKittel schrieb:
Lass es mich mal anders formulieren:
Ich habe das Struct mit gemischenten Typen (CString, int, BOOL).
Nun möchte ich mit einer Routine einen Typ davon in eine Datei speichern.
Folgende Vorraussetzungen:
- Diese Routine gekommt nur einen Pointer auf die Struktur übergeben. (Nicht auf den Typ)
- Diese Routine hat keine Kenntnis über den Aufbau dieser StrukturDas wird so nicht gehen (denke ich)
Aber kann ich der Routine eine Liste übergeben die das Problem löst?
Diese Liste enhält:
-Name (zum suchen) oder Index
-Offset
-TypOffset in Liste suchen
CEdit *edit = [Pointer Struktur] + [Offset]
edit.GetWindowText()Das müßte doch gehen
Stefan
Klar ginge das, bloss würde ich es so nie machen, weil es elegantere Möglichkeiten gibt.