![]() |
Alle Wörter aus einem String in eine Listbox
moin,
"ufc_user = #tiberiansun :ufc_user @silent @nick32 @nick4 @nick" wie könnt ich alle nicks nach dem ":" in eine listbox packen? es können beliebig viele nicks sein und beliebig lang |
Wie das geht? Mit der Holzhammermethode. :wall: Mit Strings mache ich immer kurzen Prozeß. :mrgreen: Ist sichergestellt, daß ein : vorhanden ist geht das ungefähr so :
Code:
Ist aber nicht getestet und muß eventuell noch verfeinert werden! Auf diesem Wege sollte es aber gehen.
repeat
delete (st,1,1) until st[1] = ':', // jetzt nur noch Nicknamen delete (st,1,); // auch : löschen repeat ListBox.Items.Add (copy (st,1,pos (' ',st)); // Nick in Box while st [1] <> ' ' do // Nick aus st löschen delete (st,1,1) delete (st,1,1); // führendes Leerzeichen löschen until st =''; |
danke das probier ich mal ;)
gruss mario |
hm hab das versucht:
Delphi-Quellcode:
aber irgendwie passiert gar nichts und das ganze programm ist wie "abgestürzt", also nichts reagiert mehr
procedure TForm1.IdIRC1Raw(Sender: TObject; AUser: TIdIRCUser; ACommand,
AContent: String; var Suppress: Boolean); var s, zeichen, nick: string; begin s := acontent; repeat delete(s, 1, 1) until s[1] = ':'; delete(s, 1, 1); repeat zeichen := Copy(s, 1, 1); nick := nick + zeichen; while s[1] <> ' ' do delete(s, 1, 1); until s = ' '; end; woran liegt das? gruss mario |
Änder mal
Delphi-Quellcode:
in
until s = ' ';
Delphi-Quellcode:
until s = '';
|
Endlosschleife, hab mir das schon gedacht. Solche Sachen aus dem Kopf heraus aufs Papier zu bringen, ohne Fehler geht meistens schief. :mrgreen: Tippe auf die zweite REPEAT. Das Wort Debugger schon mal gehört, oder ShowMessage :?: :?: Muß leider weg.....
|
hab nurn geändert, sieht so aus:
Delphi-Quellcode:
funzt aber noch immer nicht das prog friert ein
procedure TForm1.IdIRC1Raw(Sender: TObject; AUser: TIdIRCUser; ACommand,
AContent: String; var Suppress: Boolean); var s, zeichen, nick: string; begin s := acontent; repeat delete(s, 1, 1) until s[1] = ':'; delete(s, 1, 1); repeat zeichen := Copy(s, 1, 1); nick := nick + zeichen; while s[1] <> ' ' do delete(s, 1, 1); until s = ''; end; es liegt 100% an dem code, weil wenn ich den lösche klappts ist doch alles richtig oder nicht? gruss silent |
Aha, Dein Quelltext nähert sich zumindest meinem an.
Zitat:
Zitat:
|
keine ahnung wieso das falsch ist.
ich hatte 3 strings variablen deklariert, eine(zeichen) die das zeichen enthält das kopiert wird, eine(nick) die jedes einzelne zeichen von "zeichen" aufnimmt und eine(s) die den ganzen string enthält... aber was ist falsch dran? hatte das ein wenig umgeändert weil dein bespiel bei mir nicht klappte :( kannst du mir sagen was falsch war(ist)? gruss mario |
Code:
1. Repeat und While Schleifen zu mischen macht alles von der Logik her schwerer verständlich.
repeat
zeichen := Copy(s, 1, 1); nick := nick + zeichen; while s[1] <> ' ' do delete(s, 1, 1); until s = ''; 2. Was macht deine Variable Zeichen :?: Die ist lokal deklariert und wird nicht benutzt. Doch, sie wird ja doch benutzt, aber Dein Nick nicht. Ja, das meinte ich mit schwer verständlich. Da sieht man mal wie man mit 3 Variablen und 2 Schleifen in die Irre geleitet wird. Deshalb heute nicht mehr. :duck: Nur noch soviel: Wegen der Lesbarkeit verwende ich auch lieber mehr Variablen als weniger, aber dieses Bsp. ist ein klassischer Fall wie mans nicht machen sollte (meiner Meinung nach). TIP: Übernehme mein Beispiel 1:1 und setze innerhalb der Repeat und While Schleifen direkt unter das delete (st,1,1) ein
Code:
Bei mir ist noch ein Fehler, aber der ist schnell gefunden, hoffentlich aber von Dir.
ShowMessage
Die While Schleife würde dann so aussehen:
Code:
Dann siehst Du genau was passiert. Auch die ** machen einen Sinn, zumindest wenn man mit Lerzeichen hantiert.
while s[1] <> ' ' do begin
delete(s, 1, 1); showmessage ('*'+st+'*'); end; |
Zitat:
ich teste dein code nochmal danke für die hilfe ;) gruss mario |
Dann lass Dir den Nick noch vor dem letzten
Code:
anzeigen :!: Im Moment wirst Du aber da wahrscheinlich gar nicht erst ankommen. Offensichtlich stimmt die Ende-Bedingung meiner Schleifen nicht. Und Tschüß.......
end;
|
ich verstehs einfach nicht, bei:
Delphi-Quellcode:
kommt immer n fehler "zugriffsverletzung auf 3523423" oder so
procedure TForm1.IdIRC1Raw(Sender: TObject; AUser: TIdIRCUser; ACommand,
AContent: String; var Suppress: Boolean); var s: string; begin SlAdmin := TStringList.Create; s := acontent; if acommand = '353' then begin Repeat Delete(s, 1, 1); Until s[1] = ':'; Delete(s, 1, 1); Repeat while s[1] <> ' ' do Delete(s, 1, 1); Delete(s, 1, 1); if s[1] = '!' then begin SlAdmin.AddObject(Copy(s, 1, Pos(' ', s)), image13.Picture.Bitmap); Delete(s, 1, 1); end; until s = ''; end; end; ist doch alles soweit richtig oder? gruss mario |
Dein Quelltext ist mir zu kompliziert. Damit käme ich nicht weiter. So geht das jetzt, sogar getestet. Mensch, habe mich bestimmt 5mal vertippt bei dem ersten Beispiel, sagt zumindets Delphi.
Code:
Lass sowas mal laufen, dann wirst Du merken, daß am Schluß was nicht stimmt. Bei st muß noch ein Zeichen manipuliert werden. Welches :?: Auf diese Spur bringt Dich der Compiler. :mrgreen:
procedure TForm1.Button1Click(Sender: TObject);
VAR st : string; begin st := 'ufc_user = #tiberiansun :ufc_user @nick1 @nick2 @nick3 @nick4'; repeat delete (st,1,1) until st[1] = ':'; // jetzt nur noch Nicknamen delete (st,1,1); // auch : löschen repeat ListBox1.Items.Add (copy (st,1,pos (' ',st)-1)); // Nick in Box WHILE (st [1] <> ' ') DO delete (st,1,1); delete (st,1,1); showmessage (st); until st =''; end; P.S.: ich meine das st am Anfang, nicht, daß Du an den anderen was rumfummelst :!: |
funzt, danke schön :)
gruss mario |
Zitat:
|
hatte den code extra nicht gepostet, da er unordentlich aussieht und sicher auch zu lang (kürzer krieg ichs halt nicht hin.
Delphi-Quellcode:
dein code ist da mit drin(sonst würds wohl noch nicht funzen *g*)
procedure TForm1.IdIRC1Raw(Sender: TObject; AUser: TIdIRCUser; ACommand,
AContent: String; var Suppress: Boolean); var s, s2: string; begin SlAdmin := TStringList.Create; SlOp := TStringList.Create; SlHop := TStringList.Create; SlVoice := TStringList.Create; SlReg := TStringList.Create; SlAdmin.Sorted := true; SlOp.Sorted := true; SlHop.Sorted := true; SlVoice.Sorted := true; SlReg.Sorted := true; s := acontent; if acommand = '353' then begin Repeat Delete(s, 1, 1); Until s[1] = ':'; Delete(s, 1, 1); Repeat if s[1] = '!' then begin Delete(s, 1, 1); SlAdmin.AddObject(Copy(s, 1, Pos(' ', s)), image13.Picture.Bitmap); i := i + 1; label1.Caption := 'Zur Zeit aktive Benutzer: ' + IntToStr(i); end else if s[1] = '@' then begin Delete(s, 1, 1); SlOp.AddObject(Copy(s, 1, Pos(' ', s)), image12.Picture.Bitmap); i := i + 1; label1.Caption := 'Zur Zeit aktive Benutzer: ' + IntToStr(i); end else if s[1] = '%' then begin Delete(s, 1, 1); SlHop.AddObject(Copy(s, 1, Pos(' ', s)), image14.Picture.Bitmap); i := i + 1; label1.Caption := 'Zur Zeit aktive Benutzer: ' + IntToStr(i); end else if s[1] = '+' then begin Delete(s, 1, 1); SlVoice.AddObject(Copy(s, 1, Pos(' ', s)), image15.Picture.Bitmap); i := i + 1; label1.Caption := 'Zur Zeit aktive Benutzer: ' + IntToStr(i); end else if (s[1] <> '!') OR (s[1] <> '@') OR (s[1] <> '%') OR (s[1] <> '+') then begin SlReg.AddObject(Copy(s, 1, Pos(' ', s)), image16.Picture.Bitmap); i := i + 1; label1.Caption := 'Zur Zeit aktive Benutzer: ' + IntToStr(i); end; while s[1] <> ' ' do Delete(s, 1, 1); Delete(s, 1, 1); until s = ''; listbox1.Items.AddStrings(SlAdmin); listbox1.Items.AddStrings(SlOp); listbox1.Items.AddStrings(SlHop); listbox1.Items.AddStrings(SlVoice); listbox1.Items.AddStrings(SlReg); end; end; musste ihn nur bisschen verlängern für das ganze Op admin hop voice zeug :\ ...jo ich weiss "wozu die stringslists", da ich die nicks nach bildern ordne und nicht nach alphabet ging das leider nicht anders(oder doch?) :) nochmals danke ^^ gruss mario |
ich glaub ich schaffe das nie sonen dummen chat (und denn noch mit den indy komponenten) fertig zu bekommen :(
Delphi-Quellcode:
^^^^^^^^^^^^^^ das ist allein um bei "OnNames" die Nicks aus dem String "= #chan :nick nick2 nick3"(usw) auszulesen und sie in die Stringlists Sladmin, Slop usw einzufügen und von da aus in die Listbox.
procedure TForm1.IdIRC1Raw(Sender: TObject; AUser: TIdIRCUser; ACommand,
AContent: String; var Suppress: Boolean); var s, nick: string; i: integer; begin SlAdmin := TStringList.Create; SlOp := TStringList.Create; SlHop := TStringList.Create; SlVoice := TStringList.Create; SlReg := TStringList.Create; SlAdmin.Sorted := true; SlOp.Sorted := true; SlHop.Sorted := true; SlVoice.Sorted := true; SlReg.Sorted := true; s := acontent; if acommand = '353' then begin Repeat Delete(s, 1, 1); Until s[1] = ':'; Delete(s, 1, 1); Repeat if s[1] = '!' then begin Delete(s, 1, 1); SlAdmin.AddObject(Copy(s, 1, Pos(' ', s)), image13.Picture.Bitmap); i := i + 1; label1.Caption := 'Zur Zeit aktive Benutzer: ' + IntToStr(i); end else if s[1] = '@' then begin Delete(s, 1, 1); SlOp.AddObject(Copy(s, 1, Pos(' ', s)), image12.Picture.Bitmap); i := i + 1; label1.Caption := 'Zur Zeit aktive Benutzer: ' + IntToStr(i); end else if s[1] = '%' then begin Delete(s, 1, 1); SlHop.AddObject(Copy(s, 1, Pos(' ', s)), image14.Picture.Bitmap); i := i + 1; label1.Caption := 'Zur Zeit aktive Benutzer: ' + IntToStr(i); end else if s[1] = '+' then begin Delete(s, 1, 1); SlVoice.AddObject(Copy(s, 1, Pos(' ', s)), image15.Picture.Bitmap); i := i + 1; label1.Caption := 'Zur Zeit aktive Benutzer: ' + IntToStr(i); end else if (s[1] <> '!') OR (s[1] <> '@') OR (s[1] <> '%') OR (s[1] <> '+') then begin SlReg.AddObject(Copy(s, 1, Pos(' ', s)), image16.Picture.Bitmap); i := i + 1; label1.Caption := 'Zur Zeit aktive Benutzer: ' + IntToStr(i); end; while s[1] <> ' ' do Delete(s, 1, 1); Delete(s, 1, 1); until s = ''; listbox1.Items.AddStrings(SlAdmin); listbox1.Items.AddStrings(SlOp); listbox1.Items.AddStrings(SlHop); listbox1.Items.AddStrings(SlVoice); listbox1.Items.AddStrings(SlReg); end; // BIS HIER HIN AUF DAS "ONNAMES" EREIGNIS if Copy(s, 14, 2) = '+a' then begin nick := s; delete(nick, 1, 16); SlAdmin.AddObject(nick, image13.Picture.Bitmap); for i := 0 to SlOP.IndexOf(nick) do begin if SlOp.IndexOf(nick) > 0 then SlOP.Delete(i); end; for i := 0 to SlHop.IndexOf(nick) do begin if SlOp.IndexOf(nick) > 0 then SlHop.Delete(i); end; for i := 0 to SlVoice.IndexOf(nick) do begin if SlOp.IndexOf(nick) > 0 then SlVoice.Delete(i); end; for i := 0 to SlOP.IndexOf(nick) do begin if SlReg.IndexOf(nick) > 0 then SlReg.Delete(i); end; listbox1.Clear; listbox1.Items.AddStrings(SlAdmin); listbox1.Items.AddStrings(SlOp); listbox1.Items.AddStrings(SlHop); listbox1.Items.AddStrings(SlVoice); listbox1.Items.AddStrings(SlReg); end; // BIS HIER HIN AUF DAS "+a" EREIGNIS end; end; ich meine das muss doch auch kürzer gehn für sone kleinigkeit.. gibts nicht irgendwie ne andere lösung? weil dadurch das es soviel ist (da unter soll noch code folgen) komm ich mit dem ganzen nichtmehr klar. der code der auf das +a reagieren soll funzt z.b nicht richtig. für jede hilfe dankbar gruss mario |
Das ist viel zu viel, für einen Fehler zu finden. Du mußt das Problem reduzieren und eingrenzen. Ich hab Dir doch gesagt, daß mein Beispeil geht, allerdings nur, sofern mit dem st noch etwas passiert :!:
Code:
@nick4 ist etwas anders als die anderen drei ! Auch nützt es nix, wenn Du schreist: "Mama, mein Programm geht nicht!" :mrgreen: Wo geht was micht ?st := 'ufc_user = #tiberiansun :ufc_user @nick1 @nick2 @nick3 @nick4'; |
Also ich hatte mir das so vorgestellt, das ich bei dem Ereignis "OnRAW"(353(/names)), aus dem String "silent = #tiberiansun :!silent @Benny @Stoja @oXyGeN %sysop %stalin +NewbiLike" die nicks auslese, also alles nach dem ":". Die Nicks mit dem "!" vor dem Nick kommen in die Stringlist "SlAdmin", die mit "@" in die "SlOP"...das gleiche mit hop voice und regulären nicks. Danach kommen die Stringlists in die Listbox, erst admins dann ops dann hops dann voice dann reg.
btw: das erste zeichen jedes nicks muss weg, also der prefix, da ich ein bild stattdessen nehme ^^^^ das ist allein fürs chan joinen (also onnames) Sagen wir mal jemand setzt den mode "+a", dann muss ich in dem String "#tiberiansun +a silent" gucken obs auch "+a" ist (kann ja auch +o -a etc sein), und schlisslich muss ich das letzte Wort(den nick) rausnehmen, ihn in die Stringlist "SlAdmin" packen und die anderen Stringlists "SlOP, SlHop, SlVoice, SlReg" überprüfen in welcher Stringlist der nick vor dem +a war und ihn daraus löschen. Wenn ich das hab Lösch ich die Listbox1 und füge wieder alle Stringlists in die Listbox1. ist bisschen viel oder? :( gruss mario |
Zitat:
Code:
Verdammt nochmal, mach in meinem Bsp. ans Ende des Strings noch ein Leerzeichen, und guck, daß Du die Box gefüllt kriegst. :wink: Vorher wird das sonst nie was.
CASE prefix OF
'@' : showmessage ('S|OP'); ... END; P.S.: Hab mir nochmal Deinen Quelltext angesehen.
Code:
ist genau das, was ich gerade mit Case gemeint habe. Lese Dir mal durch, wie das genau geht. Kann es sein, daß Du vorher mal Basic gemacht hast ?
if then else if then else if then else...
|
jo visual basic 6 einsteiger edition *g*
das problem ist, das ich nie mit case anweisungen gearbeitet hab und nicht weiss wie sie funktionieren gruss mario :) |
Dein Programmierstil hat Dich entlarvt. :mrgreen: Sowas sagt man aber vorher und läßt sich nicht erst erwischen. :lol: In der Hilfe steht ein Beispiel, bei mir allerdings in Englisch. Kannst Du das nicht, die Code-Beispiele sind trotzdem ziemlich eindeutig.
|
ja hätt ichw ohl zugeben solln, aber dann würd ich hier zum tod verurteilt werden <g>
btw: hab die caseanweisungen in der delphi hilfe gelesen, ich weiss nur nicht genau was sie bringen :oops: gruss mario |
Zitat:
|
meine bücher? O_o
|
hab das nochmal geändert
Delphi-Quellcode:
also erst lösch ich alles bis zum ":", dann das ":" selbst dann will ich prüfen ob das 1 zeichen des wortes ein "!" ist, wenn ja dann will ich den nickin die stringlist SlAdmin tun...und dann die striglist in die listbox....stürzt aber ab, ist das ne endlosschleife?
procedure TForm1.IdIRC1Raw(Sender: TObject; AUser: TIdIRCUser; ACommand,
AContent: String; var Suppress: Boolean); var s: string; begin s := acontent; if acommand = '353' then begin Repeat Delete(s, 1, 1); until s[1] = ':'; delete(s, 1, 1); Repeat if s[1] = '!' then begin SlAdmin.AddObject(Copy(s, 1, Pos(' ', s)), image13.Picture.Bitmap); while s[1] <> ' ' do delete(s, 1, 1); delete(s, 1, 1); end; until s = ''; listbox1.Items.AddStrings(SlAdmin); end; end; Das ist für das "!". Ich müsste das ganze auch mit "@" "%" "+" und wenn kein prefix vo dem nick ist machen gruss silent |
Delphi-Quellcode:
Repeat // <-- ab hier wirds kritisch
if s[1] = '!' then <------------------- Endlosschleife begin SlAdmin.AddObject(Copy(s, 1, Pos(' ', s)), image13.Picture.Bitmap); while s[1] <> ' ' do delete(s, 1, 1); delete(s, 1, 1); end; until s = ''; listbox1.Items.AddStrings(SlAdmin); end; end; Zitat:
Zitat:
Nur : was passiert denn, wenn st[1] <> '!', wird die Repeat Schleife dann jemals beendet :?: |
dachte eigtnlich schon das sie beendet wird, da "delete(s, 1, 1);
" doch das "!" löscht und beim nächsten durchgang das "if s[1] = '!' then" doch nichtmehr zutrifft oder? |
Delphi-Quellcode:
s[1] wird bis zum Tod Deines Rechners wohl oder übel 'H' sein.
s := 'HÄ?'
Repeat if s[1] = '!' begin ... end; until s = ''; |
aber ich lösche doch innerhalb der schleife das erste zeichen von s oder?
Zitat:
:| |
Code:
Aber nur, wenn das erste Zeichen ein '!'. Uff, Gott sei Dank bin ich von Basic verschont geblieben. :spin:
Repeat
if s[1] = '!' begin |
kann ich das ganze auch ohne case anweisungen machen? ich weiss nicht wie ich das sonst machen kann :cry:
|
so funzt es nun:
Delphi-Quellcode:
procedure TForm1.IdIRC1Raw(Sender: TObject; AUser: TIdIRCUser; ACommand,
AContent: String; var Suppress: Boolean); var s: string; begin SlsCreenab; s := acontent; if acommand = '353' then begin Repeat Delete(s, 1, 1); until s[1] = ':'; delete(s, 1, 1); Repeat if s[1] = '!' then begin delete(s, 1, 1); SlAdmin.AddObject(Copy(s, 1, Pos(' ', s)), image13.Picture.Bitmap); end else if s[1] = '@' then begin delete(s, 1, 1); SlOp.AddObject(Copy(s, 1, Pos(' ', s)), image12.Picture.Bitmap); end else if s[1] = '%' then begin delete(s, 1, 1); SlHop.AddObject(Copy(s, 1, Pos(' ', s)), image14.Picture.Bitmap); end else if s[1] = '+' then begin delete(s, 1, 1); SlVoice.AddObject(Copy(s, 1, Pos(' ', s)), image15.Picture.Bitmap); end else if (s[1] <> '!') OR (s[1] <> '@') OR (s[1] <> '%') OR (s[1] <> '+') then begin SlReg.AddObject(Copy(s, 1, Pos(' ', s)), image16.Picture.Bitmap); end; while s[1] <> ' ' do delete(s, 1, 1); delete(s, 1, 1); until s = ''; listbox1.Items.AddStrings(SlAdmin); listbox1.Items.AddStrings(SlOp); listbox1.Items.AddStrings(SlHop); listbox1.Items.AddStrings(SlVoice); listbox1.Items.AddStrings(SlReg); end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:18 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