2013-05-30 49 views
0

我要動態添加TabsheetPageControl當客戶端連接到我的IdCmdTCPServer與此相同的代碼:如何安全地將Tabsheet添加到TIdCmdTCPServer OnConnect事件中的PageControl中?

procedure TForm1.IdCmdTCPServer1Connect(AContext: TIdContext); 
var 
    ATabSheet: TTabSheet; 
begin 
    ATabSheet := TTabSheet.Create(PageControl1); 
    ATabSheet.PageControl := PageControl1; 
    ATabSheet.Caption := 'Hello!'; 
    {...} 
end; 

其行,但關閉應用程序時,我會得到EOSError與消息:「系統錯誤代碼:1400.無效的窗口句柄「。 我已將此代碼塊添加到TButtonOnClick事件中,並且應用程序將無任何問題關閉。 有沒有更安全的方法來做到這一點?


David Heffernan的幫助下,我已經改變了Methode這樣:

.... 

type 
    TMyThrd = class(TThread) 
    protected 
     procedure Execute; override; 
    end; 

... 

procedure TMyThrd.Execute; 
begin 
    with TTabsheet.Create(Form1.PageControl1) do 
    PageControl := Form1.PageControl1; 
end; 

... 

procedure TForm1.cmdAddTabCommand(ASender: TIdCommand); 
begin 
    with TMyThrd.Create(True) do 
    begin 
    FreeOnTerminate := True; 
    Resume; 
    end; 
end; 

和命令測試結果:

addtab Command Testing Result

但提到的問題是鋼發生在應用程序關閉!

+0

也許這將幫助http://stackoverflow.com/q/9139940/1699210 – bummi

+0

@bummi:感謝您的建議。但是我檢查了我的TCP代碼部分,並且在OnConnect事件中沒有這個代碼塊的情況下它們運行的​​很好。就在我添加這個塊時,問題就會出現! –

回答

1

您的事件處理程序,因此它包含的VCL訪問代碼在GUI線程以外的線程上執行。訪問VCL對象的所有代碼都必須在GUI線程上執行。因此,您需要更改代碼以確保將VCL部分編組到GUI線程。

使用TIdSync或TThread.Synchronize將代碼的VCL部分編組到GUI線程中。雷米給這裏的前一種方法的一個例子:Indy synchronize ServerTCPExecute

+0

謝謝。請再次檢查問題。我對代碼做了一些修改,但是... –

+0

你必須按照我在答案中所說的去做。調用TThread.Synchronize。不要創建另一個線程! –

+0

哪個線程?你說的TThread是一個類,我必須同步基於這個類的標識符嗎? –

0

最終正確的思想:

uses 
..., IdSync, ... 
... 

type 
    TSyncThrd = class(TIdSync) 
    protected 
    procedure DoSynchronize; override; 
end; 

... 

procedure TForm1.cmdAddTabCommand(ASender: TIdCommand); 
begin 
    with TSyncThrd.Create do 
    begin 
    try 
     Synchronize; 
    finally 
     Free; 
    end; 
    end; 
end; 

... 


procedure TSyncThrd.DoSynchronize; 
begin 
    with TTabsheet.Create(Form1.PageControl1) do 
    PageControl := Form1.PageControl1; 
end; 

當然,當前的連接必須在應用程序關閉時關閉。如果否,invalid pointer operation會發生!

特別感謝David Heffernan

相關問題