-1

TPanelから派生したカスタムコントロールを作成します。このコントロールには、画像とその他のコントロールが含まれています。コードを書いた後、プログラムで奇妙な動作をします。TDisplay.Resize(オーバーライド)で初期化されるはずだったいくつかの変数は、Resizeが実行されなかったため、初期化されなかったことに気付きました。

'それを解決するために'私はフォームにボタンを置き、初めてResizeを呼び出すClientHeightを呼び出すLoadSample関数を呼び出しました!

constructor TDisplay.Create(AOwner: TComponent);
begin
 inherited Create(AOwner);
 Ready         := FALSE;                                                       
 Parent        := Owner as TWinControl;
 Width         := 200;
 Height        := 86;                 
 Color         := clSilver;
 Caption       := '';
 DoubleBuffered:= TRUE;


  InternalDisplay:= TImage32.Create(Self);
  with Display DO
   begin
    Parent        := Self;
    Bitmap.Width  := 1;                                                        
    Bitmap.Height := 1;
    RepaintMode   := rmOptimizer;     
    Align         := alClient;
    SetupBitmap(TRUE, clBlack32);    
    Visible       := TRUE;
    OnMouseDown   := DMouseDown;
   end;
 ...
end;

更新:
また、実行時にフォーム(コントロール)のサイズを手動で変更するまで、InternalDisplayは親サイズに揃えられません。その場合にのみ、(alClientとの整合性を維持するために)想定どおりに動作します。

更新2:
サイズ変更は次 のように宣言されます:procedure Resize; オーバーライド;

更新3:
ConstrunctorからClientHeight行を削除し、ここに移動しました。

procedure TDisplay.LoadSample(VAR Obj: TMySample; CONST bReleaseOnExit: boolean)
begin
 ClientHeight;  <--------- this will call Resize for the first time and my code will be finally initialized. But until this point my display will look odd because the code was never initialized. So the user will see weird stuff until it pushes the 'LoadSample' button.
 more code here....
end;

アップデート4:
Davidが提案したようにHandleNeededを使用したところ、初期化の問題が解決しました。ただし、フォーム/コントロールのサイズを手動で変更しない限り、画像はクライアント領域全体に整列しません。

更新
5Davidが 提案したように、ここに続く:TImageは親に整列しません

4

2 に答える 2

2

フォームはまだ表示されていないため、Windows メッセージ (OnResize イベントをトリガーするサイズ変更メッセージなど) をまだ受信できません。

于 2012-08-07T20:04:54.433 に答える