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


Quelltext
1:
2:
1=claudia
3=jakob


und er will es nicht mehr lesen...

kan mir irgendjemand helfen :?:

dake im vorraus


Moderiert von user profile iconraziel: 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

user profile iconPhilipp_Reitter hat folgendes geschrieben:
for i:=0 do list...

klar, sorry... hatte ich in meiner dussligkeit durcheinander gebracht ;)

user profile iconPhilipp_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 ReadSectionValues 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;  // neu
begin
  Ini1 := TIniFile.Create(form1.edit3.text+form1.Edit1.Text+ '.ini');
  strlist := TStringList.Create;  // neu

  try
    erst := ini1.ReadString('Erst','erst','');
    if erst='Ja' then begin
      listbox2.Clear;
      listbox1.Clear;

      // neu:
      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;



user profile iconPhilipp_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

user profile iconPhilipp_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;



user profile iconPhilipp_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

user profile iconPhilipp_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

  // den 1. buchstaben wegnehmen:
  neu := RightStr(alt, Length(alt)-1);

  // den letzten buchstaben wegnehmen:
  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

user profile iconPhilipp_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!

user profile iconPhilipp_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...