我输入了一个字符串,例如{ !move simon General Chat }
我想从字符串中删除第一个和第二个完整的短语,无论大小。以下代码仅适用于General Chat
,但如果我将此“区域ID”更改为Romance
或spacegames
则无效。
我应该更改代码?
if UpperCase(Mid(source,1,5)) = UpperCase('!move') then
begin
User := Mid(source, 6, length(source)); // remove !move from username
RoomID := Mid(source, length(User)-6, length(source)); // remove !move and username
SendMemo.Clear;
MoveUserTo(IMData.m_UserID, GetFirstNWrods(User, ' ', 1), GetFirstNWrods(RoomID, ' ', 3));
end;
function GetFirstNWrods(const str: string; const delim: string; Numwords: Integer): string;
var
Tokenizer: IStringTokenizer;
begin
Result := '';
Tokenizer := StringTokenizer(str, delim);
while (Tokenizer.hasMoreTokens) and (Numwords > 0) do
begin
Result := Result + Tokenizer.nextToken + delim;
Dec(Numwords)
end;
System.Delete(Result, Length(Result) - Length(delim) + 1, Length(delim));
end;
答案 0 :(得分:1)
您的解决方案适用于General Chat只是巧合。 在代码的第三行:
User := Mid(source, 6, length(source)); // remove !move from username
您实际上将所有剩余的字符串User
复制到simon General Chat
。在下一行:
RoomID := Mid(source, length(User)-6, length(source)); // remove !move and username
发生了一些奇怪的事情。用户的长度比源的长度小6,现在你将RoomID正好位于12个正确的位置,这不取决于你的字符串的实际内容。
因此,如果RoomID长度为11或12个符号,则代码正常工作(如果有的话,前导空格将被删除)。真是一个惊喜:General chat
长度为12,所以它有效。
您实际需要做的是逐字阅读User
变量并检查每一步,是否有用户具有此类名称。为了明确地工作,你应该永远不要让用户的名字包含开头的另一个用户的名字(这就是Jan Doggen告诉你的)。例如,如果您有用户simon
,则不应允许任何其他人使用用户名simon paul
,否则解析您的命令要困难得多。
因此,您逐字阅读,直到它产生现有的用户名。现在剩下的就是你的RoomID。