Я работаю над клиентом IRC. Я ударил майоры, которые до тех пор, пока я не смог обойтись. Я покажу код ниже. У меня возникла проблема с созданием дочерних окон MDI в обработчиках событий idIRC.(Delphi 2009) idIRC, MDI и проблемы с подвеской
Например, если я хочу создать новую форму канала (FrmChannel), я могу сделать это легко, вызвав процедуру создания, когда я поймаю команду '/ join'.
Однако, если я хочу сделать это правильно, и дождитесь, пока я действительно присоединился к каналу, и получите подтверждение этого с сервера (обработав его в обработчике событий onjoin), то мой вызов на мой процедура создания формы заставляет приложение зависать.
То же самое касается окон состояния. Например, если я положу вызов процедуры создания окна состояния в событии onclick TButton, отлично. Создана детская форма. Однако, если я попытаюсь сделать то же самое, когда на самом деле получаю личное сообщение, проверив обработчик событий ... Приложение зависает, никаких исключений и нет MDI Child.
Вот соответствующий код (для решения этого я имею дело только с окном запроса).
Во-первых, фактическое создание ребенка 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 (Application); звоните специально. Что дает?
Я пробовал реализовать потоки, чтобы узнать, может ли это быть проблемой. Если это то, о чем вы думаете, проблема в том, что мне нужна помощь в моей потоковой передаче, потому что, по-видимому, хотя код компилируется, я все еще нахожу что-то неправильно (потому что зависает даже моя потоковая версия).
Заранее спасибо.
Имеет ли TfrmMessage что-либо в своих событиях OnCreate или OnShow? Я говорю OnShow, потому что у MDIChildren может быть только свойство Visible равным True, поэтому они будут отображаться, как только они будут созданы. –