Entwickler-Ecke
Dateizugriff - InI Einträge sortieren
opfer.der.genauigkeit - Di 21.01.03 12:55
Titel: InI Einträge sortieren
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?
opfer.der.genauigkeit - 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() ?
opfer.der.genauigkeit - 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)
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]
Anonymous - 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 - 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:
Anonymous - 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:
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 - 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.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 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!