Entwickler-Ecke
Dateizugriff - ini Files
Philipp_Reitter - Sa 04.03.06 23:02
Titel: ini Files
hi
ich schreibe gerade ein chat programm, mit ini files für die kontakte...
jetzt möchte ich kontakte löschen...
in meinem ini file siehts so aus
Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| [Erst] erst=Ja // ist nur daführ um einenmachmal auftretenden fehler zu vermeiden [Benzahl] Anzahl=4 //welche zahl der nöchste denutzer bekommt [Benutzer] 1=claudia // benutzer.... 2=Johannes 3=jakob |
jetzt lösche ich einen benutzer....
(hab daran gedacht die benutzerzahl um eines zu senken)
aber dann entsteht eine lücke
und er will es nicht mehr lesen...
kan mir irgendjemand helfen :?:
dake im vorraus
Moderiert von
raziel: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Mo 06.03.2006 um 08:50
reichemi - Sa 04.03.06 23:11
da kann man sicherlich viel machen, hängt ganz davon ab wie deine routinen aussehen und welche du ändern willst...
möglichkeiten, die mir im moment dazu einfallen:
- beim löschen eines benutzers die nummerierung entsprechend anpassen. wenn du die benutzer z.b. in einer TStringList hast, dann musst du dich darum ja gar nicht kümmern --> einfach den index der stringlist zum speichern verwenden
- beim lesen: eigentlich reicht es ja aus, eine der folgenden wege einzuschlagen:
a) die benutzer mit einer fortlaufenden nummer, beginnend bei 1 speichern, und mit lesen aufhören sobald ein eintrag nicht mehr vorhanden ist
b) die anzahl der benutzer speichern und bei 1 beginnen mit lesen. dabei einen zähler mitlaufen lassen, und wenn ein eintrag vorhanden ist: auslesen und zähler um 1 erhöhen... und erst aufhören, wenn zähler = anzahl
c) einfach die methode ini.ReadSection() bzw. ini.ReadSectionValues() verwenden, wobei ini die entsprechende TIniFile-instanz darstellt
c) ist da sicherlich am sinnvollsten, vorallem wenn du die benutzer sowieso in einer TStringList verwaltest ;)
bei b) kannst du natürlich auch schnell in eine schleife laufen, die nicht mehr aufhört (z.b. versehentlich anzahl=4 eingetragen, und es gibt nur 3 kontakte ;) )
Philipp_Reitter - Sa 04.03.06 23:48
ok das ist jetzt viels aber ich hab das so:
ich hab ne listbox (und ne zweite für unlinestatus sehen nicht so wichtig....)
und bei form create mach ich folgendes
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: 38: 39: 40: 41: 42: 43: 44:
| procedure TForm4.Benuzerladen; var ini: TIniFile; name, stat, erst :string; zahl, zahl2: integer; begin Ini := TIniFile.Create(form1.edit3.text+form1.Edit1.Text+ '.ini'); try erst:=ini.ReadString('Erst','erst',''); finally ini.Free; end; if erst='Ja' then begin listbox2.Clear; listbox1.Clear; zahl:=1;
Ini := TIniFile.Create(form1.edit3.text+form1.Edit1.Text+ '.ini'); try zahl2:=ini.ReadInteger('Benzahl','Anzahl',0); finally ini.Free; end; repeat Ini := TIniFile.Create(form1.edit3.text+form1.Edit1.Text+'.ini'); try name:=ini.ReadString('Benutzer',floattostr(zahl),''); finally ini.Free; end; Ini := TIniFile.Create(form1.edit3.text+'login.ini'); try Stat:=ini.ReadString(Name,'Status',''); finally ini.Free; end; listbox1.Items.Add(name); listbox2.Items.Add(Stat); zahl:=zahl+1; until zahl = zahl2; end else begin end; listbox1.ItemIndex:=-1 end; |
das heißt er ließts und dann zahl:0 zahl+1 und dann wieder einfügen....., bis zahl= zahl2.....
aber das mim lösche wil nicht wirklich gehen......
kannst du mir einen script screiben.....
Narses - Sa 04.03.06 23:55
Moin!
Schau mal
hier [
http://www.delphi-forum.de/viewtopic.php?p=286602#286602], das Beispiel ist zwar für einen anderen Zweck geschrieben, aber du brauchst dir eigentlich nur das FormCreate() und das FormDestroy() ansehen, da speichere ich die Daten des Programmes in einer INI-Datei, und das dürfte dich weiterbringen. :wink:
cu
Narses
reichemi - So 05.03.06 00:16
heieiei... da sind ja einige schnitzer drin... ich habs mal so geändert, wie ich es evtl. machen würde:
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:
| procedure TForm4.Benuzerladen; var ini1, ini2: TIniFile; name, stat, erst :string; zahl: integer; begin Ini1 := TIniFile.Create(form1.edit3.text+form1.Edit1.Text+ '.ini');
try erst := ini1.ReadString('Erst','erst',''); if erst='Ja' then begin listbox2.Clear; listbox1.Clear;
ini1.ReadSectionValues('Benutzer', listbox1.items);
ini2 := TIniFile.Create(form1.edit3.text+'login.ini');
try for zahl:=0 to listbox1.items.count-1 do listbox2.items.add(ini2.ReadString(listbox1.items[i],'Status',''); finally ini2.Free; end;
end; finally ini1.Free; end;
listbox1.ItemIndex:=-1 end; |
das sollte es eigentlich auch tun ;)
wie du siehst, brauchst du damit auch keinen eintrag Benzahl bzw. Anzahl mehr, da einfach alle einträge in der sektion "Benutzer" eingelesen werden, egal welchen Index diese haben
NeoInDerMATRIX - So 05.03.06 01:27
Hi,
wenn du den Index nicht unbedingt brauchst, dann lese eine gesamte INI-Section in eine tStringList ein. Dafür gibt es eine Methode so weit ich weis. Dann machst du die INI Datei einfach:
Quelltext
1: 2: 3: 4:
| [...] AnzeigeName=NickName [...\NickName] eintragungen... |
So kannst du jeder Zeit Namen wieder löschen ohne das die Indexe spinnen.
Cu
Neo
Neidhard von Reuental - So 05.03.06 09:28
letzteres würde ich dir auch empfehlen
Philipp_Reitter - So 05.03.06 09:38
@ reichemi
bei deinem script sagt er listenindex üerschreitet das maximum.....
hab das problem herusgefunden...
ich (bez.) darf(st) nicht schreiben
for zahl:=0 do list....
sondern
for i:=0 do list...
habs jetzt noch mal ohne den scipt der listbox 2 versucht jtzt gehts aber da ist das so das er anzeigt (in der listbox)
1=Philipp
2=Claudia
4=jakob
verstehst du?
ah und noch was du hast das so geschrieben das die list 2 die zahl des items in der list1.
aber in meiner login datei siehts so aus...
Quelltext
1: 2: 3: 4:
| [Philip] Status=online [Claudia] ... |
weil wenn da eins stehen würde dann würde das mit anderen dureinanderkommen...
bei mir stehts ja schön in 1234 aber andere fügen ja dann die enutzer vertaucht ein und dan entsteht ein chaos (hatte ih schon9....
reichemi - So 05.03.06 10:51
klar, sorry... hatte ich in meiner dussligkeit durcheinander gebracht ;)
Philipp_Reitter hat folgendes geschrieben: |
habs jetzt noch mal ohne den scipt der listbox 2 versucht jtzt gehts aber da ist das so das er anzeigt (in der listbox)
1=Philipp
2=Claudia
4=jakob |
auch das hab ich bissel durcheinandergehauen... hatte ich mich da zu sehr vom namen ReadSection
Values bzw. von der hilfe leiten lassen... es werden eben nicht nur die werte der sektion (also alles hinter dem "=") sondern auch die schlüssel dazu (das vor dem "=") eingelesen...
folgendermaßen könntest du das z.b. reparieren:
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: 38: 39:
| procedure TForm4.Benuzerladen; var ini1, ini2: TIniFile; name, stat, erst :string; i: integer; strlist: TStringList; begin Ini1 := TIniFile.Create(form1.edit3.text+form1.Edit1.Text+ '.ini'); strlist := TStringList.Create; try erst := ini1.ReadString('Erst','erst',''); if erst='Ja' then begin listbox2.Clear; listbox1.Clear;
ini1.ReadSection('Benutzer', strlist);
for i:=0 to strlist.Count-1 do ListBox1.Items.Add(ini1.ReadString('Benutzer', strlist[i], 'Benutzer #'+IntToStr(i)));
ini2 := TIniFile.Create(form1.edit3.text+'login.ini');
try for zahl:=0 to listbox1.items.count-1 do listbox2.items.add(ini2.ReadString(listbox1.items[i],'Status',''); finally ini2.Free; end;
end; finally ini1.Free; strlist.Free; end;
listbox1.ItemIndex:=-1 end; |
Philipp_Reitter hat folgendes geschrieben: |
weil wenn da eins stehen würde dann würde das mit anderen dureinanderkommen...
bei mir stehts ja schön in 1234 aber andere fügen ja dann die enutzer vertaucht ein und dan entsteht ein chaos (hatte ih schon).... |
ich weiß nicht so recht, ob ich das richtig verstehe... aber vielleicht solltest du dir eine andere daten-struktur übelegen, die weniger fehleranfällig ist... :gruebel:
Philipp_Reitter - So 05.03.06 10:53
ne die datenstuktur passt...
nun aber wie bekomm ich das 1= von 1=Philipp weg???
und wie kann ich sagen listbox1.itemname so was oder itemtext gibts das .....
reichemi - So 05.03.06 10:58
Philipp_Reitter hat folgendes geschrieben: |
| nun aber wie bekomm ich das 1= von 1=Philipp weg??? |
wenn du das auf die listbox1 beziehst: das wird durch den obigen code nicht mehr erzeugt, sondern es sieht dann so aus:
listbox1:
Philipp
Claudia
jakob
listbox2:
online
online
online
allgemein könntest du es aber so machen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| var str1, str2: String; begin str1 := '1=Phillip'; str2 := Copy(str1, Pos('=', str1)+1, MaxInt); end; |
Philipp_Reitter hat folgendes geschrieben: |
| und wie kann ich sagen listbox1.itemname so was oder itemtext gibts das ..... |
du kannst auf die einzelnen einträge via listbox1.items[i] zugreifen ;)
Philipp_Reitter - So 05.03.06 11:16
wie soll ich jetzt das mit dem script machen jetzt hab ich gar keinen plan mehr kann man nicht sagendie erten 2 buchstaben beim einfügen wgnehmen....
oder den letzten buchstaben wegnehmen...
reichemi - So 05.03.06 11:36
Philipp_Reitter hat folgendes geschrieben: |
| kann man nicht sagendie erten 2 buchstaben wgnehmen.... oder den letzten buchstaben wegnehmen... |
vielleicht schafft das mehr klarheit?:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| var neu, alt: String; begin
neu := RightStr(alt, Length(alt)-1);
neu := LeftStr(alt, Length(alt)-1); |
Philipp_Reitter - So 05.03.06 12:16
ok und wenn ich jetzt das item hinzufüge wie mach ich dann das.....
ich habs jtzt probiert und jetzt geht gar nix mahr...
kann mir nicht irgendjemand zu der fragestellung ganz oben helfen
so ein script dass er entweder alles in eine neue date kopiert und dann das eine weglasst oder dass er den fehler ausbesset.....
kann mir nicht irgendjamand helfen :?: :?: :?: :cry:
reichemi - So 05.03.06 12:24
Philipp_Reitter hat folgendes geschrieben: |
| ok und wenn ich jetzt das item hinzufüge wie mach ich dann das..... |
Delphi-Quelltext
1:
| listbox1.items.add('neuer benutzer'); |
meinst du das? :roll:
Philipp_Reitter - So 05.03.06 12:45
ah jatzt ist alles im *popo* ich muss das ganze noch ma machen und zwar auf meine art und dann krieg ich das schon hin
Narses - So 05.03.06 13:12
Moin!
Philipp_Reitter hat folgendes geschrieben: |
kann mir nicht irgendjemand zu der fragestellung ganz oben helfen
so ein script dass er entweder alles in eine neue date kopiert und dann das eine weglasst oder dass er den fehler ausbesset.....
kann mir nicht irgendjamand helfen :?: :?: :?: :cry: |
Ich hab dir in dem Link oben einen Lösungsweg gezeigt, hast du dir das mal angesehen? Fragen dazu? Überhaupt interessiert daran... ?
Viel Erfolg noch,
Narses
Philipp_Reitter - Mo 06.03.06 07:28
ahhhh....
leute ich habs jetzt geschafft....
ich lasse einfach statt dem namen deleted user hinschreiben udn dann bei reinladen
Delphi-Quelltext
1:
| if name <> 'deleted user' then begin... |
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!