Auf in Form1 erzeugte Ini in Form4 zugreifen



  • Dunkelseher schrieb:

    Beispiel: Unit1

    TIniFile *Ini1 = new TIniFile ("c:\\blalalal\\test.ini");
    

    und was müsste ich jetzt in zB Form2(Unit2) schreiben, damit ich auf die Ini zugreifen kann?

    Danke ...

    das kommt drauf an wo du diesen Code stehen hast. Wenn das innerhalb einer Function/Procedure steht kannst du nur innerhalb dieser Funktion darauf zugreifen

    eine Lösung ist z.B. (ungetestet 🙂 ) :

    im Header der Unit1:

    private:
      TIniFile *FIni;
    public:
      __property TIniFile *Ini = { read=FIni, write=FIni };
    

    und in deiner Function:

    Ini = new TIniFile ("c:\\blalalal\\test.ini");
    

    der Zugriff aus Form2 geht dann mit Form1->Ini->...

    natürlich solltest du vor dem Zugriff von Form2 aus erstmal prüfen ob Ini auch erstellt wurde und nicht vergessen, z.B. beim Beenden des Programmes, Ini wieder freizugeben.



  • hm ich weiss nicht ob diese Vorgehensweise besonders sinnvoll ist.

    Ich mach das in meinen Programmen so, dass ich beim Programmstart die Ini-Datei einlese und die Daten in einer Struktur oder Klasse speichere. Beim Programmende schreibe ich (sofern geändert) die Daten zurück in die Ini. Normalerweise gebe ich dem User noch die Möglichkeit zu entscheiden, ob die geänderten Einstellungen gespeichert werden sollen.



  • Joe_M. schrieb:

    hm ich weiss nicht ob diese Vorgehensweise besonders sinnvoll ist.

    Ich mach das in meinen Programmen so, dass ich beim Programmstart die Ini-Datei einlese und die Daten in einer Struktur oder Klasse speichere. .......

    Das mach im Prinziep genau so und bin bisher gut damit gefahren.

    Es kann aber bei dem Einbinden der h-Files Schwierigkeiten geben, wenn z.B. in Form1 die Formen 2 bis n und IniFile generiert werden. In dem Fall erstelle ich in den Formen 2 bis n eine Variable

    public:
    TIniFile* ini;
    

    und schreibe dann in Form1:

    // h-File Form1
    public:
    TIniFile* IniFile;
    
    // cpp-File Form1
    IniFile	= new TIniFile(astrIniFile);
    Form2->ini = IniFile;
    

    Das ist sicher nicht die ganz tolle Lösung aber sie funktioniert und ich kann aus jeder Form auf die Daten und Funktionen des Ini-File zugreifen.

    Viel Erfolg
    Evi48



  • Hallo,

    Ich halte es für wenig sinnvoll das Inifile wärend des gesamten Programmablaufs offen zu lassen. Mal abgesehen davon was passiert wenn das Programm unerwartet abbricht.
    Warum merkt ihr euch nicht einfach den Namen des Inifiles und macht es nur bei Bedarf auf und zu?

    Ciao



  • Braunstein schrieb:

    ... wenig sinnvoll das Inifile wärend des gesamten Programmablaufs offen zu lassen...

    Sag ich doch...

    Braunstein schrieb:

    ... was passiert wenn das Programm unerwartet abbricht.

    Dann sollte man sich den Source noch mal ansehen, da hat sich dann wohl ein (oder mehrere) Fehler eingeschlichen.

    Braunstein schrieb:

    Warum merkt ihr euch nicht einfach den Namen des Inifiles und macht es nur bei Bedarf auf und zu?

    Weil das Einlesen und das Schreiben sinnvollerweise an einer ZENTRALEN Stelle stattfinden sollte.



  • Allgemein:

    Das Einbinden der Header Dateien darfst du natürlich nicht vergessen! 😮 ➡ 🤡



  • Also die Ini erstelle ich hier:

    #include <vcl.h>
    #pragma hdrstop
    
    #include "Query.h"
    #include "DBArray.h"
    #include "pwaendern.h"
    #include "DBKompos.h"
    #include "benutzeranl.h"
    #include "bdaendern.h"
    #include "bauswahl.h"
    #include "prgverw.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    #include <inifiles.hpp>
    TForm4 *Form4;
    
    TIniFile *Ini = new TIniFile ("C:\\programming\\The_Manager\\Testmodule2\\Login\\INI\\startup.ini");
    //---------------------------------------------------------------------------
    __fastcall TForm4::TForm4(TComponent* Owner)
            : TForm(Owner)
    {
    }
    

    und benutzt wird sie weiter unten in der selben .cpp:

    void __fastcall TForm4::FormShow(TObject *Sender)
    {
    static int i = Ini->ReadInteger("Form","Zähler",i);
    {
     Ini->WriteInteger("Form","Zähler",(++i));
    }
    if (i>=100)
     {
      ShowMessage ("");
      Application->Terminate();
     }
    
    String sektion = "User";
    String bezeichnung = "LastUser";
    String wert = Form3->Query1->FieldByName("LName")->AsString;
    Ini->WriteString(sektion,bezeichnung,wert);
    
    delete Ini;
    }
    

    wie gesagt, in der selben form kein prob, aber in anderen!

    Ich bitte um eine einfache (muss nicht die beste und eleganteste sein) Lösung.

    Also danke schonmal!



  • Nun ja, einfach ist relativ. Vom Standpunkt der Wartbarkeit und Fehleranalyse ist mein Vorschlag der Geeignetste.
    Natürlich kannst Du auch den Weg der Public Variable für das Ini-File gehen, das ist auf den ersten Blick einfacher zu realisieren, nur wenn es dann um Änderungen oder Anpassungen geht, wirst Du viel mehr Probleme haben, als Du dir möglicherweise jetzt vorstellen kannst.



  • Naja aber ehrlich gesagt weis ich dich wied du das meinst...kannst mir vielleicht mal ein codebeispiel geben bitte?

    Dunkel...



  • Hi,

    da ich nicht so viele Ini-Dateien verwende, weiss ich gar nicht, ob ich ein passendes Codebeispiel hab'. Ich schau morgen früh auf der Arbeit mal nach...



  • Und schon was gefunden Joe? *ungeduldig wart*

    🙄 😮 😋



  • Sorry, bin heute etwas im Stress und ich hab so speziell nix gefunden...

    Aber so grundsätzlich: In der OnCreate des Mainform die INI-Datei einlesen (in Variablen des Mainforms). In der OnClose oder OnCloseQuery diese Variablen zurückschreiben in die INI-Datei. Die Variablen sollten private sein und über public Eigenschaften (Property) les- und schreibbar gemmacht werden.
    Dann brauchst Du in allen Forms, die Zugriff auf die Variablen aus der INI-Datei haben sollen, nur die Mainform zu 'includieren'.

    Schöner wäre es natürlich, eine eigene Klasse zu entwerfen, die die Variablen aus der INI verwaltet, inkl. Schreib- und Lesemethoden.



  • @Joe
    Ok ich werds mal probieren, aber wenn du nich so viel stress hast würde ich mich freuen wenn du mir da mal was gibst?

    Od schreibst mir per mail...wenn du willst geb ich dir Addy...

    Dunkelseher



  • @Joe
    Also ich bekomms einfach nich hin...

    Vielleicht kannst ja mal nen kleines beispiel so schreiben?

    Wo in Unit1 eine Ini erzeugt wird und auch etwas gefüllt....und in Unit2 ich eben auch was reinschreibe?

    Würd mich echt freuen!

    Wenn Mail willst einfach sagen...

    Dunkelseher


  • Mod

    Hallo

    was hast du probiert
    Zeig uns doch ein wenig Details dazu
    Dann hilft dir sicher gerne jemand

    MfG
    Klaus



  • Ok fang ich mal an (ich werd aber einfachheitshalber nich meine Unitnamen verwenden,sondern nur Uint1,Unit2...)!

    Also hab in Unit 1 eine Ini erstellt

    #include <inifiles.hpp>
    
    TIniFile *Ini = new TIniFile ("c:\\INIS\test.ini");
    

    dann in Unit1 beim OnCreate Ereigniss etwas in die Ini geschrieben!

    static int i = Ini->ReadInteger("test","test",i);
     {
     Ini->WriteInteger("test","test",(++i);
     }
    ...
    

    und jetzt wollte ich auch in Unit2 auf die Ini zugreifen und etwas reinschreiben:

    Unit2.cpp
    #include "Unit1.h"
    ...
    
    Form1->Ini->WriteInteger(.....);
    

    geht nicht...also Form1->Ini, dieser String geht wohl nicht!

    Dann in der Unit1.h

    public:		// Anwender-Deklarationen
            TIniFile *Ini;
               __fastcall TForm11(TComponent* Owner);
    

    Und dann in Unit2.cpp

    Ini->WriteInteger(....);
    

    geht anscheinend auch nicht...

    hm....weiß nich so richtig weiter....


  • Mod

    Hallo

    einen Rat an dich

    Bitte les alle Beitraege nochmal durch
    und wenn du dann noch Fragen hats ....

    MfG
    Klaus



  • Ah @Klaus!

    Hast recht,danke habs gesehen....sorry vielmals!


Anmelden zum Antworten