Autor Beitrag
Philipp_Reitter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 430



BeitragVerfasst: Sa 04.03.06 23:02 
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

ausblenden 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

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 41

WinXP home + prof, SUSE 9.2
Delphi 6
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 430



BeitragVerfasst: 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
ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Sa 04.03.06 23:55 
Moin!

Schau mal hier, 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

_________________
There are 10 types of people - those who understand binary and those who don´t.
reichemi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 41

WinXP home + prof, SUSE 9.2
Delphi 6
BeitragVerfasst: 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:

ausblenden volle Höhe 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


Zuletzt bearbeitet von reichemi am So 05.03.06 01:34, insgesamt 1-mal bearbeitet
NeoInDerMATRIX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 245

Win95, Win98(+se), WinNT, Win2000, WinME, WinXP(+pro), VISTA, Linux(SuSe), DOS [MultiMon(3)], Vista
D6 PeE + (FP 2.0l) + D3 Pe + D2005+ D2006 Arch
BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 268

XP
BDS 2006 Prof
BeitragVerfasst: So 05.03.06 09:28 
letzteres würde ich dir auch empfehlen
Philipp_Reitter Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 430



BeitragVerfasst: 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...

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 41

WinXP home + prof, SUSE 9.2
Delphi 6
BeitragVerfasst: 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:

ausblenden volle Höhe 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 430



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 41

WinXP home + prof, SUSE 9.2
Delphi 6
BeitragVerfasst: 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:

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 430



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 41

WinXP home + prof, SUSE 9.2
Delphi 6
BeitragVerfasst: 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?:

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 430



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 41

WinXP home + prof, SUSE 9.2
Delphi 6
BeitragVerfasst: 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.....


ausblenden Delphi-Quelltext
1:
listbox1.items.add('neuer benutzer');					


meinst du das? :roll:
Philipp_Reitter Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 430



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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

_________________
There are 10 types of people - those who understand binary and those who don´t.
Philipp_Reitter Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 430



BeitragVerfasst: 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

ausblenden Delphi-Quelltext
1:
if name <> 'deleted user' then begin...