2017-12-01 29 views
0

開発するように指示された古いプロジェクトでは、TScrollBox型のフィールドがあります。TScrollBoxに追加されたヘルパーメソッドが機能しません

ナビゲーションボタンのイベントを処理するには、クラスにWM_GETDLGCODEメッセージハンドラが含まれている必要があります。だから私は、新しいクラスを作成しました:

TScrollBoxArrowBtn = class(TScrollBox) 
protected 
    procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE; 
end; 

実装

procedure TScrollBoxArrowBtn.WMGetDlgCode(var Message: TWMGetDlgCode); 
begin 
    Message.Result := DLGC_WANTARROWS; 
end; 

をそしてTScrollBoxArrowBtnでTScrollBoxタイプを置き換えます。

FScroll : TScrollBoxArrowBtn; 

コンポーネントが矢印ボタンを押すことに応答し始めました。しかし、コピー、削除、SelectAllメソッドは動作を停止しました。以前の開発者は、このような検証方法を追加したので、これが起こった:

"VariableName".ClassType = TScrollBox 

私は検証のためにそれらを置き換える:

"VariableName" is TScrollBox 

編集この方法は仕事を始めた後。しかし、私はそのようなテストがプロジェクトの他の場所には適用されないとは確信していません。だから私は

FScroll : TScrollBox; 

を残すことを決定し、TScrollBoxArrowBtnヘルパークラス作っ:

TScrollBoxArrowBtn = class helper for TScrollBox 
protected 
    procedure WMGetDlgCode(var Message: TWMGetDlgCode); message WM_GETDLGCODE; 
end; 

残念ながら、この方法では動作しません。 "VariableName".ClassType = TScrollBoxのような確認は完全にはじまりましたが、プロジェクトはイベントの矢印ボタンに反応しなくなりました。私は何を間違えたのですか?

私のバージョンのIDEがヘルパーメソッドをサポートしていると確信しています。

答えて

1

ヘルパークラスのメッセージメソッドについて具体的な回答が見つかりませんでしたが、私は自分の問題を解決する方法を見つけました。加えて、ヘルパークラスの他の多くの悪い特徴について学びました。私は最終的にその使用を断念しました。だから私の答えは - クラスヘルパーを使わないでください。現時点では、これは非常に不安定なツールです。おそらく将来的には改善されるでしょう。

今私の決定について。私が恐れているように、次のような種類のチェックの問題:

"VariableName".ClassType = TScrollBox 

以前に作成されたブランチをマージするときにもう一度表示されます。そこで、私はTScrollBoxウィンドウプロシージャを置き換えることに決めました。私はTScrollBoxフィールドコンテナクラスにフィールドを追加し、私はコンテナクラスでTScrollBox-フィールドに新しいウィンドウプロシージャを追加しました:

TCADParamsGroupBlockBaseScheme = class (TCADGroupBlockParams) 
..................................................... 
protected 

    Old_FScroll_WindowProc : TWndMethod; 
    procedure New_FScroll_WindowProc(var Message: TMessage); 
..................................................... 
end; 

implementation 

procedure TCADParamsGroupBlockBaseScheme.New_FScroll_WindowProc(var Message: 
TMessage); 
begin 
    //Для обработки событий нажатий Key_Up/Down/Left/Right в DoKeyDown 
    if Message.Msg = WM_GETDLGCODE then 
    Message.Result := DLGC_WANTARROWS 
    else Old_FScroll_WindowProc(Message); 
end; 

とコンテナクラスのコンストラクタで、私は古いTScrollBoxへのポインタを保存しました新しいウィンドウプロシージャを割り当てました。

constructor TCADParamsGroupBlockBaseScheme.Create(const AOwner: TWinControl); 
begin 
........................................... 
FScroll := TScrollBox.Create(FHost.Owner); 

Old_FScroll_WindowProc := FScroll.WindowProc; 
FScroll.WindowProc := New_FScroll_WindowProc; 
............................................ 
end;