![]() |
Substring Problem
Also mein Problem ist folgendes:
Ich wollte eine kleine IRC Applikation schreiben, doch leider ist in INDY 10 ja die Komponente nicht wirklich fertig, daher musst ich mir eine eigene Prozedure schreiben die eine Liste der Nicks erstellt. Dies ist der momentane Code:
Delphi-Quellcode:
Jetzt ist es so in der Raw Message sieht das so aus:
procedure Tform2.list;
var i1, i2: Integer; s: String; begin i1 := Pos('355', Memo2.Lines.Text); i2 := Pos('366', Memo2.Lines.Text); inc(i1, 3); inc(i2, -3); s := Copy(Memo2.Lines.Text, i1, (i1-i2)); showmessage(s); //bla bla end;
Delphi-Quellcode:
Deswegen wollte ich den Teil zwischen den Zahlen kopieren, und dann den vorderen Teil löschen, um es anschließend auf eine Listbox zu übertragen.
353 Testnick = #Königlich-Preußisches-Inf.Reg :Testnick ~PhilmacFLy
366 Testnick #Königlich-Preußisches-Inf.Reg :End of /NAMES list. Leider wird schon in der showmessage nix angezeigt. Leider hab ich im Moment keine Ahnung woran es liegt. |
Re: Substring Problem
Versuch es mal mit (i2 - i1)
|
Re: Substring Problem
Zitat:
|
Re: Substring Problem
erstmal 355 <> 353
und das mit i2-i1 wurde ja schon gesagt |
Re: Substring Problem
Jetzt wird mir die komplette Raw message angezeigt.
@DeddyH: Ganz am schluss sollen nur die Nicks in die Listbox. Im moment will ich damit nur bezwecken dass: Testnick = #Königlich-Preußisches-Inf.Reg :Testnick ~PhilmacFLy Stehen bleibt. Und ja da is ein Zeilen Umbruch drinne, |
Re: Substring Problem
Zitat:
Btw Was willst due den geanu extrahieren? |
Re: Substring Problem
Genau will ich nur die nicks also:
Testnick ~PhilmacFLy |
Re: Substring Problem
Und die Zeilen sehen immer so aus?
|
Re: Substring Problem
immer, bis auf das da halt noch mehr nicks hin kommen können.
|
Re: Substring Problem
Handelt es sich hier um 1 oder 2 Nicks? Wenn einer, belegt der dann immer 2 Zeilen?
|
Re: Substring Problem
Selbst wenn es mehere Nicks sind ist es immer Nur diese Zeile:
353 Testnick = #Königlich-Preußisches-Inf.Reg :Testnick ~PhilmacFLy Nein es sind nicht immer nur 2 Nicks das können so viele sein wie sie wollen, soviel Leute wie halt im IRC channel sind. |
Re: Substring Problem
Warum suchst du nicht nach der Tilde? Danach steht doch der Nick.
|
Re: Substring Problem
hmm ich verstehe es so das es z.b. bei 2 Leuten so aussieht
Delphi-Quellcode:
So oder wie sieht das dan aus????
353 Testnick = #Königlich-Preußisches-Inf.Reg :Testnick ~PhilmacFLy
353 Testnick = #Königlich-Preußisches-Inf.Reg :Testnick ~Test2 353 Testnick = #Königlich-Preußisches-Inf.Reg :Testnick ~TheBest 366 Testnick #Königlich-Preußisches-Inf.Reg :End of /NAMES list |
Re: Substring Problem
Zitat:
353 Testnick = #Königlich-Preußisches-Inf.Reg :Testnick ~PhilmacFLy Nick 1 = Testnick Nick 2 = ~PhilmacFly Eigentlich muss er also nur hingehen und die Zeile mit dem 353 auswerten. Alle Nicknames stehen nach dem Doppelpunkt, und sind jeweilis durch ein Leerzeichen getrennt. Pos dürfte hier gute Dienste erweisen. Zumindest würde ich das so interpretieren! Es kann natürlich sein, dass die Nicks noch auf mehrere Zeile aufgeteilt werden, ich kenne das IRC Protokoll leider nicht. |
Re: Substring Problem
wie angos schon sagte das sind schon zwei nicks, weil Testnick auch ein nick ist. Desweiteren steht die tilde nur für ein Recht des Jeweiligen, in diesem fall Owner.
Desweiteren stehen die Nicks immer nur in einer Zeile, egal wie viele das sind. Mine Prolbme ist nur, wie du gesehen hast, angos, das ich das schon probiert hab aber nicht hinbekommen hab. |
Re: Substring Problem
also falls ich das jetzt nicht falsch verstanden hab ...
- erste Zeile auslesen - nach einem Trenner suchen (der : sieht doch gut aus?) - alles vor dem Trenner entfernen - und nun enfach nur noch anhand der Leerzeichen die Nicks auftreilen |
Re: Substring Problem
der erste punkt war ja das, was ich mit meinem code versucht hatte.
|
Re: Substring Problem
Hi,
nicht getestet, sollte aber mit den entsprechenden Deklarationen funktionieren.
Delphi-Quellcode:
Gruß
for i := 0 to Memo2.Lines.Count do
begin if Copy(Memo2.Lines[i], 1, 3) = '353' then begin sHelp := Copy(Memo2.Lines[i], Pos(':', Memo2.Lines[i]), Length(Memo2.Lines[i]); while pos(' ', sHelp) > 0 do begin Memo3.Lines.Add(Copy(sHelp, 1, Pos(' ', sHelp)); sHelp := Trim(Copy(sHelp, Pos(' ', sHelp)+1, Length(sHelp))); end; break; end; end; angos |
Re: Substring Problem
funktioniert nicht wenn ich das einbau bekomm ich nur =
|
Re: Substring Problem
Okay, ich versuch mich auch mal :D
Also das steht in s: Zitat:
Weil dann könntest du nach den Channelnamen (ist das "#Königlich-Preußisches-Inf.Reg"?) bzw der Raute suchen. Und dann (da imho Channelnamen keine Leerzeichen enthalten) alles bis zum Leerzeichen nach der Raute löschen. Und dann den String aufteilen, solange bis nix mehr da ist oder ein zeilenumbruch kommt (ist das eigentlich ein #13#10 oder #13 oder #10?). Ich werde später ein Beispielcode posten... So mit folgenden Code bestimmst du die Nicks (Ergebnis müsste ":Testnick ~PhilmacFLy" sein):
Delphi-Quellcode:
Als nächstes müsstest du diesen String dann nur noch Anhand der Leerzeichen aufteilen.
ChannelOffset := Pos('#', s);
NickOffset := PosEx(' ', s, ChannelOffset) + 1; LineEnd := // edit: siehe Posting #22 Nicks := Copy(s, NickOffset, LineEnd - NickOffset Also angos hatte da schon eine Implementation. MfG xZise |
Re: Substring Problem
also der : is kein moderator level mehr
|
Re: Substring Problem
Wobei ich frage mich gerade, ob ein Doppelpunkt im Channelnamen erlaubt ist?
Also neue Version! Ergebnis müsste "Testnick ~PhilmacFLy" sein:
Delphi-Quellcode:
Sollte ein Doppelpunkt, aber kein Leerzeichen erlaubt sein, dann kann man meine alte Version verwenden, muss dann aber sttt +1 +2 addieren. Auch könnte man zusätzlich den Suchstring (Z.Zt. noch ' ') in ' :' ändern.
NickOffset := PosEx(':', s, ChannelOffset) + 1;
LineEnd := // s.u. Nicks := Copy(s, NickOffset, LineEnd - NickOffset Achso LineEnd wird falsch berechnet. Und zwar sollte das eigentlich unabhängig voneinander arbeiten. Also sofern du #13 oder #10 findest. Aber wenn er es nicht findet, kommt ja 0 raus, und würde damit als "LineEnd" gewertet werden. Deshalb die verbesserte Version:
Delphi-Quellcode:
Also, wenn kein #13er Zeichen vorkommt, oder es nach dem #10er Zeichen steht, welches Vorkommt, dann nimmt er das #10er Zeichen ansonsten das #13er :D
LineEnd13 := Pos(#13, s);
LineEnd10 := Pos(#10, s); if ((LineEnd13 > LineEnd10) and (LineEnd10 > 0)) or (LineEnd13 = 0) then LineEnd := LineEnd10 else LineEnd := LineEnd13 MfG xZise |
Re: Substring Problem
edit: Phils ist manchmal seeeehr dumm
edit2: Ich bekomm wieder nen leeren string
Delphi-Quellcode:
procedure Tform2.list;
var i, LineEnd13, LineEnd10, LineEnd, Nickoffset, Channeloffset: Integer; str: String; begin ChannelOffset := Pos('#', memo2.Lines.Text); LineEnd13 := Pos(#13, Memo2.Lines.Text); LineEnd10 := Pos(#10, Memo2.Lines.Text); if ((LineEnd13 > LineEnd10) and (LineEnd10 > 0)) or (LineEnd13 = 0) then LineEnd := LineEnd10 else LineEnd := LineEnd13; NickOffset := PosEx(':', Memo2.Lines.Text, ChannelOffset) + 1; str := Copy(Memo2.Lines.Text, NickOffset, LineEnd - NickOffset); showMessage(str); end; |
Re: Substring Problem
Steht in dem Memo genau das aus dem ersten Post? Könntest du mal durchdebuggen und mir mal sagen:
Danke :D Achso der Code ist ungetestet, aber ich wüsste nicht, woran es gerade scheitert. MfG xZise |
Re: Substring Problem
Zu 1:
USER Testnick 0 * :Testnick PING :3DDC5E1 PONG :3DDC5E1 JOIN #Königlich-Preußisches-Inf.Reg 18tes 001 Testnick :Welcome to the GIGA-Chat IRC Network Testnick!Testnick@p5B0944C2.dip.t-dialin.net 002 Testnick :Your host is chat.giga.de, running version Unreal3.2.8.1 003 Testnick :This server was created Sun Jul 12 2009 at 15:10:17 CEST 004 Testnick chat.giga.de Unreal3.2.8.1 iowghraAsORTVSxNCWqBzvdHtGp lvhopsmntikrRcaqOALQbSeIKVfMCuzNTGj 005 Testnick CMDS=KNOCK,MAP,DCCALLOW,USERIP UHNAMES NAMESX SAFELIST HCN MAXCHANNELS=20 CHANLIMIT=#:20 MAXLIST=b:60,e:60,I:60 NICKLEN=30 CHANNELLEN=32 TOPICLEN=307 KICKLEN=307 AWAYLEN=307 :are supported by this server 005 Testnick MAXTARGETS=20 WALLCHOPS WATCH=128 WATCHOPTS=A SILENCE=15 MODES=12 CHANTYPES=# PREFIX=(qaohv)~&@%+ CHANMODES=beI,kfL,lj,psmntirRcOAQKVCuzNSMTG NETWORK=GIGA-Chat CASEMAPPING=ascii EXTBAN=~,cqnr ELIST=MNUCT :are supported by this server 005 Testnick STATUSMSG=~&@%+ EXCEPTS INVEX :are supported by this server 251 Testnick :There are 15 users and 41 invisible on 2 servers 252 Testnick 11 :operator(s) online 254 Testnick 67 :channels formed 255 Testnick :I have 40 clients and 0 servers 265 Testnick :Current Local Users: 40 Max: 56 266 Testnick :Current Global Users: 56 Max: 334 375 Testnick :- chat.giga.de Message of the Day - 372 Testnick :- 12/7/2009 15:12 372 Testnick :- ____ ___ ____ _ ____ _ _ 372 Testnick :- / ___|_ _/ ___| / \ / ___| |__ __ _| |_ 372 Testnick :- | | _ | | | _ / _ \ _____| | | '_ \ / _` | __| 372 Testnick :- | |_| || | |_| |/ ___ \_____| |___| | | | (_| | |_ 372 Testnick :- \____|___\____/_/ \_\ \____|_| |_|\__,_|\__| 372 Testnick :- 372 Testnick :- Willkommen im GIGA Chat! 372 Testnick :- 372 Testnick :- ### Regeln ### 372 Testnick :- Durch den Verbindungsaufbau mit dem GIGA-Server werden folgende 372 Testnick :- Nutzungsbedigungen verbindlich akzeptiert: 372 Testnick :- 372 Testnick :- Generell verboten sind: 372 Testnick :- * Flood 372 Testnick :- * Spam 372 Testnick :- * Nickflood (Das absichtliche Benutzen extrem langer/nerviger Nicks) 372 Testnick :- * Nickwechselflood 372 Testnick :- * anstössige/abstoßende/rechtsextreme/beleidigende Nicks/Nickfake/”veräppelnde” N 372 Testnick :- icks 372 Testnick :- * Channelhoppen (andauernde Joins/Parts) 372 Testnick :- * Filesharing, Warez, FTP, XDCC, Hacking (Wird mit sofortigem Ban bestraft) 372 Testnick :- * Übertriebenes Fluchen 372 Testnick :- * Wiederholen 372 Testnick :- * Beleidigung, Belästigung, Provokationen, Drohungen, Diskriminierung 372 Testnick :- * Gewaltverherrlichung, Rassismus, Nationalismus 372 Testnick :- * Werbung jeder Art (Channels, IRC Netzwerke, Internetseiten, Diebesspiele…) 372 Testnick :- * Suche nach CS (Cybersex) und TS (Telefonsex) 372 Testnick :- * Pornografie 372 Testnick :- * Proxies 372 Testnick :- 372 Testnick :- * Kommerzielle Nutzung des GIGA-Servers oder dessen Inhalte 372 Testnick :- * Links zu Inhalten die gegen deutsche Gesetze verstoßen oder nicht für 372 Testnick :- Jugendliche geeignet sind. 372 Testnick :- * Das Sich-Ausgeben als GIGA-Mitarbeiter, deren Geschäftspartner oder 372 Testnick :- IRC-Operator 372 Testnick :- * Es besteht grundsaetzlich kein Recht auf die Nutzung des GIGA-Server 372 Testnick :- * GIGA ist es erlaubt den GIGA-Server jederzeit für Wartungsarbeiten und/oder 372 Testnick :- anderen notwendigens Maßnahmen abzuschalten, neu zu starten oder kurzzeitig zu 372 Testnick :- schließen 372 Testnick :- * GIGA und seine IRC-Operatoren ist es erlaubt einzelne User, Hosts und 372 Testnick :- IP-Adressen die Verbindung zum Server zu verbieten oder zu sperren. 372 Testnick :- * Der User kann sich bei der Nutzung des Dienstes Nicknamen oder Channels 372 Testnick :- (Raeume) registrieren. Eigentuemer der registrierten Nicknamen und Channels 372 Testnick :- bleibt GIGA. Der User hat lediglich ein Nutzungsrecht. 372 Testnick :- * GIGA ist es erlaubt Nicknamen und Channels zu verbieten oder zu sperren. 372 Testnick :- * GIGA ist es erlaubt diese Regeln jederzeit anzupassen oder zu ändern. 372 Testnick :- 372 Testnick :- Für die Inhalte und Themen sind die Benutzer selbst verantwortlich! 372 Testnick :- Die Gesetze der Bundesrepublik Deutschland sind zu beachten, z.b. Urheber- 372 Testnick :- rechtsgesetz, §184, §185 StGB, §53, §95, §95b UrhG, usw. Missachtung kann 372 Testnick :- strafrechtliche Verfolgung nach sich ziehen. 372 Testnick :- Computersabotage (§303b StGB; zB. ICMP/UDP Flood, DoS) wird angezeigt! 372 Testnick :- 372 Testnick :- ### Hinweise ### 372 Testnick :- Weder ein GIGA-Mitarbeiter noch ein IRC-Operator werden einen User JEMALS nach 372 Testnick :- Passwörtern fragen. Egal ob für den Chat-Server oder für seinen Account auf der 372 Testnick :- GIGA-Webseite. 372 Testnick :- 372 Testnick :- ### Offizielle Chatraeume ### 372 Testnick :- Offizielle GIGA Räume sind durch den Bot GIGA erkennbar. 372 Testnick :- Weitere Räume: 372 Testnick :- #hilfe (fuer Hilfe zu Problemen mit dem GIGA-Chat) 372 Testnick :- 372 Testnick :- ### IRC-Operatoren (Alphabetisch) ### 372 Testnick :- - brue 372 Testnick :- - coaxspi 372 Testnick :- - jonny 372 Testnick :- 372 Testnick :- ### Kontakt ### 372 Testnick :- Bei Fragen oder Problemen suche bitte zuerst den Raum #hilfe auf. 376 Testnick :End of /MOTD command. MODE Testnick :+iwx 421 Testnick 200 :Unknown command JOIN :#Königlich-Preußisches-Inf.Reg 332 Testnick #Königlich-Preußisches-Inf.Reg : 333 Testnick #Königlich-Preußisches-Inf.Reg ChanServ 1247405756 353 Testnick = #Königlich-Preußisches-Inf.Reg :Testnick ~PhilmacFLy 366 Testnick #Königlich-Preußisches-Inf.Reg :End of /NAMES list. 421 Testnick 200 :Unknown command 421 Testnick 200 :Unknown command 421 Testnick 200 :Unknown command 421 Testnick 200 :Unknown command 421 Testnick 200 :Unknown command zu 2: 80 zu 3 14 zu 4 s.o. zu 5 132 |
Re: Substring Problem
Achso! Ich dachte da steht nur das drin zu den Nicks.
Vorher müsstest du also die Zeile mit "353" am Anfang suchen und dann den obigen Code ausführen:
Delphi-Quellcode:
Und GenerateNicks führt dann "meinen" Code aus, wobei der Übergabeparameter dann durchsucht wird (also die aktuelle Zeile). Außerdem kannst du dir dann das mit LineEnd sparen, da du ja nur eine Zeile hast. Dann ist LineEnd = Length(Memo.Lines[i]) :P
for i := 0 to Memo.Lines.Count - 1 do
if Copy(Memo.Lines[i]) = '353' then GenerateNicks(Memo.Lines[i]); MfG xZise |
Re: Substring Problem
ließ den Text in eine StringList und such die Zeile mit 353 am Anfang
|
Re: Substring Problem
Zitat:
MfG xZise |
Re: Substring Problem
Zitat:
|
Re: Substring Problem
Zitat:
MfG xZise |
Re: Substring Problem
Delphi-Quellcode:
[DCC Fehler] tool_chat.pas(74): E2010 Inkompatible Typen: 'Integer' und 'string'
procedure Tform2.GenerateNicks(Linend: Integer);
var LineEnd, Nickoffset, Channeloffset: Integer; Nicks: string; begin ChannelOffset := Pos('#', Memo2.Lines.Text); NickOffset := PosEx(' ', Memo2.Lines.Text, ChannelOffset) + 1; Nicks := Copy(Memo2.Lines.Text, NickOffset, LineEnd - NickOffset); end; procedure Tform2.list; var str: String; i: Integer; begin for i := 0 to Memo2.Lines.Count - 1 do if Copy(Memo2.Lines[i]) = '353' then //Hier kommt der Fehler GenerateNicks(Memo2.Lines[i]); end; |
Re: Substring Problem
Wie wäre es denn, wenn Du mal in die Hilfe zu Copy() schaust, dann siehst Du selbst, was da falsch ist :?
|
Re: Substring Problem
So hab mal mich um dein Problem gekümmert :coder: und habs hinbekommen xD
Delphi-Quellcode:
Ich hoffe ich konnte dir helfen. Habs sogar getestet bei mir funkts :mrgreen: :mrgreen: :zwinker:
procedure TForm1.GenerateNicks(StrLine: String);
var LineEnd, Nickoffset1,Nickoffset, Channeloffset: Integer; Nicks: string; begin ChannelOffset := Pos(':', StrLine)+1; NickOffset := PosEx(' ', StrLine, ChannelOffset); Nicks := Copy(StrLine, ChannelOffset, Length(StrLine)- ChannelOffset); //Wenn du die einzelnen Namen haben willst Nicks := StringReplace(Nicks,' ',#$D#$A,[rfReplaceAll]); ListBox1.Items.Text := Nicks; end; procedure TForm1.Button1Click(Sender: TObject); var Pos353,PosLineEnd : Integer; begin Pos353 := Pos('353', Memo1.Lines.Text); PosLineEnd := PosEx(#$D#$A,Memo1.Lines.Text,Pos353)-1; GenerateNicks(Copy(Memo1.Lines.Text,Pos353,PosLineEnd-Pos353)); end; end. |
Re: Substring Problem
Zitat:
Das heißt du brauchst "LineEnd" nicht, weil das ja dann Length(<Zeilentext>) ist. MfG xZise |
Re: Substring Problem
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:40 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