Autor Beitrag
bennySB
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Mo 13.05.13 20:05 
Guten Tag zusammen,

ich bin ein absoluter Neuling was Delphi oder sonstigen Programmiersprachen angeht und dennoch habe ich es geschafft folgenden Code für eine Setup.exe zu erstellen welcher auch wunderbar funktioniert:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
[Code]
  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:FilesDataLocation}'),
      ExpandConstant('{cm:FilesDataHeader}'),
      ExpandConstant('{cm:FilesDataDescription}'),
      false,
      'Neuer Ordner');

      //"Klicken sie weiter..." Meldung
      UserDirPage.Add(SetupMessage(msgSelectDirBrowseLabel));

      //Standardpfad in der Verzeichnisauswahl
      UserDirPage.Values[0] := ExpandConstant(
      'C:\CAE2000\');
      end;

  end.


Jetzt jedoch zu meinem Vorhaben:

Ich lasse während der Installation eine Konfigurationsdatei (siehe Anhang (Editierbar über jeden Texteditor)) ins localappdata-Verzeichnis kopieren die für das auszuführende Programm benötigt wird (DOSBox) und leider auch in kein anderes Verzeichnis kann.
Nun muss ich es nur irgendwie hinkriegen an drei bestimmten Stellen in der Datei Verzeichnisse einfügen zu lassen.
In folgenden Zeilen muss folgendes geschehen:

Zeile 299:23.Stelle: Installationsverzeichnis der Anwendung einfügen
Zeile 356:10.Stele: Aus oben genannter Funktion, das vom Benutzer eingegebene Verzeichnis einfügen
Zeile 357:10.Stelle: Installationsverzeichnis der Anwendung einfügen


Nun habe ich schon mal ein wenig mit StringToFile etc. herum gespielt aber ohne Hilfe komme ich hierbei nicht weiter und ob dies überhaupt möglich ist.

Ich hoffe ihr könnt mir helfen.


Ps. Im Anhang habe ich zusätzlich noch einmal meinen kompletten Code für die Setup.exe eingefügt.


MfG Benny
Einloggen, um Attachments anzusehen!
MeierZwoo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 94
Erhaltene Danke: 11

Win 7, DOS5
Delphi 2007 Architect, BP7/TP5, LISP, PS
BeitragVerfasst: Mo 13.05.13 20:53 
Man kann das zwar zufuß erledigen, aber wesentlich einfacher ist es, eine Standard-Win-INI zu benutzen (TIniFile), dann kannst Du ohne Aufwand Updaten (incl. einfügen).
bennySB Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Mo 13.05.13 22:16 
Updates oder sonstiges sind nicht notwendig.

Das Programm ist fertig wie es ist und daran wird dann in Zukunft auch nichts mehr geändert werden.

Leider muss ich bei der angehängten Datei bleiben, also genauer gesagt ist es eine *.conf Datei ich habe sie nur als Textdatei angehängt um sie nicht pacaken zu müssen oder sonstiges.

Von daher bin ich auf jede Möglichkeit angewiesen die man nutzen kann um mein Vorhaben durchzusetzen.
MeierZwoo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 94
Erhaltene Danke: 11

Win 7, DOS5
Delphi 2007 Architect, BP7/TP5, LISP, PS
BeitragVerfasst: Mo 13.05.13 22:31 
Zitat: "Nun muss ich es nur irgendwie hinkriegen an drei bestimmten Stellen in der Datei Verzeichnisse einfügen zu lassen."

Das IST ABER upaten!

Einlesen, ändern, ablegen. Am einfachsten in ein StringList einlesen, dann kannst Du am einfachsten suchen - und in der StringList auch gleich die Einfügestellen zwischenschieben (oder zu löschendes löschen oder zu änderndes ändern).
bennySB Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Mo 13.05.13 23:20 
ahh okay, verständigungsprobleme^^

Für mich war der Punkt "Update" jetzt auf nachträgliches installieren von Updates in der Zukunft etc.^^

Dann werde ich mich mal bzgl. der StringList etwas belesen.

Vielleicht hat bis dahin auch jemand das ein oder andere Beispiel parat.
MeierZwoo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 94
Erhaltene Danke: 11

Win 7, DOS5
Delphi 2007 Architect, BP7/TP5, LISP, PS
BeitragVerfasst: Mo 13.05.13 23:39 
Für das Ändern in deiner spez. Datei innerhalb der StringList wird wohl kaum jemand ein anwendbares Beispiel haben. Denn es sind DEINE Bedingungen, die Du absuchen mußt, die Bedingungen deiner *.CONF.

In der StringList kannst Du über den Index auf- und abgehen (Achtung: Der Index geht wie in Dateien und der IT allgemein üblich von 0 bis StringList.count-1).
Und Du kannst nach Einträgen suchen lassen, mit Teilergebnis oder Komplettergebnis (Auf UpCase/LowerCase achten)
...
bennySB Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Di 14.05.13 00:34 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure FileReplaceString(const FileName, searchstring, replacestring: string);
var
  fs: TFileStream;
  S: string;
begin
  fs := TFileStream.Create(FileName, fmOpenread or fmShareDenyNone);
  try
    SetLength(S, fs.Size);
    fs.ReadBuffer(S[1], fs.Size);
  finally
    fs.Free;
  end;
  S  := StringReplace(S, SearchString, replaceString, [rfReplaceAll, rfIgnoreCase]);
  fs := TFileStream.Create(FileName, fmCreate);
  try
    fs.WriteBuffer(S[1], Length(S));
  finally
    fs.Free;
  end;
end;


Diese Vorlage habe ich mal gefunden und wollte mal fragen ob ich die für mein Vorhaben auch nutzen könnte?
MeierZwoo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 94
Erhaltene Danke: 11

Win 7, DOS5
Delphi 2007 Architect, BP7/TP5, LISP, PS
BeitragVerfasst: Di 14.05.13 01:21 
Im Prinzip ja, nur tauscht das nur einen Begriff gegen einen anderen aus.

Hast Du mehrere Änderungen, mußt Du die Procedure auch mehrmals aufrufen und jedesmal wird das ganze File eingelesen und wieder zurückgeschrieben. Allerdings kannst Du auch mehrere Stellen bei einem einlesen ändern, indem Du mehrere Paare Such- und Ersatz-Strings übergibst und mehrmals das replace durchführst.

Bedingung ist dabei allerdings, daß du vorher weißt, was in der Datei steht (der Suchstring). Und das ist selten der Fall. Normal ist in INIs oder CONFIGs, daß die Stelle des betreffenden Suchstrings über eine Bedingung bekannt ist, nicht aber der Inhalt (des Suchstrings).

Z.B;
[DATENPFAD]
C:\Meier\Daten\

oder
DATENPFAD = C:\Meier\Daten\

D.h. man sucht nach den Bedingungen, denn den dort stehenden Begriff kennt man ja nicht (kann auch leer oder garnicht vorhanden sein).

Also im ersten Beispiel die Zeile(n) nach "[DATENPFAD]",
im zweiten Beispiel den Begriff hinter "DATENPFAD =".

In dem Code wird in einen String eingelesen. Den kann man natürlich auch nach den Bedingungen abklappern, nicht zu verändernde Teile ausschneiden, in einen zweiten Zielstring einfügen, zu verändernde Teile auch ausschneiden und geändert/ergänzt in den Zielstring ... das ganze wirkt dann im Prinzip wie ein Schiebepuffer. Das "Problem" bei Schiebepuffern ist nur die Verwaltung des/der Laufzeiger - das erfordert Disziplin.

Es gibt auch Funktionen, die ein TextFile direkt in eine Stringlist einlesen (auf CR,LF achten)[//1], habe ich aber noch nie benutzt, weil ich TextFiles ganz klassisch[//2] in eine Liste einlese (und nachher wieder wegschreibe) und deshalb kenne ich den Namen nicht einmal - aber ist schnell im Web oder im Forum zu finden.

Du kannst auch in deinem Code
- an Stelle der Zeile 13 dieses StringReplace weglassen und den dort vorhandenen String in eine Liste packen (immer bis CR/LF abschneiden = neue Listenzeile),

- dann deine Bedingungen in der Liste abklappern, gegebenenfalls ändern, ergänzen, löschen

- dann die Liste in den String zurückschreiben,

-und mit Zeile 14 weitermachen (Datei zurückschreiben).

Allerdings ist dann die klassische Methode, direkt in die Stringlist einlesen und direkt daraus wieder wegschreiben schneller (in Bezug auf die Anzahl der CodeZeilen).

Resumee:
- Benutz die Methode [1], ein TextFile direkt in eine StringList einzulesen (die mir nicht namentlich bekannt Prc)
-oder lies klassisch ein [2].

Meiner Meinung nach ist die Programmpflege mit einer StringList wesentlich einfacher als mit einem Schiebepuffer. Vorallem ist der Code auch nach Jahren noch besser nachzuvollziehen. Und Du weisst nicht, was noch alles geupdatet werden soll.

FF :)

Für diesen Beitrag haben gedankt: bennySB
MeierZwoo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 94
Erhaltene Danke: 11

Win 7, DOS5
Delphi 2007 Architect, BP7/TP5, LISP, PS
BeitragVerfasst: Di 14.05.13 01:44 
Und noch ein Tip, betrifft deine angehängten Dateien: Wenn man Dateien veröffentlicht, sollte man personenbezogenes rauslöschen oder durch ein Dummy ersetzen (Jedenfalls wenn man anonym bleiben möchte).

Nachdem ich mir die Dateien angesehen habe: Beispiel 1 trifft doch genau zu.
Und der Wust ist nur mit einer Liste hinzubekommen, mit einem Schiebepuffer suchst Du dir einen Wolf nach CodeFehlern.
bennySB Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Di 14.05.13 09:46 
Aufjedenfall erst einmal einen großen Dank an dich das du dir soviel Mühe mit nem Ahnungslosen wie mir gibst^^

Ich werde mir die Tage jetzt nochmal ein paar Grundlagen zu gemüte führen und mich dann an die StringList Sache ran hängen, kann ja nicht erwarten das jemand anderes das für mich schreibt.
MeierZwoo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 94
Erhaltene Danke: 11

Win 7, DOS5
Delphi 2007 Architect, BP7/TP5, LISP, PS
BeitragVerfasst: Di 14.05.13 10:53 
Noch ein abschließender Tip: Benutze für die Configdateien bei einlesen, bearbeiten und ablegen AnsiString (oder ShortString) statt String. ConfigFiles sollten immer ANSI sein (7bit oder auch 8bit für Umlaute in StringLateralen). Wenn Du String benutzt, kann es u.U. dazu kommen, daß kein ANSI abgelegt wird, sondern UniCode - und da stolpern dann die zu configurierenden Programme evtl. drüber.

Und auch nicht aus Versehen (Windows macht das manchmal ganz gerne per Editor) eine BOM (ByteOrderMark) in das File schreiben. Beim Bearbeiten mit z.B. NotePad beim speichern gewährleisten, daß rechts vom Speicherort "ANSI" steht.
MeierZwoo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 94
Erhaltene Danke: 11

Win 7, DOS5
Delphi 2007 Architect, BP7/TP5, LISP, PS
BeitragVerfasst: So 26.05.13 23:43 
benny, es ist zum 1. wenig sinnig, mich bei diesem Thema privat zu fragen, weil ich mit fremden Installationsroutinen und auch den INI Funktionen der Win-API wenig am Hut habe - also noch weniger Kenntnisse und Erfahrung als Du. Ich erledige das (aus bestimmten Gründen, vorallem wg. Abwärtskompatibilität) ganz klassisch zu Fuß.

2. Du mußt Dir ersteinmal klar werden, was Du da überhaupt tust:

Nach dem, was ich bisher gelesen habe, benutzt Du ein Fremdtool (bzw. Fremd-Unit/DLL), einen Wizard zur Installation per Benutzer. Für dessen Zugriff während der Installation beim Benutzer lieferst Du eine Config-Datei mit (s. dein Anhang), aus dem sich der Wizard die erforderlichen Abläufe und Vorgaben holt. u.a. Vorschläge für die Installations-Verzeichnisse. Diese Vorschläge hast Du dort vorgegeben, der Benutzer kann ihnen folgen oder sie ändern.

So wie ich Wizards kenne und verstehe, braucht doch niemand weder manuel noch durch Programmzugriff irgendwelche Verzeichnisse nachträglich zu ändern - das macht der Wizard in Absprache mit dem installierenden Benutzer doch selber bzw. führt die Benutzerangaben (Inst-Verzeichnisse) aus und das war es dann bis zur evtl. nächsten Installation.

Geht es nun darum, daß die durch den User vorgegebenen Verzeichnisse in der Wizard-Config gespeichert werden sollen, für eine evtl. spätere Installation? Dann müßte der Benutzer aber auch alles sichern! Und bei erneuter Inst nicht mit Deiner Lieferung (CD ...) oder so neu anfangen.

Wenn es darum geht, vorab eine Frage: Hat der Wizard keine Voreinstellungen (von Deiner Seite aus), daß er eben die gewählten Benutzer-Settings (Verzeichnisse ...) nach erfolgter Inst in seinen eigenen Dateien speichern kann? Denn das wäre doch der Normalfall!

Wie Du bemerkst, kenne ich mich mit diesen Teilen nicht aus - schon deshalb, weil ich in der Zeit, in die ich mich in die Parametrierung eingelesen (und geübt) hätte, meine eigene Routine 100x fertig hätte.

Vorallem solltest Du erstmal feststellen, wie und wo Du denn im lfd. Programm während der Inst beim Benutzer dessen Benutzer-Settings abfangen und für ein Update nach Inst-Abschluß benutzen kannst. Denn das kommt vor dem Update, die Daten zu haben!

:)
bennySB Threadstarter
Hält's aus hier
Beiträge: 10



BeitragVerfasst: Mo 27.05.13 08:12 
Ok^^

Ich dachte nur durch deine vorangegangenen Antworten wärst du mehr im Thema drin.
Dann werde ich mir mal weiter ein paar Guides und Starterhilfen zu Gemüte Führen^^