2012-03-07 5 views
5

私が取り組んでいるプロジェクトは、数百のフォームで構成されています。 これらは主にメインフォームから呼び出されます。アプリケーション名はformcaptionsのすべてにあります。フォームの作成をキャッチしよう

アプリケーションの別のバージョンでは、フォームキャプションを別のアプリケーション名に変更する必要があります。しかしこれは条件付きです。私はformcreateで

Screen.OnActiveFormChange := ScreenOnActiveFormChange; 

を結合し、そのための手順を作っていた思い付いた何

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

の再描画を強制的にDrawMenuBar API呼び出しを追加します。クラス。次に、すべてのフォームに共通の設定を1つの場所から制御できます –

+0

詳しい調査の後、私はそれが何とかビデオバッファのバグだと思っています。ウィンドウをドラッグすると、キャプションは変わらず、間違ったままになります。それをドラッグしてデスクトップから脱落させない限り。それを元に戻すと、デクトップに表示されなかった部分が正しいキャプションに変更され、表示されている部分が間違ったままになります。 –

答えて

0

ウィンドウAPIを使用してみましたか?

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

編集: 1以上の提案:これを行うための最善の方法は、すべてのフォームが共通のベースから派生することですウィンドウのメニューバー

DrawMenuBar(Screen.ActiveForm.Handle); 
+0

これは同じ問題を抱えて、私が投稿したコードとまったく同じです。 –

+0

DrawMenuBarはうまく動作します。 –

関連する問題