![]() |
Befehle erstellen
Hey,
Ich bin schon eine zeit lang am überlegen wie, z.b mIRC oder xchat (oder andere irc clienten) diese befehle erkennen. z.B. "/kick k4ni lalalala" das würde dann den kick befehl erkennen, nach dem ersten leerzeichen den Nicknamen wen es kicken soll und nach dem nächsten leerzeichen den grund. Doch wie hält es diese aussagen auseinander? Wie könnt ich was selber mache, da ich ya zurzeit an einem chat programm arbeite? Ich hab es zurzeit nur etwa so:
Delphi-Quellcode:
Danke :)
if Msg.Text = '/kick '+Nickname then ... .. ..
|
Re: Befehle erstellen
schau dir mal die Funktion
![]() |
Re: Befehle erstellen
du mußt praktisch nur prüfen ob der Text mit dem Befehl beginnt und das nach dem Befehl als Befehlsparameter (z.B. den Namen) ansehn.
if copy(Msg.Text, 1, 6) = '/kick ' then begin name := copy(Msg.Text, 7, ...) ... end |
Re: Befehle erstellen
|
Re: Befehle erstellen
Zitat:
Wenn dann lieber so:
Delphi-Quellcode:
Das mit dem dynamischen Überprüfen solltest du dir zu Gemüte führen... versteht man nicht auf Anhieb :zwinker:
if s[1] = '/' then // Prüfen, ob Befehl!
begin befehl := Copy(s, 2, Pos(' ', s) - 1); //dynamisch den Befehl abfragen if befehl = 'kick' then user := Copy(s, Pos(' ', s) + 1, Length(s)); //wenn Befehl "kick" dann schauen, welchen User end; |
Re: Befehle erstellen
' /kick k4ni' ist aber auch ein Befehl ;)
|
Re: Befehle erstellen
Zitat:
Also sollte das 'k4ni" anzeigen wenn in Msg.Text "/kick k4ni" eingeb, oder nicht?
Delphi-Quellcode:
Tut es aber nicht :(
procedure TForm1.Button1Click(Sender: TObject);
var befehl, user, s: string; begin S := Msg.Text; if s[1] = '/' then // Prüfen, ob Befehl! begin befehl := Copy(s, 2, Pos(' ', s) - 1); //dynamisch den Befehl abfragen if befehl = 'kick' then user := Copy(s, Pos(' ', s) + 1, Length(s)); //wenn Befehl "kick" dann schauen, welchen User end; ShowMessage(user); end; |
Re: Befehle erstellen
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var befehl, user, s: string; const befehlOffset = 2; // erstes zeichen eines befehls begin S := Msg.Text; if s[1] = '/' then // Prüfen, ob Befehl! begin befehl := Copy(s, befehlOffset, Pos(' ', s) - befehlOffset); //dynamisch den Befehl abfragen if befehl = 'kick' then user := Copy(s, Pos(' ', s) + 1, Length(s)); //wenn Befehl "kick" dann schauen, welchen User end; ShowMessage(user); end; |
Re: Befehle erstellen
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var befehl, user, s: string; begin S := '/kick k4ni'; //oder eben MSG.text if s[1] = '/' then // Prüfen, ob Befehl! begin befehl := Copy(s, 2, Pos(' ', s) - 2); //DA IST JETZ NE 2 STATT NER 1 if befehl = 'kick' then user := Copy(s, Pos(' ', s) + 1, Length(s)); //wenn Befehl "kick" dann schauen, welchen User end; // ShowMessage('#'+befehl+'#'); hatte ich nur zum debuggen genutzt ShowMessage(user); end; |
Re: Befehle erstellen
Danke!
Doch ich will ya noch einen grund angeben. Also etwa so: Syntax: /kick <name> <reason>
Delphi-Quellcode:
Doch ich kann Ja das ende des namens nichtmehr mit der länge des Strings festlegen weil es jetzt ja weitergeht.
procedure TForm1.Button1Click(Sender: TObject);
var befehl, user, s, reason: string; begin S := MSG.text; if s[1] = '/' then // Prüfen, ob Befehl! begin befehl := Copy(s, 2, Pos(' ', s) - 2); //DA IST JETZ NE 2 STATT NER 1 if befehl = 'kick' then user := Copy(s, Pos(' ', s) + 1, Length(s)); reason := Copy(s, Pos(user, s) + 1, Length(s)); end; ShowMessage(user+' wurde gekickt, reason: '+reason); end; Und die position des reasons fest zu stellen geht glaub auch nicht so wie ich das hab.. |
Re: Befehle erstellen
Lass doch wieder mit POS das nächste Leerzeichen suchen!
Delphi-Quellcode:
Das haut hin, habs getestet ... bzw, funktioniert natürlich nur, wenn die User-Namen keine Leerzeichen enthalten!
procedure TForm1.Button1Click(Sender: TObject);
var befehl, user, s, reason: string; begin S :='/kick k4ni weil er zu viel fragen stellt =)'; if s[1] = '/' then // Prüfen, ob Befehl! begin befehl := Copy(s, 2, Pos(' ', s) - 2); //DA IST JETZ NE 2 STATT NER 1 if befehl = 'kick' then begin //edit: der anweisungsblock hier user := Copy(s, Pos(' ', s) + 1, Pos(' ', s) - 2); reason := Copy(s, Pos(user, s) + 1 + Length(user), Length(s)); end; end; ShowMessage(user+' wurde gekickt, reason: '+reason); end; |
Re: Befehle erstellen
Ich dachte das POS immer das erste leerzeichen nimmt :(
Vielen dank :) |
Re: Befehle erstellen
Ohh das ist auch so.
Der name darf nicht länger als 4 zeichen sein. (immer solange wie der befehl, also wenn der befehl hahaha heist darf der name auch 6 zeichen lang sein). Also sucht er hier zweimal nach dem gleichen leerzeichen:
Delphi-Quellcode:
Ich hab jetzt schon ein bisschen rumversucht wie er nach dem 2. suchen könnte, aber ich krieg es nicht raus. :x
user := Copy(s, Pos(' ', s) + 1, Pos(' ', s) - 2);
|
Re: Befehle erstellen
Schau Dir mal PosEx an.
|
Re: Befehle erstellen
Zitat:
bisheriger Code:
Delphi-Quellcode:
jetziger code:
procedure TForm1.Button1Click(Sender: TObject);
var befehl, user, s, reason: string; begin S :='/kick k4ni weil er zu viel fragen stellt =)'; if s[1] = '/' then // Prüfen, ob Befehl! begin befehl := Copy(s, 2, Pos(' ', s) - 2); //Copy will als dritten Parameter keine zweite STELLE, sondern die ANZAHL der Zeichen! Also ist es ja logisch, dass man eine '2' braucht... if befehl = 'kick' then begin user := Copy(s, Pos(' ', s) + 1, Pos(' ', s) - 2); // hier dasselbe nur nicht mit '2' sondern mit was anderem, weil ja der 'kick' befehl schon mit drin ist reason := Copy(s, Pos(user, s) + 1 + Length(user), Length(s)); end; end; ShowMessage(user+' wurde gekickt, reason: '+reason); end;
Delphi-Quellcode:
uses StrUtils;
... procedure TForm1.Button1Click(Sender: TObject); var befehl, user, s, reason: string; begin S :=edit1.text; if s[1] = '/' then begin befehl := Copy(s, 2, Pos(' ', s) - 2); if befehl = 'kick' then begin user := Copy(s, 7, PosEx(' ', s, 7) - 7); //bei PosEx (unit-einbinden nicht vergessen) kann man nun den startwert zum suchen mit eingeben: '7' weil dort das erste zeichen nach dem leerzeichen hinter kick kommt, damit kann man denke ich hier arbeiten, weil ja schon feststeht, dass 'kick' der befehl ist, ansonsten müsste man dynamisch rangehen =) reason := Copy(s, PosEx(' ', s, 7) + 1, Length(s)); end; end; ShowMessage(user+'#'+reason); end; |
Re: Befehle erstellen
ja entweder du zerlegst erstmal den String anhand von Trennzeichen (z.B. " "), wobei sich dafür auch
![]() oder man prüft einzeln, wobei letzteres gut ist, wenn man (ohne dynamische Arrays) auf verschiedene Befehlsformate reagieren möchte. Zitat:
Delphi-Quellcode:
S := LowerCase(Msg.Text);
if copy(S, 1, 6) = '/kick ' then begin name := copy(S, 7, ...); ... end else if S = '/exit' then begin ... end else if copy(S, 1, 13) = '/abrakadabra ' then begin param := copy(S, 14, ...); ... end;
Delphi-Quellcode:
A := Explode(Msg.Text, ' ');
if Length(A) < 1 then exit; A[0] := LowerCase(A[0]); if (A[0] = '/kick') and (Length(A) > 1) then begin name := A[1]; ... end else if A[0] = '/exit' then begin ... end else if (A[0] = '/abrakadabra') and (Length(A) > 1) then begin param := A[1]; ... end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:01 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