![]() |
also es geht um ein irc client, bei dem raw event "#chan +mode nick"(acontent) nehm ich den mode(um zu sehen welcher mode es ist, z.B wie hier "+a") und den nick(für die listbox) raus
Es gibt 2 Stringlists, in dem einen sind die Admins, indem anderen die regulären Nicks. (btw: ich benutze 2 stringlists, weil wenn ich nur die listbox nehmen würde und auf sorted = true, wärendie nicks zwar nach alphabet geordnet, aber nicht nach admins dann reg nicks) Sagen wir mal ich setze irgendeinen Nick "+a" dann muss ich ja den Nick auf den sich das +a bezieht aus der Stringlist(sl2(reguläre Nicks)) entfernen, in die andere Stringlist(sl1(admins)) hinzufügen. Dann lösche ich die Listbox und füge erst die Strings aus Stringlist1 zur Listbox hinzu, dann aus Stringlist2. Das gleiche für -a weisst wie ich das meine? wenns einen leichteren weg gibt bitte sagen :) danke für die antwort janjan |
Dein Fehler müsste da liegen:
Delphi-Quellcode:
Du willst doch die Position von Nick in sl1 oder sl2 wissen und nicht in Listbox1.
for Counter := 0 to listbox1.Items.IndexOf(Nick) do
Ich hätte das ohne Schleife gelöst (bin mir aber nicht sicher ob das so klappt):
Delphi-Quellcode:
procedure TForm1.IdIRC1Raw(Sender: TObject; AUser: TIdIRCUser; ACommand,
AContent: String; var Suppress: Boolean); var Mode, Nick: string; Counter: integer; bmp: TBitmap; begin Mode := Copy(acontent, 14, 2); // Nick aus "acontent" auslesen Nick := Copy(acontent, LastDelimiter(' ' , acontent)+1, length(acontent)); // Mode aus "acontent" auslesen if Mode = '+a' then // Wenn mode "+a" ist begin sl2.Delete(s12.Items.IndexOf(Nick)); sl1.AddObject(Nick, image10.Picture.Bitmap); ListBox1.Clear; listbox1.Items.AddStrings(sl1); listbox1.Items.AddStrings(sl2); end; if Mode = '-a' then // Wenn mode "-a" ist begin sl1.Delete(s11.Items.IndexOf(Nick)); sl2.AddObject(Nick, image10.Picture.Bitmap); ListBox1.Clear; listbox1.Items.AddStrings(sl1); listbox1.Items.AddStrings(sl2); end; end; |
der code funzt soweit, aber beim "deAdminen" passiert nichts, also der string bleibt in der listbox, das prob hat ich auch mit meinem "code"
wieso wird das nicht gelöscht? gruss =) btw: thx für den code |
Kuck mal welcher Wert in der Titelleiste für s11.Items.IndexOf(Nick) und für Nick steht. Ich vermute mal das es da Probleme gibt. (Form1 musste noch an dein Formnamen anpassen)
Delphi-Quellcode:
if Mode = '-a' then // Wenn mode "-a" ist begin Form1.Caption:='Nick: '+Nick+' Index of Nick: '+inttostr(s11.Items.IndexOf(Nick)); sl1.Delete(s11.Items.IndexOf(Nick)); sl2.AddObject(Nick, image10.Picture.Bitmap); ListBox1.Clear; listbox1.Items.AddStrings(sl1); listbox1.Items.AddStrings(sl2); end; |
hab das ins memo einfügen lassen, da ich keine titelleiste hab und da kam:
"Nick: tsc_user Index of Nick: 1" ^^^^ ist das richtig? ;) gruss mario |
Komisch, das sollte eigentlich richtig sein. Ich mach jetzt Feierabend und kuck mir das nachher nochmal an...
|
also so:
Delphi-Quellcode:
funktionierts jetzt :)
procedure TForm1.IdIRC1Raw(Sender: TObject; AUser: TIdIRCUser; ACommand,
AContent: String; var Suppress: Boolean); var Mode, Nick: string; counter: integer; begin Mode := Copy(acontent, 14, 2); // Nick aus "acontent" auslesen Nick := Copy(acontent, LastDelimiter(' ' , acontent)+1, length(acontent)); // Mode aus "acontent" auslesen if Mode = '+a' then // Wenn mode "+a" ist begin sl2.Delete(sl2.IndexOf(Nick)); sl1.AddObject(Nick, image10.Picture.Bitmap); ListBox1.Clear; listbox1.Items.AddStrings(sl1); listbox1.Items.AddStrings(sl2); end; if Mode = '-a' then // Wenn mode "-a" ist begin for Counter := 0 to sl1.Count-1 do begin if sl1.Strings[Counter] = Nick then begin sl1.Delete(Counter); sl2.AddObject(Nick, image11.Picture.Bitmap); Listbox1.Clear; Listbox1.Items.AddStrings(sl1); Listbox1.Items.AddStrings(sl2); end; end; end; end; danke an alle ;) |
allerdings wenn ich das für das OnPart event nehme...
Delphi-Quellcode:
steht da immer wenn ein regulärer nick(sl2) leavt "ListenIndex überschreitet das Maximum(1)" << was heisst das?
procedure TForm1.IdIRC1Part(Sender: TObject; AUser: TIdIRCUser;
AChannel: TIdIRCChannel); var Counter: integer; begin for Counter := 0 to sl1.Count-1 do begin if sl1.Strings[Counter] = auser.Nick then begin sl1.Delete(Counter); Listbox1.Clear; if sl1.Count > 0 then begin Listbox1.Items.AddStrings(sl1); end; if sl2.Count > 0 then begin Listbox1.Items.AddStrings(sl2); end; end; end; for Counter := 0 to sl2.Count-1 do begin if sl2.Strings[Counter] = auser.Nick then begin sl2.Delete(Counter); Listbox1.Clear; if sl1.Count > 0 then begin Listbox1.Items.AddStrings(sl1); end; if sl2.Count > 0 then begin Listbox1.Items.AddStrings(sl2); end; end; end; end; gruss mario |
Du müsstest die Suche mit einer while Schleife machen, nicht mit einer for Schleife. Angenommen deine Liste enthält 6 Einträge, dann läuft die Schleife von 0 bis 5. Wenn du jetzt einen Eintrag löschst und dann versuchst auf eintrag Nummer 5 zuzugreifen, dann überschreitest du das Maximum der Liste.
Oder probiers mal so (mir ist immer noch nicht so ganz klar warum du alles in eine Schleife setzt, das ListBox1.Clear und den Rest musst du nur einmal machen):
Delphi-Quellcode:
(alle Vorschläge wie immer ohne Gewähr auf völlige Richtigkeit)
procedure TForm1.IdIRC1Part(Sender: TObject; AUser: TIdIRCUser;
AChannel: TIdIRCChannel); var Counter: integer; Gefunden: Boolean; begin Gefunden:=False; for Counter := 0 to sl1.Count-1 do if sl1.Strings[Counter] = auser.Nick then begin Gefunden:=True; break; end; if Gefunden then begin sl1.Delete(Counter); Listbox1.Clear; if sl1.Count > 0 then Listbox1.Items.AddStrings(sl1); if sl2.Count > 0 then Listbox1.Items.AddStrings(sl2); end; // if Gefunden Gefunden:=False; for Counter := 0 to sl2.Count-1 do if sl2.Strings[Counter] = auser.Nick then begin Gefunden:=True; break end; If Gefunden then begin sl2.Delete(Counter); Listbox1.Clear; if sl1.Count > 0 then Listbox1.Items.AddStrings(sl1); if sl2.Count > 0 then Listbox1.Items.AddStrings(sl2); end; // if Gefunden end; |
hoi, danke danke jetzt klappt das alles :)
könntest du mir noch sagen wie das mit der booleschen variable genau funzt(nur um zu verstehen wie es geht)...z.b bei:
Delphi-Quellcode:
ich hätte (wenn ich keine hilfe gehabt hätte, so geschrieben "if Gefunden = true then" wie funzt das da genau?
if Gefunden then
gruss mario :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz