Auf in Form1 erzeugte Ini in Form4 zugreifen
-
hast du mal den kompleten befehl hingeschrieben?
zBForm9->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
-
Hallo
was hast du probiert
Zeig uns doch ein wenig Details dazu
Dann hilft dir sicher gerne jemandMfG
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....
-
Hallo
einen Rat an dich
Bitte les alle Beitraege nochmal durch
und wenn du dann noch Fragen hats ....MfG
Klaus