Autor Beitrag
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8475
Erhaltene Danke: 447

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Di 24.03.20 15:43 
Ich bin neulich auf ein Problem aufmerksam geworden, dass meine bisherige Methode zur Ermittlung eines geeigneten Ortes für die Abspeicherung von Programm-Einstellungen und Daten nicht immer sinnvoll ist. :?

Bisher teste ich, ob das Programm im "Programme"-Ordner liegt (meist also "C:\Program Files (x86)\..."). Falls ja, dann kommen die Daten ins User-Verzeichnis. Falls nein, gehe ich vom User-Wunsch "portabel" aus und schreibe ins Programmverzeichnis.

Jetzt scheint es bei einigen Windows-Geräten bei der Installation auch etwas zu geben wie "Interner Speicher" und "SD-Karte", wie ich es bisher nur vom Smartphone her kenne. Wenn man dann die SD-Karte nimmt, und das Programm in den dort vorgesehenen "Programme"-Ordner installiert, funktioniert mein Ansatz nicht mehr. Das Programm entscheidet sich dann für "portabel", hat dort aber keine Schreibrechte.

Auf Schreibrechte möchte ich auch nicht prüfen, da dann ein starten von CD unter Umständen fremde Rechner zumüllt. Dort hätte ich dann gerne "Read-Only-Settings".

Daher versuche ich das nun über eine Zusatz-Datei "UseLocalSettings.config" zu lösen (macht z.B. Notepad++ auch so).
  • Wenn diese Datei vorhanden ist: Lokale Installation
  • Wenn diese Datei nicht vorhanden ist: Daten ins Userverzeichnis

Diese Datei würde ich beim Download der Zip-Variante mitliefern (download, entpacken, starten), und in der Setup.exe (Installation per Inno-Setup) optional erstellen lassen, falls der User nicht das Standard-Verzeichnis ("C:\Program Files (x86)\...") als Ziel angibt und sich dann explizit für "portabel" entscheidet.

Frage zur Diskussion: Ist das so sinnvoll, oder gibt es da andere Fallstricke, die ich jetzt noch übersehe?

_________________
We are, we were and will not be.
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1220
Erhaltene Danke: 107

Win7
DXE2 Prof, Lazarus
BeitragVerfasst: Di 24.03.20 17:04 
Hallo,

ich mache das ein bisschen anders. Ich speichere nichts bis der Nutzer einmal in die Einstellungen geht und dort auswählt ob im Nutzerverzeichnis oder portabel im Programmverzeichnis gespeichert werden soll.
Beim Start des Programmes sehe ich einfach erst beim Nutzer nach und dann im Programmverzeichnis. Was als erstes gefunden wird, verwende ich dann wieder.
Ändert der Nutzer auf portabel, verschiebe ich die Einstellungen ins Programmverzeichnis.

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Jetzt rächt sich die Natur und tötet uns.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18867
Erhaltene Danke: 1660

W10 x64 (Chrome, Edge)
Delphi 10.4 Ent, Oxygene, C# (VS 2019), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 24.03.20 17:06 
Ich habe dazu mal einen Beitrag in der Library veröffentlicht. Das würde ich was den Quelltext angeht heute sicher etwas schöner umsetzen, aber das Prinzip würde ich auch heute noch so machen.
entwickler-ecke.de/viewtopic.php?p=541637
Gausi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8475
Erhaltene Danke: 447

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Di 24.03.20 17:22 
user profile iconSinspin hat folgendes geschrieben Zum zitierten Posting springen:
Ich speichere nichts bis der Nutzer einmal in die Einstellungen geht und dort auswählt ob im Nutzerverzeichnis oder portabel im Programmverzeichnis gespeichert werden soll.

Das fällt bei mir raus, da ich auch ohne Änderungen an den Einstellungen schon Daten speichern will/muss. Ich könnte zwar beim ersten Programmstart das in einem "Wizard" abfragen. Aber der sollte nur kommen, wenn Einstellungen (wo auch immer) gespeichert werden können, damit der nicht bei jedem Start angezeigt wird - und dann bin ich wieder bei der Frage, wo ich das Speichern probieren soll ...

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Ich habe dazu mal einen Beitrag in der Library veröffentlicht.
Den habe ich gesehen, und auch die ConfigUtils dazu. Allerdings ist dort das Vorgehen ja so (wenn ich das richtig verstehe), dass gesucht wird, wo die Einstellungen bereits liegen, und diese dann weiterverwendet werden. Wenn aber noch gar keine vorhanden sind, bin ich ja wieder bei der Ausgangs-Frage. Ich könnte dann höchstens beim Installer eine initiale Settings-Datei am gewünschten Ort erstellen (oder im Zip-Archiv mitliefern) - aber das unterscheidet sich dann ja nicht prinzipiell von meinem Vorgehen. Oder habe ich da noch einen Denkfehler, bzw. habe ich was übersehen?

_________________
We are, we were and will not be.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18867
Erhaltene Danke: 1660

W10 x64 (Chrome, Edge)
Delphi 10.4 Ent, Oxygene, C# (VS 2019), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 24.03.20 19:05 
Ich zeige dann genau solch einen Wizard an und frage den Benutzer wo die Einstellungen liegen sollen. Dadurch, dass ich die Plätze dann in der festgelegten Reihenfolge durchsuche, brauche ich keine Markierungsdatei oder so, sondern entweder sind Einstellungen an einem der Orte da oder ich zeige den Wizard an.
Gausi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8475
Erhaltene Danke: 447

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Do 26.03.20 20:03 
Ich fasse mal zusammen:

Eure beiden Vorschläge zielen darauf ab, die Entscheidung durch den User im Programm selbst vornehmen zu lassen. Bei meinem Ansatz würde diese Entscheidung in den Installationsprozess verschoben. Die Frage zur Bewertung lautet nun: Wo achtet der normale User mehr drauf, bzw. was klickt er eher weg?

Vorteil auf der einen Seite: Nach der Installation ist die Einrichtung in diesem Sinne erledigt. Nachteil dabei: Es wird eine Marker-Datei benötigt.

Ein K.O.-Kriterium sehe ich bei beiden Ansätzen bisher nicht. Ich glaube, ich schlaf noch mal ein paar Nächte drüber. :gaehn:

_________________
We are, we were and will not be.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18867
Erhaltene Danke: 1660

W10 x64 (Chrome, Edge)
Delphi 10.4 Ent, Oxygene, C# (VS 2019), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 27.03.20 10:11 
user profile iconGausi hat folgendes geschrieben Zum zitierten Posting springen:
Bei meinem Ansatz würde diese Entscheidung in den Installationsprozess verschoben. Die Frage zur Bewertung lautet nun: Wo achtet der normale User mehr drauf, bzw. was klickt er eher weg?
Du kannst danach ja auch beim Installationsprozess fragen.
Ich zeige den Einrichtungswizard direkt nach dem Setup an, aber genauso kann man ja das Einstellungstemplate als optionale Komponente im Setup haben und ggf. ablegen.

user profile iconGausi hat folgendes geschrieben Zum zitierten Posting springen:
Nachteil dabei: Es wird eine Marker-Datei benötigt.
Nein, es reicht doch die Einstellungen selbst an der gewünschten Stelle zu initialisieren. Das ist dann gleichzeitig die "Markierung".
Gausi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8475
Erhaltene Danke: 447

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Fr 27.03.20 15:19 
Nochmal danke für die Anregungen. :zustimm:

Ich werde aber wohl doch den Weg über die Marker-Datei nehmen. Ein Grund ist, da ich die Daten im Programmverzeichnis bevorzugen müsste - es gibt nämlich User, die mehrere Kopien des Programms auf einem Rechner nutzen. Klingt komisch, kann man aber durchaus so machen. D.h. der Default-Modus wäre dann "Daten ins Programmverzeichnis", was irgendwie so ... "Windows 95" wäre.

Klar, kann man alles auch anders lösen.

Aber da ich auch nicht nur eine Konfig-Datei habe, sondere noch weitere Daten-Dateien nutze, erscheint es mir etwas sinnvoller, die Steuerung über eine separate Datei zu machen, deren (Nicht-)Existenz gezielt angibt, wo die Daten liegen sollen.

_________________
We are, we were and will not be.