18. marts 2007 - 21:59
Der er
7 kommentarer og
1 løsning
Inifiler uden sections
Hey,
Jeg har brug for at kunne læse/skrive til inifil lignende filer. Jeg har prøvet at bruge "Inifiles" til dette formål men dette virker ikke da de filer jeg manipulerer ikke har nogle sections...
jeg har filer med dette indhold:
Server=xxx
Hostname=yyy
ListenPort=zzz
Der er ingen sections og der er ikke mulighed for at tilføje sections... er der nogle der har en god ide til hvordan jeg så manipulerer disse filer?
18. marts 2007 - 22:23
#1
Så er det nemmeste nok at læse filen ind i en TStringList.
----------------------------------------------------------
procedure TForm1.BLoadClick(Sender: TObject);
var
SList: TStringList;
i, tmpPos, tmpLength: Integer;
begin
SList := TStringList.Create;
SList.LoadFromFile('config.txt');
For i := 0 To SList.Count -1 Do Begin
tmpPos := Pos('=',SList.Strings[i]) + 1;
tmpLength := Length(SList.Strings[i]) + 1;
If Pos('Server',SList.Strings[i]) > 0 Then
Edit1.Text := Copy(SList.Strings[i],tmpPos,tmpLength-tmpPos)
Else If Pos('Hostname',SList.Strings[i]) > 0 Then
Edit2.Text := Copy(SList.Strings[i],tmpPos,tmpLength-tmpPos)
Else If Pos('ListenPort',SList.Strings[i]) > 0 Then
Edit3.Text := Copy(SList.Strings[i],tmpPos,tmpLength-tmpPos);
End;
SList.Free;
end;
procedure TForm1.BSaveClick(Sender: TObject);
var
SList: TStringList;
i, tmpPos: Integer;
begin
SList := TStringList.Create;
SList.LoadFromFile('config.txt');
For i := 0 To SList.Count -1 Do Begin
tmpPos := Pos('=',SList.Strings[i]);
If Pos('Server',SList.Strings[i]) > 0 Then
SList.Strings[i] := Copy(SList.Strings[i],0,tmpPos) + Edit1.Text
Else If Pos('Hostname',SList.Strings[i]) > 0 Then
SList.Strings[i] := Copy(SList.Strings[i],0,tmpPos) + Edit2.Text
Else If Pos('ListenPort',SList.Strings[i]) > 0 Then
SList.Strings[i] := Copy(SList.Strings[i],0,tmpPos) + Edit3.Text
End;
SList.SaveToFile('config.txt');
SList.Free;
end;
----------------------------------------------------------
Det er muligt det kan gøres lidt mere elegant - især hvis der skal bygges flere felter på ;)
18. marts 2007 - 22:48
#3
Vil da lige nævne at TStringList har funktioner til at håndtere Navn=Value linier så alt det snowball skriver er slet ikke nødvendig:
Det kan gøres ganske enkelt således:
var
StringList : TStringLIst;
Server : string;
begin
StringList:=TStringLIst.Create;
StringList.LoadFromFile('Dinfil.txt');
Server:=StringList.Values['Server'];
Kik også på funktionerne ValueFromIndex, IndexOf og IndexOfName.
18. marts 2007 - 22:54
#5
Tænkte nok der var en (meget) nemmere måde at gøre det på :)
procedure TForm1.BLoadClick(Sender: TObject);
var
SList: TStringList;
begin
SList := TStringList.Create;
SList.LoadFromFile('config.txt');
Edit1.Text := SList.Values['Server'];
Edit2.Text := SList.Values['Hostname'];
Edit3.Text := SList.Values['ListenPort'];
SList.Free;
end;
procedure TForm1.BSaveClick(Sender: TObject);
var
SList: TStringList;
begin
SList := TStringList.Create;
SList.LoadFromFile('config.txt');
SList.Values['Server'] := Edit1.Text;
SList.Values['Hostname'] := Edit2.Text;
SList.Values['ListenPort'] := Edit3.Text;
SList.SaveToFile('config.txt');
SList.Free;
end;
kroning: Skal vi dele pointene? :)