Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Befehle erstellen (https://www.delphipraxis.net/105648-befehle-erstellen.html)

k4ni 26. Dez 2007 22:41


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:
if Msg.Text = '/kick '+Nickname then ... .. ..
Danke :)

fLaSh11 26. Dez 2007 22:51

Re: Befehle erstellen
 
schau dir mal die Funktion Delphi-Referenz durchsuchenCopy an

himitsu 26. Dez 2007 23:04

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

Dax 26. Dez 2007 23:10

Re: Befehle erstellen
 
SplitSplit und Delphi-Referenz durchsuchenTrim sind ebenfalls deine Freunde ;)

fLaSh11 26. Dez 2007 23:12

Re: Befehle erstellen
 
Zitat:

Zitat von himitsu
if copy(Msg.Text, 1, 6) = '/kick ' then begin
name := copy(Msg.Text, 7, ...)
...
end

Nicht zu empfehlen... was ist, wenn der Befehl einmal lauten sollte "/abrakadabra" dann ist nichts mehr mit Copy(Text, 1, 6). 8)

Wenn dann lieber so:

Delphi-Quellcode:
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;
Das mit dem dynamischen Überprüfen solltest du dir zu Gemüte führen... versteht man nicht auf Anhieb :zwinker:

Dax 26. Dez 2007 23:19

Re: Befehle erstellen
 
' /kick k4ni' ist aber auch ein Befehl ;)

k4ni 26. Dez 2007 23:29

Re: Befehle erstellen
 
Zitat:

Zitat von fLaSh11
Delphi-Quellcode:
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;
Das mit dem dynamischen Überprüfen solltest du dir zu Gemüte führen... versteht man nicht auf Anhieb :zwinker:

Also beim erstenmal hinschauen dacht ich mir "omg..." aber jetz blick ich das alles :) Danke,

Also sollte das 'k4ni" anzeigen wenn in Msg.Text "/kick k4ni" eingeb, oder nicht?

Delphi-Quellcode:
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;
Tut es aber nicht :(

Dax 26. Dez 2007 23:34

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;

TonyR 26. Dez 2007 23:40

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;

k4ni 27. Dez 2007 00:08

Re: Befehle erstellen
 
Danke!
Doch ich will ya noch einen grund angeben.
Also etwa so:
Syntax: /kick <name> <reason>
Delphi-Quellcode:
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;
Doch ich kann Ja das ende des namens nichtmehr mit der länge des Strings festlegen weil es jetzt ja weitergeht.
Und die position des reasons fest zu stellen geht glaub auch nicht so wie ich das hab..

TonyR 27. Dez 2007 00:20

Re: Befehle erstellen
 
Lass doch wieder mit POS das nächste Leerzeichen suchen!

Delphi-Quellcode:
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;
Das haut hin, habs getestet ... bzw, funktioniert natürlich nur, wenn die User-Namen keine Leerzeichen enthalten!

k4ni 27. Dez 2007 00:34

Re: Befehle erstellen
 
Ich dachte das POS immer das erste leerzeichen nimmt :(

Vielen dank :)

k4ni 27. Dez 2007 13:06

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:
      user := Copy(s, Pos(' ', s) + 1, Pos(' ', s) - 2);
Ich hab jetzt schon ein bisschen rumversucht wie er nach dem 2. suchen könnte, aber ich krieg es nicht raus. :x

DeddyH 27. Dez 2007 13:17

Re: Befehle erstellen
 
Schau Dir mal PosEx an.

TonyR 27. Dez 2007 20:13

Re: Befehle erstellen
 
Zitat:

Zitat von DeddyH
Schau Dir mal PosEx an.

genau ... also pass auf (ich hoffe, dass du dir auch fein selber Gedanken machst, weil du weißt ja, wie das hier läuft)

bisheriger Code:
Delphi-Quellcode:
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;
jetziger code:
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;

himitsu 27. Dez 2007 22:02

Re: Befehle erstellen
 
ja entweder du zerlegst erstmal den String anhand von Trennzeichen (z.B. " "), wobei sich dafür auch Hier im Forum suchenExplode und Co. ganz gut machen,

oder man prüft einzeln, wobei letzteres gut ist, wenn man (ohne dynamische Arrays) auf verschiedene Befehlsformate reagieren möchte.

Zitat:

Nicht zu empfehlen... was ist, wenn der Befehl einmal lauten sollte "/abrakadabra" dann ist nichts mehr mit Copy(Text, 1, 6).
wie wäre es, wenn man dann die Zahlen anpaßt? :zwinker:

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