Auf in Form1 erzeugte Ini in Form4 zugreifen



  • ky_fr34k schrieb:

    aber nicht vergessen, die .h datei einzubinden

    #include <Form2.h>
    

    sonnst geht des net...

    👍 ich dachte schon dass die antwort etwas zu einfach war 😃



  • ROFL sag ich nur!

    Die Standardprozedur is mir nich eingefallen!
    Sorry leute....!

    DANKE DANKE 🙄 🙄 🙄



  • zu früh gefreut....ich kann auf alle Komponenten der Form zugreifen, aber nich auf die Ini!

    Form9->Ini oder ähnlich geht nich (ist bei mir Form 9)!

    Hilfe bitte!

    Danke!



  • hast du mal den kompleten befehl hingeschrieben?
    zB

    Form9->Ini->WriteInteger();
    

    auf die autohilfe musst du soviel ich weiss verzichten



  • Die einzigste Möglichkeit wäre imo die Ini Variable als public zu deklarieren.

    aber wieso erstellste nicht einfach ne andere Variable in der 2ten Form die auch auf dieselbe Ini zugreift?



  • @Big: nee hab ich noch nich, werd ich aber machen!

    @Beliah: ja wenn mir sagst wies geht, mach ich gern
    hab schon probiert, bringt aber fehler! Kann nur jetzt nicht posten weil ich nich daheim bin...=(!

    Kann aber gern mal beispiel geben!

    Die hauptvariable sieht ja so aus: (also wo INI erzeugt wird)

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



  • 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


Anmelden zum Antworten