2012-03-07 50 views
5

我工作的項目包含幾百個表格。 他們大多是從mainform中調用的。應用程序名稱在所有的表單中。試圖抓住一個表格的創建者

現在應用程序的另一個「版本」必須將表單標題更改爲另一個應用程序名稱。但這是有條件的。

我想出什麼樣的主意是有約束力的

Screen.OnActiveFormChange := ScreenOnActiveFormChange; 
在FORMCREATE

,使一個程序這一點。

procedure TFormMAIN.ScreenOnActiveFormChange(Sender: TObject); 
begin 
    if Newversion then begin 
    if assigned(screen.activeform) then begin 
     Screen.ActiveForm.Caption := SwapFormCaption(Screen.ActiveForm.Caption); 
    end; 
    end; 
end; 

這在95%的情況下效果很好。但在這5%的表格中顯示得太快了。窗口在標題更新之前繪製並且窗口將其留在那裏。但標題已具有新的價值。 有效的補救措施是增加和減少1個像素的形式高度,然後它會顯示正確。 form.repaint在這裏沒有幫助。 這是一個相當醜陋的做事方式。

我真正想要的是攔截創建的子表單而不是激活。我試圖找到關於這方面的資源,但沒有成功。

+13

要做到這一點是讓所有的形式從一個共同的基礎得出的最佳方式類。然後,您可以從一個位置控制所有表單通用的設置。 – 2012-03-07 12:02:18

+0

經過進一步調查,我認爲它是某種視頻緩衝器錯誤。當我拖動窗口時,標題不會改變並且保持錯誤。除非我把它拖出桌面。當我將其拖回時,未在顯示屏上顯示的部分將更改爲正確的標題,而保持可見的部分仍然存在錯誤。 – 2012-03-07 13:56:15

回答

0

您是否嘗試過使用window api?

SetWindowText(Screen.ActiveForm.Handle,PChar(SwapFormCaption(Screen.ActiveForm.Caption)); 

編輯: 1點建議:添加DrawMenuBar API調用來迫使重繪窗口菜單欄中

DrawMenuBar(Screen.ActiveForm.Handle); 
+0

這與我發佈的代碼完全相同,但問題相同。 – 2012-03-07 14:16:37

+0

DrawMenuBar效果很好,謝謝。 – 2012-03-07 15:18:46