我工作的IRC客户端。 我已经打了一个专业钉子其中,直到不,我已经能够解决。 我将在下面显示的代码。 什么是我在与被idIRC的事件处理程序中创建MDI子窗口的问题。
例如,如果我想创建一个新的渠道形式(FrmChannel),我可以很容易地通过调用做到这一点它的创建过程时,我赶上“/加入”命令。
但是,如果我想这样做的正确的方式,等到我实际上已经加入了通道,并从服务器接收此确认(由onjoin事件处理程序处理它),然后我呼吁我的表单创建程序的原因应用程序挂起。
这同样适用于状态窗口。 例如,如果我把我的状态窗口创建过程调用上一个TButton的onclick事件,罚款。 子窗体创建。 不过,如果我尝试同样的事情时,我居然收到私信,通过检查事件处理程序...应用程序挂起,也不例外,并没有MDI子。
下面是相关的代码(解决这个我会只处理查询窗口的缘故)。
首先,实际的MDI子创作是这样的。 我有一个TComponentList在这里管理这类形式的列表(如果你想知道)。 还有在这里的一些其他的事情,保持形态的轨迹为好,虽然注释出来并不妨碍航(我试过)。
procedure TFrmMain.NewQuery(const Server, MsgFrom: String);
var
Child: TFrmMessage;
TN: TTreeNode;
begin
///
/// Create form, set some data so we can reference it later.
///
///
Child := TFrmMessage.Create(Application);
// QueryManager.Add(Child); //TComponent List -- Used to find the Form Later On
with Child do
begin
MyServer := Server; {What server this PM window is on}
QueryWith := MsgFrom; {nickaname of the other person}
Caption := MsgFrom; {Asthetic}
end;
Child.Echo('*** Conversation with ' + MsgFrom); //Herro World
///
/// The following code is working.
/// I'm pretty sure it's not causing the hangs.
///
TN := GetNodeByText(ChanServTree, Server, True); {Find our parent node}
with ChanServTree.Items.AddChild(TN, MsgFrom) do
begin
Selected := True;
Tag := 2; {TYPE OF QUERY}
Data := Pointer(Integer(Child)); //Pointer to Form we created
end;
end;
下面是我的IRC组件的事件处理程序:
procedure TFrmMain.IRCPrivateMessage(ASender: TIdContext; const ANicknameFrom,
AHost, ANicknameTo, AMessage: string);
var
CheckVr: String;
aThread: TNQThread;
begin
//DEBUG:
(StatusManager[0] as TFrmStatus).Echo('From: ' + ANickNameFrom + 'AMESSAGE: ' + '''' +AMessage + '''');
///
/// Handle Drone Version Requests!
/// This is REQUIRED on servers like irc.blessed.net - or they won't let you join
/// channels! - It's part of the Registration proccess
///
{The Drones on some server's don't follow specifications, so we need to search
hard for their presence}
CheckVr := AMessage;
StringReplace(CheckVr,' ','',[rfReplaceAll, rfIgnoreCase]);
StringReplace(CheckVr,#1,'',[rfReplaceAll, rfIgnoreCase]);
(StatusManager[0] as TFrmStatus).Echo('Message was: ' + '''' + CheckVr + '''');
if Trim(CheckVr) = 'VERSION' then
begin
IRC.CTCPReply(ANickNameFrom,'VERSION','mIRC v6.01 Khaled Mardam-Bey');
(StatusManager[0] as TFrmStatus).Echo('*** Sent Version Reply to ' + ANickNameFrom);
exit; {Because if we don't, this could mess things up}
end;
///
/// The Following code sends the PM to the appropriate window.
/// If that window does not exist, we will create one first.
///
if Pos('#',Amessage) = 1 then
begin
//Handled Elsewhere
end else {is PM}
begin
if FindQueryFrm(ANickNameTo,IRC.Host) = nil then
begin
NewQuery(IRC.Host, ANickNameFrom);
exit;
end;
end;
// FindChannelFrm(ANickNameTo,IRC.Host).ChannelMessage(ANicknameFrom, AMessage);
end;
我试着注释掉的代码的各个部分,试图追查挂的原因。 挂起是由儿童引起的:= TFrmMessage.Create(应用程序); 特别呼吁。 是什么赋予了?
我试图执行的线程来看看是否有可能是一个问题。 如果这是你在想什么问题,我需要帮助,我的线程,因为虽然表面上的代码编译,我还在打电话了问题(因为即使我的线程版本挂起)。
提前致谢。