Entwickler-Ecke
Dateizugriff - Ini Datei mit Namen aus Edit-Feld im Unterordner erstellen
Mipi - Sa 22.11.08 21:59
Titel: Ini Datei mit Namen aus Edit-Feld im Unterordner erstellen
Hallo zusammen.
Zuerst einmal:
Ich sitze nun schon 20 Minuten daran, diesen Beitrag zu schreiben. Grund: Während ich ihn schreib, probiere ich immer wieder in Delphi etwas aus. Eigentlich sollte der Beitrag über etwas anderes handeln, allerdings habe ich es doch hinbekommen nach 15 Minuten :D
Nachteil, ich muss den kompletten Beitrag überarbeiten :(
Aber zum Glück stehe ich vor einem weiteren Problem, wodurch sich dieser FireFoxTab doch lohnt :)
Ich beschreib am besten erstmal, was der kleine Teil des Programms machen soll:
Ich habe mehrere Edit-Felder deren Werte ich gerne in eine Ini Datei abspeichern möchte. Ein Edit-Feld beschäftigt sich mit dem Namen der zu erstellenden Ini Datei. Das heißt, ich kann mir den Namen frei aussuchen.
Delphi-Quelltext
1:
| ini := TIniFile.Create(EditSchiffsname.text+'.ini'); |
Nur erstellt er die Ini Datei jetzt ja in C:\Windows
Ich möchte die Dateien aber gerne in einem Unterordner sehen.
Wenn das Programm selber also beispielsweise in folgendem Verzeichnis:
C:\Test
liegt, sollen die Ini Dateien in diesem Verzeichnis erstellt werden:
C:\Test\Schiffe
Ich erwarte nicht von dem Programm, dass es den Unterordner selber erstellt (MkDir wäre hier wahrscheinlich das passende Mittel). Der Unterordner ist einfach schon gegeben.
Nun habe ich aber auch gelesen, dass es zu Problem führen kann, wenn ich den Pfad nicht komplett angebe im Code. Als Möglichkeit konnte ich
Delphi-Quelltext
1:
| (ExtractFilePath(ParamStr(0))) |
herausfinden (hab es hier im Forum gelesen).
Nur wie sieht jetzt die Zeile komplett aus, wenn ich die Ini Datei in dem Unterordner erstellen möchte?
Ich habe hier mehrere Varianten, die nur noch "zusammengefügt" werden müssten:
Delphi-Quelltext
1:
| ini := TIniFile.Create(EditSchiffsname.text+'.ini') |
Delphi-Quelltext
1:
| ini := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'Schiff.ini') |
Ein weiterer Schubser in Richtung Lösung wäre nett :)
Gruß,
Mipi
Xentar - Sa 22.11.08 22:27
Delphi-Quelltext
1:
| ini := TIniFile.Create(ExtractFilePath(ParamStr(0)) + '\Test\' + edtSchiffsname.Text + '.ini'); |
?
Blackheart666 - Sa 22.11.08 22:41
Xentar hat folgendes geschrieben : |
Delphi-Quelltext 1:
| ini := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'Test' + edtSchiffsname.Text + '.ini'); |
? |
ini := TIniFile.Create(ExtractFilePath(ParamStr(0)) + '\Schiffe\' + edtSchiffsname.Text + '.ini'); :wink:
Mipi - So 23.11.08 08:49
Manchmal sieht man den Wald vor lauter Bäumen nicht =D
Vielen Dank, ich werde es in ein paar Stunden (wenn ich ausgeschlafen bin) mal ausprobieren :)
Aber spätestens beim Datenbank-Part werde ich euch wahrscheinlich erneut fragen :D
Also, danke nochmal :)
Mipi - So 23.11.08 18:11
Entschuldigung, wenn ich schon wieder störe.
Aber ich erhalte eine Fehlermeldung wenn ich diese Zeile einfüge:
---------------------------
Debugger Exception Notification
---------------------------
Project projekt.exe raised exception class EIniFileException with message 'Unable to write to C:\Dokumente und Einstellungen\Denis\Desktop\X-Wars\Schiffe\Schiffsname.ini'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------
Also habe ich mal die Ordnereigenschaften überprüft, der Ordner war auf "schreibgeschützt". Ich wollte dann also das Häkchen wegnehmen, doch direkt danach war er wieder schreibgeschützt. Also bin ich in den übergeordneten Ordner gewechselt und habe diesem gesagt, er solle doch bitte nicht schreibgeschützt sein (ich hab zwar nicht verstanden, warum er schreibgeschützt war, aber naja). Dann kam auch die Meldung (nicht 1:1, aber das stand in etwa drin):
"Möchten sie die Einstellungen für alle Unterordner/Dateien übernehmen?"
Habe ich mit ja bestätigt. Nach einem Überprüfen stellte ich aber fest, dass der komplette Ordner immer noch schreibgeschützt ist.
Sehe ich zum ersten Mal sowas, bin ganz normal mit dem Adminaccount (das einzige Konto auf dem Rechner) angemeldet. Ich benutze XP HomeEdition.
Gruß,
Mipi
Nachtrag:
Die Meldung kommt aber nur, wenn ich:
Delphi-Quelltext
1:
| ini := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'Schiffe\' + editSchiffsname.Text + '.ini'); |
anstelle von:
Delphi-Quelltext
1:
| ini := TIniFile.Create(ExtractFilePath(ParamStr(0)) + editSchiffsname.Text + '.ini'); |
benutze.
Xentar - So 23.11.08 19:22
Aber den Unterorder Schiffe gibt es, und ist auch richtig geschrieben?
Mipi - So 23.11.08 19:24
Ja, es gibt im Ordner "Tool" (da sind alle Projektdateien drin) den Unterordner "Schiffe".
Xentar - So 23.11.08 19:25
Nochmal:
Gibt es genau DIESEN Ordner?
C:\Dokumente und Einstellungen\Denis\Desktop\X-Wars\Schiffe\
Da steht nix von "Tool".
Delete - So 23.11.08 19:29
Außerdem gehören irgendwelche Daten nicht ins Programmverzeichnis bzw. Unterverzeichnisse davon. Spätestens ab Vista fällt einem das dann auf die Füße.
Mipi - So 23.11.08 19:32
Oh je, das tut schon mehr als weh :(
Danke für den Wink mit dem Zaunpfahl Xentar :-/
Aber das Programm soll ja die Daten der verschiedenen Modelle wieder aus den ini Daten auslesen. Dachte da wäre ein Unterordner am besten.
JayEff - So 23.11.08 20:01
DeddyH hat folgendes geschrieben : |
Außerdem gehören irgendwelche Daten nicht ins Programmverzeichnis bzw. Unterverzeichnisse davon. Spätestens ab Vista fällt einem das dann auf die Füße. |
Ja dazu gibt's einen thread von mir...:
http://www.delphi-forum.de/viewtopic.php?t=69508 auf Seite 2 gibt's meine Lösung für dieses Problem, nur der Vollständigkeit halber. Dabei geht's darum, zu erkennen, ob ein Anwendungsdaten-Ordner von der Plattform gewünscht wird, oder nicht. Grundsätzlich kann unter Vista kein Programm ohne adminrechte auf C:\Program Files\ schreiben.
Delete - So 23.11.08 21:08
Die Lösung für das Problem heißt: sich an die vorgegebenen Konventionen halten ;). Daten sollten also unter den Anwendungsdaten des Users bzw. aller User (sofern notwendig) abgelegt werden. Diese Verzeichnisse kann man mit SHGetFolderPath, SHGetSpecialFolderLocation und noch ein paar anderen Funktionen ermitteln.
JayEff - So 23.11.08 21:17
DeddyH hat folgendes geschrieben : |
Die Lösung für das Problem heißt: sich an die vorgegebenen Konventionen halten ;). Daten sollten also unter den Anwendungsdaten des Users bzw. aller User (sofern notwendig) abgelegt werden. Diese Verzeichnisse kann man mit SHGetFolderPath, SHGetSpecialFolderLocation und noch ein paar anderen Funktionen ermitteln. |
Yup, und wie das in etwa geht, steht im von mir verlinkten Thread sowie einigen Links die in diesem Thread gepostet wurden :zustimm:
Delete - So 23.11.08 21:19
Das hab ich komplett überlesen :oops:. Aber wir sind uns ja im Kern einig :zustimm:
Mipi - So 23.11.08 21:56
Ja, das habe ich auch schon gelesen.
Nur ich dachte, es wäre praktischer, das trotzdem dort abzulegen :(
Nun gut, dann werde ich den MightyButton eben noch erweitern :)
Den neuen Ordner muss ich dann ja denke ich mit "MkDir" erstellen.
Das heißt, jedesmal wenn man dann eine neue ini erstellt, wird versucht den Ordner neu zu erstellen.
Aber es gibt sicherlich etwas in der Richtung (bitte nicht verraten, möchte es selber suchen, macht mehr Spaß :) ) :
Delphi-Quelltext
1:
| Falls Ordner/Pfad so-und-so nicht existiert, erstell ihn doch bitte :) |
Also einfach mit einer einfachen If-Formulierung und den passenden Befehlen.
Im Moment habe ich nur keine Lust die Delphi-Hilfe zu öffnen, da ich grade vom Schneeschippen komme (und die zu schippende Fläche war nicht gerade klein) :)
Also vielen Dank schonmal
Gruß,
Mipi
JayEff - So 23.11.08 22:04
Mipi hat folgendes geschrieben : |
Ja, das habe ich auch schon gelesen. |
Ach wirklich? In den letzten paar Posts steht die Funktion "DirectoryExists" sowie "CreateDirectory" ... ;)
edit:
Mipi hat folgendes geschrieben : |
Aber es gibt sicherlich etwas in der Richtung (bitte nicht verraten, möchte es selber suchen, macht mehr Spaß :) ) |
:oops:
Mipi - Mo 24.11.08 20:47
Der Link ist bei mir schonmal angeklickt gewesen.
Ich habe mir natürlich nicht alles 1:1 gemerkt, auch deshalb, weil ich zu der Zeit andere Sachen auf die Spur kommen wollte :)
Gruß,
Mipi
Mipi - Fr 05.12.08 13:55
Hi, ich bins wieder :)
Nach kurzer Pause habe ich wieder bisschen Zeit, um ein wenig weiterzukommen :)
Ich stehe jetzt vor folgendem Problem (wahrscheinlich ist es kein Problem, sondern nur auf meine Müdigkeit zurückzuführen).
Asugangssituation:
Ich habe meine Combobox soweit, dass sie mit den Ini Dateien im Unterordner "Schiffe" gefüllt ist.
Sollte ich zwischendurch eine Ini Datei hinzufügen, so wird auch diese direkt mit in die Liste übernommen.
Wie es am Ende sein soll:
Wenn der Benutzer nun einen Schiffstyp aus der Liste der ini Dateien auswählt, so sollen verschiedene Parameter dieses Schiffes in verschiedenen EditFeldern, Labels etc. angezeigt werden (indem die Ini Datei einfach ausgelesen wird).
Mein Weg:
Da ich eigentlich zum ersten mal eine Combobox verwende, weis ich nicht wirklich welche Befehle es alles gibt. Habe mich durch die Delphi-Hilfe gewühlt, aber nicht das gefunden, was ich gerne haben möchte (wahrscheinlich einfach nur überlesen. In dem Fall bitte in die richtige Richtung schieben :) ).
Ich wollte so vorgehen, dass der Name der aktuell ausgewählten ini Datei in eine Variable reinkopiert wird, sodass ich dann einfach mit dem Lesen dieser ini Datei anfangen kann und dadurch dann die ganzen Felder füllen kann. Wie man Ini Datei auslesen kann, ist mir bewusst. Ich scheitere im Moment nur daran, an den Namen der aktuell ausgewählten Ini Datei zu gelangen. Da gibt es doch bestimmt was ganz was einfaches, was ich nur nicht kenne :)
Mir schebt da sowas wie:
Delphi-Quelltext
1:
| name := Combobox.SelectedItem |
Ich habe, während ich den Beitrag geschrieben habe, zwischendurch immer wieder in Delphi rumgesucht und folgendes gefunden:
Delphi-Quelltext
1:
| property SelText: string; |
Laut Beschreibung gibt dies ja den Text des derzeit ausgewählten Items wieder.
Nur steht auch dabei, dass meine Combobox den Wert von focus auf true gesetzt haben muss.
Da ich diese Einstellung nicht im Object Inspector gefunden habe, wollte ich es einfach in den Code integrieren:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TFormSchiffsbestellung.CBSchiffstypenSelect(Sender: TObject); var name:string; begin CBSchiffstypen.Focused := true; name := CBSchiffstypen.SelText; LabelName.Caption := name;
end; |
Nun bekomme ich dabei allerdings in der Zeile, in der ich Focused auf true setze die Fehlermeldung:
"Left side cannot be assigned to"
Die Hilfe hilft mir hier nicht wirklich weiter:
"This error message is given when you try to modify a read-only object like a constant, a constant parameter, or the return value of function."
Kann man die Eigenschaft "focused" einer ComboBox nicht auf diese Weise ändern?
Blackheart666 - Fr 05.12.08 14:13
Delphi-Quelltext
1: 2: 3: 4:
| procedure TForm1.ComboBox1Change(Sender: TObject); begin LabelName.Caption := ComboBox1.Items[ComboBox1.ItemIndex]; end; |
jaenicke - Fr 05.12.08 14:54
Um zu den Pfaden nochmal was zu sagen:
Ich habe in diesem Beitrag in der Library das Thema erörtert, in der zweiten Hälfte (ab "Dann gibt es da noch ein weiteres Problem:") habe ich dort den Zugriff auf das Anwendungsdatenverzeichnis beschrieben, und dort gehören die Dateien hin. Denn wie bereits gesagt wurde, wird es normalerweise so sein, dass du in das Verzeichnis deiner Anwendung nicht schreiben kannst, wenn diese unter C:\Programme liegt.
(Auf einem schlecht konfigurierten System in der Standardeinstellung geht das unter XP, aber wer sich auskennt, bei dem gehts nicht. Und unter Vista gar nicht mehr.)
http://www.delphi-library.de/viewtopic.php?t=82952
Mipi - Fr 05.12.08 16:28
Ok, extra für dich ( :P ) wurschtel ich mich grade durch deinen Beitrag und versuche das alles zu verstehen :D
Ich habe es zur Hälfte auch schon drin, zur Zeit kämpfe ich noch damit, dass die Ini Datei auch in den (von dir so genannten) AppDataProjectDir mit dem Namen des Editfeldes geschrieben wird.
Im Moment heißt die Datei noch "editSchiffsname.Text.ini", da hab ich wohl noch ein + an der falschen Stelle :D
Delete - Fr 05.12.08 16:31
Zitat: |
da hab ich wohl noch ein + an der falschen Stelle |
Oder 2 ' ;)
Mipi - Fr 05.12.08 16:53
So, nun speichert das Programm alle Ini Dateien in einem neuen Ordner in den Anwendungsdaten.
Der Rest (die Ini Dateien wieder finden und in die Combobox einlisten) funktioniert auch wieder :)
Dürfte nun auch dich zufriedenstellen jaenicke :P (aber wahrscheinlich nur in Sachen Speicherpfad :D )
Ich bedanke mich für die schnelle Hilfe, ich werde mich später dann nochmal melden (und vlt. irgendwann mal das kleine Programm reinstellen :) ).
Also, danke nochmal,
Gruß
Mipi :)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!