Autor Beitrag
opfer.der.genauigkeit
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 754
Erhaltene Danke: 1



BeitragVerfasst: Di 21.01.03 12:55 
Ich habe eine INI- Datei in der in einer bestimmten Abfolge Einträge stehen:

[Files]
CurrentPath = C:\work
File1 = ..\Datei.exe
File2 = ..\Datei.dll
File3 = ..\Irgendwas
File4 = ..\Blabla

Ich möchte ein Programm dazu schreiben, daß es möglich macht wenn ich an einer bestimmten Stelle z.b. bei File3 danach ein Eintrag mache, daß der nächste Eintrag zu File4 wird und File4 zu File5 usw.

Vorher :

[Files]
CurrentPath = C:\work
File1 = ..\Datei.exe
File2 = ..\Datei.dll
File3 = ..\Irgendwas
Neuer Eintrag
File4 = ..\Blabla

Nachher:

[Files]
CurrentPath = C:\work
File1 = ..\Datei.exe
File2 = ..\Datei.dll
File3 = ..\Irgendwas
File4 = Neuer Eintrag
File5 = ..\Blabla

Vielleicht hat jemand ne Idee, wie ich da am besten an die Geschichte ran gehe.
Reicht zur Verwirklichung ein Memofeld?

_________________
Stellen Sie sich bitte Zirkusmusik vor.
opfer.der.genauigkeit Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 754
Erhaltene Danke: 1



BeitragVerfasst: Mi 22.01.03 10:09 
Ihr wollt mir nicht helfen, gebt´s zu. :wink:
Aber vielleicht kann mir jemand sagen wie ich, nachdem ich mit Pos() einen bestimmten String gefunden habe, die Zeile dieses Strings rausbekomme. Über Memo.Lines.IndexOf() ?

_________________
Stellen Sie sich bitte Zirkusmusik vor.
opfer.der.genauigkeit Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 754
Erhaltene Danke: 1



BeitragVerfasst: Do 23.01.03 10:17 
Titel: :)
Bei soviel Hilfe war es ja nicht schwer, das Programm schnell zu schreiben. :wink:
Hier mein Code, wen´s interessiert... ist eigentlich total einfach.
(Ich verwende 4 Buttons, Save- u. Opendialog, Memo, Statusbar)

ausblenden volle Höhe 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:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
procedure TForm1.BtBtnOpenINIClick(Sender: TObject);
//Öffnet den OpenDialog und setzt Attribute der Buttons außerdem Informationen
//zur Datei in der Statusleiste

begin
  if OpenDialog1.Execute then
    MemoInIdat.Lines.LoadFromFile(OpenDialog1.FileName);

  BtBtnSaveINI.Visible := true;
  BtBtnSaveINI.Enabled := false;
  BtBtnSortINI.Visible := true;
  StatusBar1.Panels.Items[0].Text := 'Datei: ' + OpenDialog1.FileName;
  StatusBar1.Panels.Items[1].Text := 'Zeilen: ' + IntToStr(MemoInIdat.Lines.Count-1);
  StatusBar1.Panels.Items[2].Text := 'Größe: ' + IntToStr(SizeOf(OpenDialog1.Name)) + ' KB';
end;

//************************************************************
procedure TForm1.MemoInIdatChange(Sender: TObject);
//Fals der Text verändert wird wird der SaveButton sichtbar

begin
  BtBtnSaveINI.Enabled := true;
end;

//************************************************************
procedure TForm1.BtBtnSaveINIClick(Sender: TObject);
//Speichert Datei und überprüft ob es sich um eine neue od. geöffnete Datei handelt

begin
  if OpenDialog1.FileName <> '' then
    MemoInIdat.Lines.SaveToFile(OpenDialog1.FileName)
  else
    SaveDialog1.Execute;
end;

//************************************************************
procedure TForm1.BtBtnSortINIClick(Sender: TObject);
//Beginnt mit der Sortierroutine

begin
    SearchString;
end;

//************************************************************
procedure TForm1.SearchString;
//Sortierroutine

var
  iPosIndex, iLoop, iFileLength, iFileCount: integer;
  SubStr, sLine : string;
  bEdtArea : boolean; //gibt an ob es sich um den zu bearbeitenden Bereich handelt
begin
  MemoInIdat.Lines.BeginUpdate;
  iFileLength := MemoInIdat.Lines.Count-1;
  SubStr := '=';
  iFileCount := 1;  //Dateicounter

  //iLoop durchläuft die TextDatei von Zeile 1 - x
  for iLoop := 0 to iFileLength do begin
    //Zeile x wird gelesen
    sLine := MemoInIdat.Lines[iLoop];

    //Inoriere Zeile
    if (Pos('[SourceFiles]',sLine) <> 0) then begin
     bEdtArea := True;
     Continue;
    end;

    //Inoriere Zeile 
    if (Pos('CurrentPath',sLine) <> 0) and bEdtArea then
     Continue;

    //Inoriere Zeile
    if (sLine = '') and bEdtArea  then
     Continue;

    //Suche Index von SubStr
    iPosIndex := Pos(SubStr,sLine);

    //Index gefunden? Beginne mit der Verarbeitung
    if (iPosIndex <> 0) and bEdtArea then begin
      AddCount(iLoop, iFileCount, sLine);
      inc(iFileCount);
    end;

   //Ende des zu bearbeitenden Bereiches?
   if (Pos('[',sLine) <> 0) and bEdtArea then
      Break;

  end;

  MemoInIdat.Lines.EndUpdate;
end;

//************************************************************
procedure TForm1.AddCount(iCountLine, iFileCount: integer; sLine: string);
begin
  //Vorderen Teil der Zeile bis '=' abschneiden
  Delete(sLine,1,pos('=',sLine));
  //Vorderen Teil neu schreiben und den Rest nach = anhängen
  MemoInIdat.Lines[iCountLine] := Format('File' + '%s' + ' =',[IntToStr(iFileCount)]) + sLine;
end;

//************************************************************
procedure TForm1.BtBtnNewClick(Sender: TObject);
begin
  //Grundstrucktur anlegen
  MemoInIdat.Lines.Add('[SourceFiles]');
  MemoInIdat.Lines.Add('CurrentPath = ');
  MemoInIdat.Lines.Add(' ');
  MemoInIdat.Lines.Add('File1 = ');
  MemoInIdat.Lines.Add(' ');
  MemoInIdat.Lines.Add('[ ]');
  BtBtnSaveINI.Visible := true;
  BtBtnSortINI.Visible := true;
end;

//************************************************************
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  //Sicherheitsabfrage, damit Daten nicht verloren gehen
  if BtBtnSaveINI.Enabled then
    if MessageDlg('Die Datei wurde verändert. Möchten Sie die Änderungen speichern?'
       ,mtInformation,[mbYes, mbNo], 0) = mrYes then begin
        BtBtnSaveINI.Click;
      end;
end;


Gut, man könnte die Searchroutine direkt in den Sortbutton schreiben.
Und der Code ist nicht perfekt.

Der Aufbau der INI sieht in der Regel so aus:

[SourceFiles]
CurrentPath =
FileX =
[Zip]

_________________
Stellen Sie sich bitte Zirkusmusik vor.
Popov
Gast
Erhaltene Danke: 1



BeitragVerfasst: Do 23.01.03 15:56 
Es gibt einige schöne Funktionen die sowas erleichtern.

Zuerst gibt es die Ini-Funktion mit der man die Key's einer ganzen Sektion in ein Stringlist laden. Mit deren Hilfe kannst du auch die Werte in eine zweite Stringlist laden.

Dann speicherst du deinen Wert an der Stelle der zweiten Stringlist wo du willst.

Dann löscht du mit einer Ini-Funktion alle Werte der Sektion.

Dann schreibst du aller Werte der zweiten Stringlist in die Sektion rein.

Fertig!

Wie du siehst brauchst du keine MemoInIdat.Lines.Add...
opfer.der.genauigkeit Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 754
Erhaltene Danke: 1



BeitragVerfasst: Do 23.01.03 16:40 
Wo warst du nur die letzten zwei Tage, die mein Posting schon exisitierte.
:shock:

Und das mit den Stringlisten hab ich vorhin angefangen.
Ansonsten find ich, sind die Funktionen von Ini- Files sehr beschränkt. :twisted:

_________________
Stellen Sie sich bitte Zirkusmusik vor.
Popov
Gast
Erhaltene Danke: 1



BeitragVerfasst: Do 23.01.03 18:39 
Finde ich nicht. Allerdings kann man die Funktionen mit Hilfe von StringList sehr erweitern.

Das was du machst hab ich in einigen meiner Programme gemacht. Es ist leichter als man denkt. Allerdings muß man alle Ini-Funktionen aus dem ff kennen und auch wissen wie man es erweitern kann. Hier ein kleines Beispiel:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure TForm1.Button1Click(Sender: TObject);
var
  sl: TStringList;
  i: Integer;
begin
  sl := TStringList.Create;
  with TIniFile.Create(ChangeFileExt(ParamStr(0), '.ini')) do try
    ReadSection ('Section', sl);
    for i := 0 to sl.Count - 1 do
      sl.Strings[i] := ReadString('Section', sl.Strings[i], 'FEHLER');

    //...
    sl.Insert(0, TimeToStr(Now));
    //...

    EraseSection('Section');
    for i := 0 to sl.Count - 1 do
      WriteString('Section', 'File' + IntToStr(i), sl.Strings[i]);
  finally
    sl.Free;
  end;
end;


Der erste Teil liest alle Werte einer Sektion. Der mittlere Teil ist der, der mit dem du arbeiten kannst. Der dritte Teil speichert die Werte wieder in die Ini.
opfer.der.genauigkeit Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 754
Erhaltene Danke: 1



BeitragVerfasst: Do 23.01.03 23:41 
Soweit bin ich auch mitlerweile.
Trotzdem danke. :)

Morgen werd ich das alles mit Stringlisten machen.
Bietet sich wirklich an.

_________________
Stellen Sie sich bitte Zirkusmusik vor.