![]() |
Textimport und export
Guten Tag alle zusammen,
ich hoffe mich absoluten Neuling kann hier einer mal am Arm packen und in die richtige Richtung werfen *gg* Ich habe mir mit dem Programm "Inno Setup" eine *.exe erstellt welche auch tadellos funktioniert, nur noch nicht ganz fertig ist und genau der Punkt der noch offen ist ist für mich der Schwerste^^ Meine *.exe installiert ein paar Anwendungen welche nicht der Rede wert sind (keine Treibe, DLL´s, Registrierungseinträge o.ä.). Es sind einfach nur ein paar Dateien welche in ein vom Benutzer wählbares Instalationsverzeichnis kopiert werden, zwei Dateien die nach "localappdata" kopiert werden und eine Datei die in ein zusätzlich vom Benutzer gewähltest Verzeichnis kopiert wird. Mir geht es nun um eine *.conf Datei welche mit jedem Editor bearbeitbar ist, denn in diese müssen die vom Benutzer gewählten Pfadangaben nach dem kopieren der Datei an bestimmte Positionen eingetragen werden. Natürlich habe ich schonmal versucht etwas selbst hin zu kriege mit FileToString als AnsiString und StringToFile, jedoch hapert es da bei mir bissl an der Erfahrung und dem Verständnis. Nun hoffe ich das mir jemand bei meinem Vorhaben helfen kann, sollten noch Fragen jeglicher Art vorhanden sein so stürzt euch auf mich. MfG Benny Zur Veranschaulichung mal meinen bisherigen Code:
Delphi-Quellcode:
var
UserDirPage : TInputDirWizardPage; UserFolder : string; function InitializeSetup: boolean; begin UserFolder := ''; Result := true; end; function InstallCae(Param:String):String; begin result := UserDirPage.Values[0] ; end; procedure InitializeWizard; begin UserDirPage := CreateInputDirPage(wpSelectDir, ExpandConstant('{cm:CAEVerzeichnis}'), ExpandConstant('{cm:SpeicherortPRTDEF}'), ExpandConstant('{cm:SpeicherzielPRTDEF}'), false, 'Neuer Ordner'); //"Klicken sie weiter..." Meldung UserDirPage.Add(SetupMessage(msgSelectDirBrowseLabel)); //Standardpfad in der Verzeichnisauswahl UserDirPage.Values[0] := ExpandConstant( 'C:\CAE2000\'); end; procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); //Code für deinstallation begin if CurUninstallStep=usPostUninstall then FileCopy('{code:InstallCae}\Backup\PRTDEF.GER','{code:InstallCae}\PRTDEF.GER',false); DelTree('{code:InstallCae}\Backup\*', true, true, true); end; |
AW: Textimport und export
Ich weiß jetzt nicht ganz genau, ob ich dich richtig verstanden habe, wenn du diese config-Datei im Editor bearbeiten lassen magst, könntest du von Delphi aus einfach den Editor folgendermaßen aufrufen:
Delphi-Quellcode:
ShellExecute(0, NIL, PCHAR('"NOTEPAD.EXE"'), PCHAR('"' + DATEINAME + '"'), NIL, SW_SHOWDEFAULT);
|
AW: Textimport und export
Nee nee nee, sorry da hab ich mich etwas undeutlich ausgedrückt.
Das mit dem Editor habe ich nur erwähnt das ihr wisst um was es sich handelt, also das es keine HEX Werte oder sonstiges sind, sondern reiner Klartext der in der Datei vorhanden ist. Ich möchte nun durch z.B. StringToFile erreichen das diese Pfadangaben automatisch in die *.conf Datei eingetragen werden, sodass kein Benutzer darin arbeiten muss (denn ich kenne meine Pappenheimer und weiß das viele es nicht schaffen werden, egal wie gut man es erklärt *gg*) |
AW: Textimport und export
OK, dann rate ich zu einer TStringList, so in der Art:
Delphi-Quellcode:
EDIT: Wenn vorher schon was drin steht kannst zuvor ein aList.LoadFromFile machen.
procedure Fillconf;
var aList : TStringList; begin aList := TStringList.Create; aList.Add('Textzeile'); aList.Add('noch eine Zeile'); aList.SaveToFile('c:\temp\test.conf'); aList.Free; end; |
AW: Textimport und export
Soweit ich weiß fügt diese Methode die Daten immer ans Ende der Datei mit ein oder?
Natürlich habe ich vergessen zu erwähnen das es bestimmte Positionen sind an denen die Pfadangaben eingetragen werden müssen. Im genauen wären es: Installationsverzeichnis der Anwendung: Zeile 299, Cursorposition 23 und Zeile 357, Cursorposition 10 Zusätzlich gewähltes Verzeichnis über function "InstallCae": Zeile 356, Cursorposition 10 Das wären die Stellen an denen es eingetragen werden muss. |
AW: Textimport und export
Wie gesagt mit LoadFromFile bekommst die gesamte conf-Datei erstmal in die Stringliste rein. Die StringList beginnt immer mit 0. Also aList[0] wäre dann die erste Zeile. Mithilfe der copy-Funktion kannst du dann diesen String ändern, ungefähr so:
Delphi-Quellcode:
(Hinweis: Code ungetestet)
aList[298] := copy(aList[298],1,23)+'einzufügender Text'+copy(aList[298],24,length(aList[298]));
|
AW: Textimport und export
![]() |
AW: Textimport und export
Ahh okay sorry das wusste ich noch nicht das dies so zusammen gehört, mein Fehler.
|
AW: Textimport und export
Hmmm ich habe nun einmal folgenden Code eingebaut
Delphi-Quellcode:
Jedoch finde ich nach dem durchführen der *.exe keinen Eintrag "Hallo" bzw. es ändert sich nichts.
procedure AfterInstallConf();
var aList : TStringList; begin aList.LoadFromFile('C:\Users\BWolonkieiwicz\AppData\Local\DOSBox\dosbox-SVN_MB6.conf'); aList := TStringList.Create; aList[361] := copy(aList[361],1,1)+'Hallo'+copy(aList[361],24,length(aList[361])); aList.SaveToFile('C:\Users\BWolonkieiwicz\AppData\Local\DOSBox\dosbox-SVN_MB6.conf'); aList.Free; end; |
AW: Textimport und export
Ein LoadFromFile kann erst funktionieren, wenn die TStringListe zuvor erzeugt(Create) wurde.
|
AW: Textimport und export
Du kannst die Liste ja nicht laden, wenn Du sie im Anschluss erst erzeugst. Außerdem solltest Du vor einem indizierten Zugriff auf eine Zeile sicherstellen, dass auch entsprechend viele Zeilen vorhanden sind.
|
AW: Textimport und export
Mir ist hier noch was aufgefallen:
Delphi-Quellcode:
Fehlt hier irgendwie ein begin end hinter dem if oder ist die Einrückung nur Mist? :-Dprocedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); //Code für deinstallation begin if CurUninstallStep=usPostUninstall then FileCopy('{code:InstallCae}\Backup\PRTDEF.GER','{code:InstallCae}\PRTDEF.GER',false); DelTree('{code:InstallCae}\Backup\*', true, true, true); end; |
AW: Textimport und export
Zitat:
Deine Voraussetzung, die CONF-Datei mit einem beliebigen Editor bearbeiten zu wollen und gleichzeitig eine Adressierung nach Zeile und Position in der Zeile ist zumindestens gefährlich, da viele Editoren Leerzeichen durch Tabulatoren ersetzen und Du damit einen Unterschied zwischen der Angezeigten und der "zeichengezählten" Position erhälst. Gruß K-H |
AW: Textimport und export
Wär das mit einer INI nicht leichter ?
Evtl. einfach in die erste Zeile der *.conf irgendwas mit [eckigen Klammern] einfügen und dann die Einträge setzen a la: ![]() |
AW: Textimport und export
Zitat:
Zitat:
|
AW: Textimport und export
So also an sich sage ich nun einmal das wir den Begriff "Editor" hieraus verbannen^^
Kein Editor hat etwas mit der Installation oder sonstigem zu tun, nur der Code soll auf die *.conf Datei zugreifen welcher nach der Installation eingreifen soll. Ich habe mir den Code nun einmal so abgeändert das er erst am Ende des Setups´s ausgeführt wird und zum testen wollte ich nun einmal einfach nur eine Zeile einfügen (egal wo), jedoch macht er nicht einmal das. Liegt es nun daran das er die Datei nicht öffnen kann oder nicht in ihr schreiben kann?
Delphi-Quellcode:
procedure AfterInstallConf(CurStep: TSetupStep);
var DOSBoxConf : TStringList; begin if CurStep=ssPostInstall then DOSBoxConf := TStringList.Create; DOSBoxConf.LoadFromFile('C:\Users\BWolonkieiwicz\AppData\Local\DOSBox\dosbox-SVN_MB6.conf'); DOSBoxConf.Add('Hallo'); DOSBoxConf.SaveToFile('C:\Users\BWolonkieiwicz\AppData\Local\DOSBox\dosbox-SVN_MB6.conf'); DOSBoxConf.Free; end; Edit: Die Pfadangabe "C:\Users\BWolonkieiwicz\AppData\Local" wird später auch durch "{localappdata}" getauscht, nur zum Testen bleibt nun erstmal der komplette Pfad drin. |
AW: Textimport und export
Das ist wieder das mit der Einrückung und dem fehlenden begin/end, eine Einrückung alleine reicht da nicht.
Delphi-Quellcode:
procedure AfterInstallConf(CurStep: TSetupStep);
var DOSBoxConf : TStringList; begin if CurStep=ssPostInstall then begin DOSBoxConf := TStringList.Create; DOSBoxConf.LoadFromFile('C:\Users\BWolonkieiwicz\AppData\Local\DOSBox\dosbox-SVN_MB6.conf'); DOSBoxConf.Add('Hallo'); DOSBoxConf.SaveToFile('C:\Users\BWolonkieiwicz\AppData\Local\DOSBox\dosbox-SVN_MB6.conf'); DOSBoxConf.Free; end; end; |
AW: Textimport und export
Wird diese conf nur von Deinem Programm benutzt, oder ist sie für Inno oder andere Programme relevant? Falls nur Du sie benötigst, solltest Du Dir den gennanten Vorschlag, TIniFile zu benutzen, einmal durch den Kopf gehen lassen.
|
AW: Textimport und export
Bevor es weiter geht erst einmal einen riesen Dank an euch, endlich komme ich mal weiter hier^^
Nun wieder ans eingemachte: Ich schaffe es nun mit der richtigen Syntax (begin und end) die Datei zu beschreiben und das auch an den richtigen Positionen, nur leider kriege ich dort nur einen statischen Text rein und nicht meine Pfadangabe. Ich habe es mit folgendem Versucht:
Delphi-Quellcode:
Jedoch schreibt er mir dann auch nur "{code:InstallCae}" als Text in meine Datei und nicht z.B. "D:\CAE2000\"
procedure CurStepChanged(CurStep: TSetupStep);
var DOSBoxConf : TStringList; begin if CurStep=ssPostInstall then begin; DOSBoxConf := TStringList.Create; DOSBoxConf.LoadFromFile('{localappdata}\DOSBox\dosbox-SVN_MB6.conf'); DOSBoxConf[355] := copy(DOSBoxConf[355],1,9)+'{code:InstallCae}'+copy(DOSBoxConf[355],24,length(DOSBoxConf[355])); DOSBoxConf.SaveToFile('{localappdata}\DOSBox\dosbox-SVN_MB6.conf'); DOSBoxConf.Free; end; end; zudem kommt er auch nicht mit der Variable "{localappdata}" zurecht, solltet ihr da vielleicht einen Tipp haben?^^ Wenn nicht dann muss ich wohl zusätzlich einen Code einbauen in dem das Verzeichnis ermittelt wird oder? |
AW: Textimport und export
Zitat:
|
AW: Textimport und export
juhuuu das freut mich ja........nicht *gg*
Und das nur weil man immer nach dem DAU ausgeht (Dümmster anzunehmender User)^^ Na dann werde ich mich mal umschauen nach ner Syntax fürs auslesen des Verzeichnisses oder hat einer gerade was parat? |
AW: Textimport und export
Also ich kenn das Inno nicht aber wenn ich so deinen Code lese, müsste nicht ExpandConstant('{cm:CAEVerzeichnis}') das richtige machen?
|
AW: Textimport und export
Zitat:
Zu deiner Info "{cm:CAEVerzeichnis}" ist in dem Fall falsch, denn cm steht für CustomMessage und das ist nur der Text der im Setup auf einer jeweiligen Seite angezeigt wird, aber folgendes ist nun das richtig eErgebnis:
Delphi-Quellcode:
So trägt er alle so ein wie es sein soll.
procedure CurStepChanged(CurStep: TSetupStep);
var DOSBoxConf : TStringList; begin if CurStep=ssPostInstall then begin; DOSBoxConf := TStringList.Create; DOSBoxConf.LoadFromFile('C:\Users\BWolonkieiwicz\AppData\Local\DOSBox\dosbox-SVN_MB6.conf'); DOSBoxConf[298] := copy(DOSBoxConf[298],1,22)+(ExpandConstant('{app}\PrintOut\SELECT.PCL'))+copy(DOSBoxConf[298],24,length(DOSBoxConf[298])); DOSBoxConf[355] := copy(DOSBoxConf[355],1,9)+(ExpandConstant('{code:InstallCae}\'))+copy(DOSBoxConf[355],24,length(DOSBoxConf[355])); DOSBoxConf[356] := copy(DOSBoxConf[356],1,9)+(ExpandConstant('{app}\'))+copy(DOSBoxConf[356],24,length(DOSBoxConf[356])); DOSBoxConf.SaveToFile('C:\Users\BWolonkieiwicz\AppData\Local\DOSBox\dosbox-SVN_MB6.conf'); DOSBoxConf.Free; end; end; Nur hat sich jetzt ein neues Problem gezeigt welches auf Basis des Betriebssystems geht, je nach Sprache etc. Mein Programm welches ich installiere schaut auf der Festplatte nach wie ein Ordner heißt, in diesem Fall "C:\Programme\...." jedoch schreibt mir der Code nun in meine *.conf Datei durch die Anweisung "{app}" (welche ja das Installationsverzeichnis ist) folgendes: "C:\Program Files\....." Irgendwie muss ich es nun hinkriegen das Inno Setup bzw. der Code zwangsweise Programme schreibt. hat da einer nen Tipp für mich oder ist es nun so weit einen Code zu schreiben der das Verzeichnis erkennt und dahin hoffentlich Programme nimmt? |
AW: Textimport und export
Soviel ich weiß, ist das im Explorer angezeigte "c:\Programme" nur ein Link auf "c:\Program Files", was heißen soll, dass beides gehen müsste.
|
AW: Textimport und export
Dachte ich auch, aber irgendwie will es trotzdem nicht gehen.
Ich muss mal schauen wie ich im Inno Setup das vielleicht anpassen kann, da kann man allgemein ein wenig arbeiten mit diesen beiden Befehlen:
Delphi-Quellcode:
LanguageDetectionMethod=uilanguage
PrivilegesRequired=none |
AW: Textimport und export
Ich tippe eher auf das Leerzeichen-Problem, ich weiß ja nicht wie deine config-Datei den Pfad rausliest aber evtl. reicht ja ein Setzen von Anführungszeichen drumrum (z.B. "c:\Program Files\test\Dateiname.txt").
|
AW: Textimport und export
Da mein Rechner gerade irgendwie etwas spinnt und ich kaum noch ne Anwendung aufkriege und somit nicht mehr viel testen kann wird sich die Sache etwas nach hinten verschieben^^
In der Zeit werde ich halt schonmal das nächste Realisieren das ich ne CheckBox einfüge und wenn diese =true ist soll noch ne zusätzliche Verzeichnisauswahl aufploppen, somit bin ich noch beschäftigt^^ |
AW: Textimport und export
Da würd' ich aber erstmal den Rechner wieder flott machen, bevor ich weiter programmiere ... Wie willst du programmieren, wenn du, wie du sagt, kaum noch eine Anwendung öffnen kannst?
|
AW: Textimport und export
Ach es geht schon halbwegs^^ Compalieren und die *.exe starten geht noch. Ich kann nur mein installiertes Programm nicht starten aber das ist momentan auch gar nicht so wichtig^^
Aber wo ich gerade mal dabei bin hier zu schreiben, vielleicht könnte ihr mir nen gedanklichen Anstoß geben. Ich habe auf einer WizardPage nun eine zusätzliche Verzeichnisauswahl eingefügt und eine CheckBox, nun will ich beides miteinander Verbinden. Soll heißen: CheckBox aktiviert: 2.Verzeichnisauswahl einblenden, Checkbox nicht aktiviert: 2. Verzeichnisauwahl ausblenden. Die erste Verzeichnisauswahl bleibt unangetastet. Anbei mein momentaner Code dafür:
Delphi-Quellcode:
var
UserDirPageCAE : TInputDirWizardPage; UserFolderCAE, UserFolderGPS : string; GPSVerzeichnisVisible : boolean; DOSBoxConf : TStringList; GPSDirCheckBox: TNewCheckBox; function InitializeSetup: boolean; begin UserFolderCAE := ''; Result := true; end; function InstallCae(Param:String):String; begin Result := UserDirPageCAE.Values[0]; end; function GPSDir(Param:String):String; begin Result := UserDirPageCAE.Values[1]; end; procedure InitializeWizard; begin UserDirPageCAE := CreateInputDirPage(wpSelectDir, ExpandConstant('{cm:CAEVerzeichnis}'), ExpandConstant('{cm:SpeicherortPRTDEF}'), ExpandConstant('{cm:SpeicherzielPRTDEF}'), false, 'Neuer Ordner'); //CAE-Verzeichnisauswahlfenster UserDirPageCAE.Add('CAE2000.EXE Verzeichnis'); //GPS-Verzeichnisauswahlfenster UserDirPageCAE.Add('GPS-Ordner Verzeichnis'); //CAE-Standardpfad in der Verzeichnisauswahl UserDirPageCAE.Values[0] := ExpandConstant( 'C:\CAE2000\'); //GPS-Standardpfad in der Verzeichnisauswahl UserDirPageCAE.Values[1] := ExpandConstant( 'C:\'); GPSDirCheckBox := TNewCheckBox.Create(UserDirPageCAE); with GPSDirCheckBox do //Parameter für die GPS-CheckBox begin GPSDirCheckBox.Parent := UserDirPageCAE.Surface; Caption := ExpandConstant('{cm:GPSVerzeichnis}'); Left := ScaleX(0); Top := ScaleY(120); Width := ScaleX(400); Height := ScaleY(40); Checked := GPSVerzeichnisVisible; Visible := true; end; end; |
AW: Textimport und export
Meine Überlegung jetzt war gerade es so zu realisieren
Delphi-Quellcode:
Jedoch kann ich mit dem ändern von true zu false die Verzeichnisauswahl nur ein oder ausblenden beim ersten starten.
begin
if GPSVerzeichnisVisible=true then begin //GPS-Verzeichnisauswahlfenster UserDirPageCAE.Add('GPS-Ordner Verzeichnis'); //GPS-Standardpfad in der Verzeichnisauswahl UserDirPageCAE.Values[1] := ExpandConstant( 'C:\'); end; end; Jedoch wird das Fenster nicht ein oder ausgeblendet wenn ich im Setup die Checkbox betätige. Hmm wie kann ich das dynamisch machen oder sollte dazu lieber einen extra Post eröffnen? |
AW: Textimport und export
Also wenn deine Konfigurationsdatei die ist, die
![]() ![]() Somit ist dein (entschuldige bitte) "Gehampel" einfach nur zum Schreien. Der Hinweis zum Thema INI-Datei ist hier auch schon gefallen, aber du hast darauf nicht wirklich reagiert. Warum du die conf-Datei nicht angehängt hast, bleibt auch ein Rätsel, denn damit wäre die Diskussion nach 3 Beiträgen durch gewesen :roll: |
AW: Textimport und export
Liste der Anhänge anzeigen (Anzahl: 1)
Naja die Funktion "INI" habe ich mir schon angeschaut, nur ist dort das Problem das die Zuweisung von Key zu String immer mit einem "=" verbunden wird und solange dieses nicht zu entfernen ist kann ich diese Lösung nicht nutzen, zudem habe ich ja auch eine Funktionierende Variante mit der Hilfe hier nun erstellt^^
Aber ich kann auch gerne die *.conf Datei mal eben anhängen. (nicht wundern ich habe sie nur zum Hochladen in eine *.txt abgeändert) |
AW: Textimport und export
Zitat:
Und das "=" in einer ini ist einfach durch Values und Names zu trennen. Edit: bzw. ist ein readstring/writestring |
AW: Textimport und export
Sir Rufo hat Recht, das ist das ganz normale Ini-Format.
Code:
Mit TIniFile würde man das so anlegen können:
[Abschnitt]
Schlüssel=Wert
Delphi-Quellcode:
Und fertig ist der Lack.
IniVariable.WriteString('Abschnitt', 'Schlüssel', 'Wert');
|
AW: Textimport und export
Naja aber wie gesagt mit baumina´s Hilfe läuft es ja jetzt auch und sorry wenn es so rüber kommt als wolle ich fertige Lösungen haben das soll natürlich nicht so sein.
Mit der onClick Sache das werde ich mir mal nun noch anschauen. Ich hatte wirklich gedacht das man die Checked Variable nehmen kann da diese ja ein boolean ist und man somit ne einfache true, false Abfrage starten könnte, aber das dies nicht dynamisch zu sein scheint bleibt nun halt die onClick Sache noch übrig^^ Ps. Ich will hier niemanden irgendwie verärgern oder so, bin nur halt noch im Larvenstadium was Delphi angeht^^ |
AW: Textimport und export
Zitat:
|
AW: Textimport und export
Gut da hast du wohl recht, da wäre eine Suche nach der jeweiligen "Section" sicherer und das gute ist das die *.conf Datei "[]" eh nicht berücksichtigt und dadurch egal ist ob das eingefügt wird oder nicht.
Das werde ich mir dann mal auf die kappe mit schreiben um es denn am Ende zu realisieren wenn ich nun mit meiner WizardPage fertig bin und das mit der onClick abfrage realisiert habe. |
AW: Textimport und export
Zitat:
Code:
und deine CONF sieht so aus
[section]
key=value
Code:
Auszug aus der CONF Datei
[section]
key=value
Code:
Stimmt, die sind total anders und da kann man mit INI wohl nichts machen :wall:
[sdl]
fullscreen=true fulldouble=true fullresolution=original windowresolution=desktop output=surface autolock=true sensitivity=200 waitonerror=true priority=higher,higher mapperfile=mapper-SVN_MB6.map usescancodes=false Falls du dir es anders überlegst, dann schaust du mal in der InnoSetup-Doku nach ![]() |
AW: Textimport und export
Zitat:
Sorry das ich nun etwas abfallender werde, aber wenn du schon mit solchen Kommentaren kommen willst dann lies dir erstmal genau durch was ich überhaupt haben und machen will. ich habe die genauen Positionen genannt an denen ich arbeiten muss und dort sind keine "=" vorhanden und auch nicht zulässig. Also bitte erst informieren und dann klotzen. |
AW: Textimport und export
Die einzigen Zeilen in der geposteten Datei, die kein Schlüssel-Werte-Paar darstellen, sind die Abschnittszeilen und die Kommentare. Welche willst Du denn ändern?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:57 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