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 Elements

    Also 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, Auslesen

    Folgendes würde für alle Werte gelten:
    Dateiname, Sektionsname und Dialog-Pointer

    Die 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 Struktur

    Das 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
    -Typ

    Offset 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;
        //...
    
    } ExternStruct
    

    Fü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;
        //...
    
    } ExternStruct
    

    Fü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 Struktur

    Das 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
    -Typ

    Offset 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.


Anmelden zum Antworten