に関連するすべてのフォームを閉じます。デルファイ - インディは、私は彼がこのアクションは、サーバー側になり、サーバーに</p> <p>を形成する切断後、クライアントに関連するすべてのフォームを閉じますしようとしているクライアント
私は例えば、各クライアントのための(実行時に私のために知られている)部分のユニークなキャプション
フォームのキャプション1持っている:
ServiceA - ClientABC
フォームのキャプション2:
ServiceB - ClientABC
何を私はすでに知っているのは- ClientABC
部分だけです。
したがって、クライアントClientABC
が私のサーバから切断された場合、サーバ側で関連する開いているフォームをすべて閉じたいと思っています。
procedure TIdServer.ClientRemove(const AContext: TIdContext);
var
sTitle: string;
function CloseChildForm(Wnd: HWND; Param: LPARAM): BOOL; stdcall;
begin
if Pos(sTitle, _GetWindowTitle(Wnd)) <> 0 then
PostMessage(Wnd, WM_CLOSE, 0, 0);
Result := True;
end;
begin
sTitle := TMyContext(AContext).Uniquename {ClientABC}
if Assigned(FListView) then begin
TThread.Queue(nil,
procedure
var
i: Integer;
begin
EnumWindows(@CloseChildForm, 0);
.......
end;
end
);
end;
end;
私の問題は常に空CloseChildForm
関数内の文字列sTitle
です。
procedure TIdServer.IdServerDisconnect(AContext: TIdContext);
begin
TMyContext(AContext).Queue.Clear;
........
ClientRemove(AContext);
end;
IdServerDisconnect
手順に
ClientRemove
を呼び出す
「TMyContext」に関連付けられたウィンドウのリストを与えるだけではどうですか?ウィンドウが開いたら、それをクライアントのリストに追加します。ウィンドウが閉じられたら、クライアントのリストからウィンドウを削除します。クライアントが接続を切断すると、まだ開いているウィンドウを閉じるリストをループします。 **あなたの窓を追跡する** **それらのための**狩猟ではありません。 –