![]() |
in ini speichern
Hallo!
Ich kann in meinem Programm zwischen Deutsch und Englisch wählen. Diese Einstellungen speicher ich dann in eine ini-Datei in meinem Hauptformular. Allerdings bringt er mir jetzt eine Zugriffsverletzung wenn ich die englische Version starte! Könnte es daran liegen, das ich die ini Datei unter Form Create wieder aufrufe, damit er mir auch das zweite Fenster gleich mitübersetzt, dies allerdings nicht gleich mitgestartet wird? Wenn ja, wie kann ich das umgehen? Bitte um schnelle Hilfe! Danke schon mal! Eleonora |
Hallo Eleonora,
könntest Du bitte einen kurzen Code-Ausschnitt posten? Ich denke, dass Dein Problem dann deutlicher und die Lösung offensichtlicher wird. thx. :wink: |
Re: in ini speichern
Zitat:
...:cat:... |
@Sakura: Wie löse ich denn dann dieses Problem?
@Daniel: Im Untermenü Englisch folgender Code:
Code:
Unter FormCreate
ini := TiniFile.Create(C:/...);
path.path_file.Caption := 'File'; //Bringt mir hier den Fehler!!!! with ini do begin writestring('language', 'type', 'english'); end; ini.Free;
Code:
Ist das OK so?
ini := TiniFile.Create(C:/...);
language := readstring('language', 'type', ''); if language = 'german' then language_german.Click else language_english.Click; end; ini.Free; Eleonora |
Zitat:
...:cat:... |
Zitat:
Ich übersetzte die zweite Form unter dem Menüpunkt Englisch in der ersten Form, also im Hauptformular. eleonora |
Zitat:
...:cat::.. |
Ich mache nach jeder Form ein ini.Free; aber er bringt mir trotzdem diese Zugriffsverletzung!
Ich poste mal eine Teil von dem jeweiligen Code! Im Menüpunkt Englisch welches sich im Hauptformular befindet:
Code:
Das gleiche befindet sich auch im Deutschen menü.
procedure language_englishClick(Sender: TObject);
begin ini := TiniFile.Create(C:/...); //Übersetzung des Hauptformulares file_file.Caption := 'File'; file_exit.Caption := 'Exit'; file_language.Caption := 'Language'; language_german.Caption := 'German'; language_english.Caption := 'English'; //Übersetzung des Konfig-Fensters path.path_file.Caption := 'File'; path.path_exit.Caption := 'Exit'; path.path_language.Caption := 'Language'; //Übersetzt das Browser-Fenster engage.engage_delete.Caption := 'Which Browser would you like to delete?'; engage.engage_d.Caption := 'Delete'; with ini do begin writestring('language', 'type', 'english'); end; ini.Free; end; //procedur Anschliessend mache ich diese in FormCreate des Hauptformulares
Code:
Sorry für so viel Code und Danke für die Hilfe!
procedure TFormCreate(Sender: TObject);
begin ini := TiniFile.Create(C:/.....); with ini do begin language := readstring('language', 'type', ''); if language = 'german' then language_german.Click else language_english.Click; end;//with... ini.Free; end; Eleonora |
Ändere mal den Code (zweiter Abschnitt)
Delphi-Quellcode:
...:cat:...
if language = 'german'
then language_germanClick(Self) else language_englishClick(Self); |
Moin Eleonora,
das Problem ist, das zum Zeitpunkt des Aufrufes der Übersetzung erst das Hauptformular existiert. Wenn Du mal in der Projektdatei nachsiehst, siehst Du die Reihenfolge, in der die Formulare erzeugt werden. Das OnCreate wird aufgerufen, nachdem das jeweilige Formular, vollständig erzeugt wurde (also z.B. incl. aller weiterer darin enthaltenen Komponenten. Da Deine Übersetzungsfunktion aber immer alle Formulare anspricht geht der Aufruf beim Zuweisen von Werten an Unterfenster schief, da diese noch gar nicht existieren. Entweder Du packst den Aufruf für die Übersetzung in das OnCreate des letzten Formulares in der Liste (halte ich nicht für so sinnvoll, ein neues Formular und schon muss der Aufruf verschoben werden, oder Du benutzt eine Kennung für welches Formular übersetzt werden soll. Dafür dürfte sich am Besten wohl die Eigenschaft Tag des anzuklickenden Menüpunktes eignen. Dann würden auch nicht bei der Übersetzung eines Formulares, immer gleich alle anderen, wiederholt, mit übersetzt werden. Da das Ganze auch im laufenden Programm erfolgen soll, kannst Du das dann unterscheiden, indem Du den Aufruf über language_germanClick(nil) machst, und den Sender prüfst. Ist der nil, dann werden die Einstellungen vom Programmstart angesprochen, ansonsten hat es jemand angeklickt. Eine weitere Idee (die mir eigentlich besser gefällt) Du erstellst für jedes Formular eine eigene Methode, je Sprache, in der die Text für das jeweilige Formular, eingestellt werden und rufst diese aus dem OnCreate jedes Formulares auf. Bei den Menüpunkten für die Sprache werden dann der Reihe nach nur noch diese jeweiligen Methoden aufgerufen. Dann hast Du auch alle Übersetzungen für jedes Formular direkt in der gleichen Unit, was sich bei Änderungen als günstig erweisen kann. |
@Sakura:
Das mit dem Self hat nicht funktioniert! Könntest Du mir trotzdem erklären was es bedeutet! @Christian: Das mit den Methoden hört sich nicht schlecht an. Ich hab es auch schon mit der Delphi Hilfe probiert, allerdings klappt das nicht so. Das was Du meinst ist doch das mit Open und Close z.B. language_englisch.Open und language_english.Close? Könntest Du mir dabei helfen? In der Zwischenzeit probiere ich es alleine weiter! Danke! Eleonora |
Moin Eleonora,
ich meine das so:
Delphi-Quellcode:
So ist sichergestellt, dass nur dann Teile eines Formulares angefasst werden, wenn dieses vollständig erzeugt wurde.
// Dieses für jedes Formular
type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private //... public //... procedure InitEnglish; procedure InitGerman; end; //... implementation procedure TForm1.InitEnglish; begin // Die englischen Texte eintragen end; procedure TForm1.InitGerman; begin // Die deutschen Texte eintragen end; procedure TForm1.FormCreate(Sender: TObject); begin // Das INI Drumherum gehört noch mit dazu // hab' ich hier mal weggelassen if language = 'german' then begin InitGerman; end else begin InitEnglish; end; end; // Im Menüpunkt Englisch dann (Deutsch analog) procedure language_englishClick(Sender: TObject); begin Form1.InitEnglisch; Form2.InitEnglisch; //... end; Um nicht dauernd die Ini neu öffnen zu müssen, wäre es auch nicht verkehrt die einzustellende Sprache einmal im OnCreate des Hauptformulares in ein private Feld auszulesen, und dann mit einer neuen Eigenschaft des Hauptformulares allen anderen zur Verfügung zu stellen. |
@Christian
Das Problem hätte ich weiterhin. Er bringt mir immer noch Zugriffsverletzung! Vielleicht hab ich mich aber auch nicht richtig ausgedrückt, denn die 2 verschiedenen TForm1.InitEnglish und TForm2.InitEnglish, bringen mich etwas durcheinander! Nur noch mal zum verständniss! Ich übersetzte alle Buttons, Menüs usw., die sich in Form2 befinden unter Form1! Eleonora |
Moin Eleonora,
Zitat:
Meine Idee sieht vor, das jedes Formular sozusagen für seine Übersetzung selbst verantwortlich ist, und somit auch eine eigene Methode dafür hat, die dann im jeweiligen OnCreate bedenkenlos aufgerufen werden kann. Dadurch wird das Formular, als Objekt auch in sich geschlossener. Die Menüpunkte die die Sprachen umstellen werden beim Programmstart überhaupt nicht berücksichtigt. In diesen werden die einzelnen Übersetzungmethoden der einzelnen Formulare eingetragen, um dann bei Bedarf (eben durch Auswahl des Menüpunktes) aufgerufen zu werden. |
Hallo!
Ich habs jetzt verstanden und es funktioniert auch! Super, danke! :dancer2: Danke noch mal für die ausführliche Erklärung und die schnelle Hilfe! Gruss Eleonora |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:44 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz