2012-08-02 34 views
-1

我把一些代碼發生在Form OnResize事件上。但它似乎只在調整大小時才調用事件。有什麼方法可以改變它嗎?何時調用OnResize表單?

說我有

procedure TForm1.Resize(Sender: TObject); 
begin 
    RePaint(); 
end 

我想運行每次重繪形式的尺寸重新調整時間(或大或小)。我想你可以添加一個檢查寬度/高度的檢查,但如果你要這麼做,爲什麼即使使用事件調整大小?也許除了調整大小之外,還有另外一個事件呢? 謝謝 Glen

+3

即使將窗體大小調整爲較小,也會觸發OnResize事件。 – TLama 2012-08-02 07:15:23

+3

如果您使用了對齊屬性或錨點,那麼您將不需要OnResize事件。不是OnResize並不總是觸發(它確實),但是有一些方法可以使控件適應窗體大小。 – 2012-08-02 07:16:25

+0

問題是基於一個錯誤的假設,只有當表單變得更大時纔會發生Resize。沒有SSSCE代碼可以進行調試。 – Kromster 2014-08-28 09:57:21

回答

1

OnResize事件是通過任何方式調整窗體大小時觸發的,儘管它比以前大或小。

爲了證明這一點,創建一個新的項目,把備忘錄乾淨的形式和這個代碼添加到onResize受到事件:

procedure TForm1.FormResize(Sender: TObject); 
begin 
    Memo1.Lines.Add(Format('%d,%d', [Width, Height])); 
end; 

執行你的項目,然後拖動表格的邊緣,使其越來越小,你會發現它總是被解僱,事件被觸發了多少次。

另請注意,窗體中有一個OnPaint事件,可能是您要做的。

+1

更容易與['Caption'](http://docwiki.embarcadero.com/Libraries/en/Vcl.Forms.TForm.Caption);-) – TLama 2012-08-02 07:29:10

+2

@TLama,是的,但與備忘錄你有完整的歷史和理解事件如何觸發! :) – jachguate 2012-08-02 07:56:32

+1

嗯,就是這樣,我測試過,它確實調用了它的大小,這是我收縮窗體時未被調用的ONPaint。偉大的工作在想這件事。我想我可以明白爲什麼它不會打電話給我,但我又希望它做到了:D – 2012-08-02 08:11:32

3

這裏有兩個問題。

首先,OnResize在窗體大小調整時觸發,無論哪個方向。期。

二,爲什麼Repaint不起作用當表格變小時可能是因爲你自己做了繪畫。通常,只有Canvas.Cliprect需要重新繪製。當表格變小時,所顯示的區域不會改變,裁剪區域爲空。畢竟,沒有比以前更多的油漆了。當表單在一個方向上變大時,會發生類似的情況:剪切區域僅包含添加到表單表面的部分。同樣,前面顯示的區域保持不變並且不被更新。只有當表單在兩個方向上展開時,裁剪區域不能再由單個矩形構成,因此它變成了完整的表面。

爲您的解決方案是信號窗口隨時調整大小重新繪製表格的全部內容,通過調用Invalidate(或Update時,它必須立即重新粉刷),並在OnPaint事件進行自定義圖。