| Autor |
Beitrag |
DiamondDog
      
Beiträge: 460
|
Verfasst: Mi 29.04.09 11:11
Hallo Leute,
also ich hab da folgendes Problem und zwar habe ich in meiner ini eine User Liste:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| [Anzahl] Anzahl=4
[User1] Username=Name1 Passwort=PW1
[User2] Username=Name2 Passwort=PW2
[User3] Username=Name3 Passwort=PW3
[User4] Username=Name4 Passwort=PW4 | Mein Problem ist jetzt das wenn ich einen userer gelöscht habe, ja eine Zahl fehlt und deswegen will ich alle [User] dann neu durchnumerieren. Leider hab ich keine Ahnung wie ich das anstellen kann. Wäre super wenn mir da jemand bei Helfen könnte.
PS: Die Anzahl gibt immer an wieviele User in der Ini stehen. Sie wird nach dem löschen natürlich um 1 verringert. Wenn das Helfen sollte für das neu nummerieren.
Danke schon mal
Mfg Dog
|
|
Gausi
      
Beiträge: 8554
Erhaltene Danke: 480
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Mi 29.04.09 11:16
Ich glaube, da hilft nur eines: Datei komplett neu schreiben. D.h. Userliste in eine geeignete Struktur einlesen (Array of Record, TObjectlist) Änderungen auf dieser Struktur durchführen und dann die Ini komplett neu schreiben.
Außerdem wäre es wahrscheinlich sinnvoll, sich ein anderes Format zum Speichern der Daten zu überlegen. Inis sind für solche Zwecke eher ungeeignet.
_________________ We are, we were and will not be.
|
|
DiamondDog 
      
Beiträge: 460
|
Verfasst: Mi 29.04.09 11:25
Ich hab jetzt mal n bischen gegoogelt und das hier gefunden:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| uses IniFiles;
function RenameIniSection(IniFile: TIniFile;OldSection,NewSection: String): boolean; var ini: TStringList; ind: Integer; begin result := false; ini := TStringList.Create; ini.LoadFromFile(IniFile.FileName); if(ini.Count > 0) then begin ind := ini.IndexOf('['+OldSection+']'); if(ind <> -1) then if ini.indexOf('['+NewSection+']') < 0 then begin ini.Strings[ind] := '['+NewSection+']'; result := true; end; ini.SaveToFile(IniFile.FileName); end; end; | Könnte man das nicht so machen dann man die Zahl die gelöscht wird dann zwischen speichert als integer und dann die Zahl +1 rechnen und dann ab da alles - 1 rechnen? Hoffe das man meiner Ausführung folgen kann *gg*
|
|
Gausi
      
Beiträge: 8554
Erhaltene Danke: 480
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Mi 29.04.09 11:30
Joah, das ist auch eine Methode, die Datei komplett neu zu schreiben. Laufzeit: Quadratisch. Laufzeit meiner Idee (beim Löschen eines Users): Linear.
DiamondDog hat folgendes geschrieben : | | Könnte man das nicht so machen dann man die Zahl die gelöscht wird dann zwischen speichert als integer und dann die Zahl +1 rechnen und dann ab da alles - 1 rechnen? Hoffe das man meiner Ausführung folgen kann *gg* |
Ja, kann man machen. Aber elegant ist was anderes. 
_________________ We are, we were and will not be.
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Mi 29.04.09 11:36
Etwas schneller (und vor allem sauberer) geht's so (mit dem Umbennen):
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:
| uses IniFiles;
function RenameIniSection(IniFile: TIniFile; OldSection, NewSection: String): boolean; var ini: TStringList; ind: Integer; begin result := false; ini := TStringList.Create; try ini.LoadFromFile(IniFile.FileName); if(ini.Count > 0) then begin ind := ini.IndexOf('['+OldSection+']'); if(ind <> -1) then if ini.indexOf('['+NewSection+']') < 0 then begin ini.Strings[ind] := '['+NewSection+']'; ini.SaveToFile(IniFile.FileName); result := true; end; end; finally FreeAndNil(ini); end; end; |
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
thepaine91
      
Beiträge: 763
Erhaltene Danke: 27
Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
|
Verfasst: Mi 29.04.09 11:41
Ich hatte folgendes im Kopf:
Und zwar die Daten in einen Array zu speichern. Und dann die Ini neu Schreiben lassen vom Programm die Anzahl hättest du dann mit length() und Array[i] hättest du mit i die Usernummerrierung.
Wenn das so verständlcih ist.
ja ich gebe zu ich hab eine schäwche für arrays 
|
|
DiamondDog 
      
Beiträge: 460
|
Verfasst: Mi 29.04.09 11:47
Kann mir mal schnell einer sagen wie ich die RenameIniSection aufrufe? Bin gerade einwenig neben der Spur. Danke.
|
|
Narses
      

Beiträge: 10184
Erhaltene Danke: 1259
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mi 29.04.09 11:53
Moin!
Quelltext 1: 2: 3: 4: 5: 6:
| [User] Count=2 User1Name=ich User1Tel=1234 User2Name=Du User2Tel=5678 | Vor dem Schreiben ein .EraseSection('User');, fertig.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
DiamondDog 
      
Beiträge: 460
|
Verfasst: Mi 29.04.09 12:08
Habs mit der BenBE hinbekommen.
Bestend Danke an alle fürs Helfen.
|
|
thepaine91
      
Beiträge: 763
Erhaltene Danke: 27
Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
|
Verfasst: Mi 29.04.09 12:11
Narses  da kommt jeder mit hoch komplizierten Vorschlägen und du löst es mir einer Zeile  aber gefällt mir falls ich das mal brauchen sollte 
|
|