Autor Beitrag
Mipi
Hält's aus hier
Beiträge: 14

Win XP
Delphi 2006
BeitragVerfasst: Sa 22.11.08 21:59 
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.

ausblenden 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
ausblenden 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:

ausblenden Delphi-Quelltext
1:
ini := TIniFile.Create(EditSchiffsname.text+'.ini')					


ausblenden Delphi-Quelltext
1:
ini := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'Schiff.ini')					


Ein weiterer Schubser in Richtung Lösung wäre nett :)

Gruß,
Mipi
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Sa 22.11.08 22:27 
ausblenden Delphi-Quelltext
1:
  ini := TIniFile.Create(ExtractFilePath(ParamStr(0)) + '\Test\' + edtSchiffsname.Text + '.ini');					

?

_________________
PROGRAMMER: A device for converting coffee into software.
Blackheart666
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2195

XP
D3Prof, D6Pers.
BeitragVerfasst: Sa 22.11.08 22:41 
user profile iconXentar hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
  ini := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'Test' + edtSchiffsname.Text + '.ini');					

?

ini := TIniFile.Create(ExtractFilePath(ParamStr(0)) + '\Schiffe\' + edtSchiffsname.Text + '.ini'); :wink:

_________________
Blackheart666
Der Irrsinn ist bei Einzelnen etwas Seltenes, - aber bei Gruppen, Parteien, Völkern, Zeiten die Regel. (Friedrich Nietzsche)
Mipi Threadstarter
Hält's aus hier
Beiträge: 14

Win XP
Delphi 2006
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 14

Win XP
Delphi 2006
BeitragVerfasst: 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:
ausblenden Delphi-Quelltext
1:
ini := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'Schiffe\' + editSchiffsname.Text + '.ini');					

anstelle von:
ausblenden Delphi-Quelltext
1:
ini := TIniFile.Create(ExtractFilePath(ParamStr(0)) + editSchiffsname.Text + '.ini');					

benutze.
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: So 23.11.08 19:22 
Aber den Unterorder Schiffe gibt es, und ist auch richtig geschrieben?

_________________
PROGRAMMER: A device for converting coffee into software.
Mipi Threadstarter
Hält's aus hier
Beiträge: 14

Win XP
Delphi 2006
BeitragVerfasst: So 23.11.08 19:24 
Ja, es gibt im Ordner "Tool" (da sind alle Projektdateien drin) den Unterordner "Schiffe".
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: 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".

_________________
PROGRAMMER: A device for converting coffee into software.
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 14

Win XP
Delphi 2006
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: So 23.11.08 20:01 
user profile iconDeddyH hat folgendes geschrieben Zum zitierten Posting springen:
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...: 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.

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: So 23.11.08 21:17 
user profile iconDeddyH hat folgendes geschrieben Zum zitierten Posting springen:
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:

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 23.11.08 21:19 
Das hab ich komplett überlesen :oops:. Aber wir sind uns ja im Kern einig :zustimm:
Mipi Threadstarter
Hält's aus hier
Beiträge: 14

Win XP
Delphi 2006
BeitragVerfasst: 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ß :) ) :

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: So 23.11.08 22:04 
user profile iconMipi hat folgendes geschrieben Zum zitierten Posting springen:
Ja, das habe ich auch schon gelesen.
Ach wirklich? In den letzten paar Posts steht die Funktion "DirectoryExists" sowie "CreateDirectory" ... ;)

edit:
user profile iconMipi hat folgendes geschrieben Zum zitierten Posting springen:

Aber es gibt sicherlich etwas in der Richtung (bitte nicht verraten, möchte es selber suchen, macht mehr Spaß :) )
:oops:

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
Mipi Threadstarter
Hält's aus hier
Beiträge: 14

Win XP
Delphi 2006
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 14

Win XP
Delphi 2006
BeitragVerfasst: 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:

ausblenden Delphi-Quelltext
1:
name := Combobox.SelectedItem					


Ich habe, während ich den Beitrag geschrieben habe, zwischendurch immer wieder in Delphi rumgesucht und folgendes gefunden:

ausblenden 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2195

XP
D3Prof, D6Pers.
BeitragVerfasst: Fr 05.12.08 14:13 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  LabelName.Caption := ComboBox1.Items[ComboBox1.ItemIndex];
end;

_________________
Blackheart666
Der Irrsinn ist bei Einzelnen etwas Seltenes, - aber bei Gruppen, Parteien, Völkern, Zeiten die Regel. (Friedrich Nietzsche)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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.)
www.delphi-library.d...iewtopic.php?t=82952