2011-04-12 28 views
3

ウェブページを表示できるコンポーネントであるGecko SDKを使用します。
私はこのコンポーネントを使ってHTMLエディタを作成します。コンポーネントで矢印キーが機能しない

この問題は、Webページの編集を終了するときに発生します。
問題は、矢印キーとタブがコンポーネントで動作しないことです。私はこの問題の答えを見つけようとしましたが、見つけませんでした。トラックhereが見つかりましたが、この機能は動作しません。

ファンクションMovement (dx, dy)は存在しません。この問題の解決にご協力いただきありがとうございます。

Procedure Tform1.TraiteMessages(Var msg : TMsg; Var Handled: boolean); 
var 
    dx, dy : integer; 
begin dx: 0; dy := 0; 
    With msg do 
    begin 
    IF Message = WM_KEYDOWN then 
    Case wparam of 
     VK_LEFT : dx := -1; 
     VK_RIGHT : dx := 1; 
     VK_UP : dy := -1; 
     VK_DOWN : dy := 1; 
    end; 
    end; 
    IF (dy = 0) AND (Dx = 0) then Handled := false else 
    begin 
    handled := true;  // message traité 
    Mouvement(dx, dy) // exécution du tracé 
    end; 
end; 
+1

クローズしないでください。問題は非常に現実的ですが、少しだけスタックオーバーフローのためのフランス語です。 –

+2

ちょうど私がここにGoogleの翻訳を開始する分を与える、そして.... Voila! –

+0

英語を使用してください、StackOverflowは多言語のサイトではありません。 –

答えて

8

すると、あなたのコンポーネントのクラスにこれを追加します。

procedure HandleDlgCode(var Msg:TMessage); message WM_GETDLGCODE; 

をして、実装セクション内:

procedure TComponentClass.HandleDlgCode(var Msg:TMessage); 
var 
    M: PMsg; 
begin 
    Msg.Result := DLGC_WANTALLKEYS or DLGC_WANTARROWS or DLGC_WANTCHARS or DLGC_HASSETSEL; 
    if Msg.lParam <> 0 then 
    begin 
     M := PMsg(Msg.lParam); 
     case M.message of 
     WM_KEYDOWN, WM_KEYUP, WM_CHAR: 
     begin 
      Perform(M.message, M.wParam, M.lParam); 
      Msg.Result := Msg.Result or DLGC_WANTMESSAGE; 
     end; 
     end; 
    end 
    else 
    Msg.Result := Msg.Result or DLGC_WANTMESSAGE; 
end; 

私はちょうど私の自身の数値のエディタからこのコードをコピー&ペーストしました、それは動作します。

あなたの方法をクリーンアップ
+0

このメソッドを自分で呼び出さないでください。ユーザーがテキストエディタに何かを入力すると、Windowsは最初にWM_GETDLGCODEをウィンドウに送信して、それを処理するかどうかを確認します。通常、コントロールは矢印キー、タブキー、入力、エスケープを処理する必要がないため、Windowsではダイアログナビゲーションに使用できます。これらのキーを処理する必要があるまれなコントロールの場合は、WM_GETDLGCODEハンドラを用意して、Windowsにキーが必要であることを知らせる必要があります。メッセージWM_GETDLGCODE; "'は、これがWM_GETDLGCODEのハンドラであることをDelphiに伝えます。 –

+0

プロシージャの先頭にリストに 'DLGC_WANTTAB'を追加します。 –

+0

-1このコードは、初心者にとってはあまりにも複雑です。これは、低レベルのWIN APIのものです、私はそこに25年間のプログラミングに行ったことはありません。 – Johan

0
Procedure Tform1.TraiteMessages(Var msg : TMsg; Var Handled: boolean); 
var 
    dx, dy : integer; 
begin 
    dx := 0; 
    dy := 0; 
    With msg do 
    begin 
    IF Message = WM_KEYDOWN then 
    begin 
     Case wparam of 
     VK_LEFT : dx := -1; 
     VK_RIGHT : dx := 1; 
     VK_UP : dy := -1; 
     VK_DOWN : dy := 1; 
     end; 
    end; 
    end; 
    Mouvement(dx, dy); 
    Handled := ((dy <> 0) or (dx <> 0)); 
end; 

...今、あなたはあなたのIF文にブレークポイントを配置する必要がありますし、あなたのメッセージフックが今までにトリガされている場合、あなたのケースの条件で別のは、何よりもまず決定するために、だけでなく、もし扱われるメッセージはあなたが期待するものです。

コンポーネントがキーイベントを正しく捕捉していますか?別のビジュアルコンポーネントに焦点を当てていますか?あなたのフォームの "KeyPreview"プロパティをTrueに設定しましたか?

TApplicationEventsコントロールを使用して、キーメッセージフック(コンポーネントが非表示の場合)に対処することもできます。

私のSVNリポジトリにあるthis unitを見てください(ユーザ名とパスワードは両方とも "引用符なしの" anon ")。非ビジュアルコンポーネントでも重要な入力を傍受して処理する方法を示しています。

これが役立ち、幸運を祈ります!

+0

あなたはあなた自身の 'Mouvement'を提供するはずです。あなたが示しているのは、1つの手順で4つの方向キーをすべて処理する一般的な方法です。 2つの整数パラメータ( 'procedure Mouvement(const dx、dy:Integer)')を取るあなた自身の 'Mouvement'手続きを宣言してください。 –

+0

ウェブブラウザは非ビジュアルなイベントのようには聞こえません。 TWinControlに基づくすべてのコンポーネントは、このビルドインをすべて備えています。 – Johan

2

これは行われていません!
これは、私たちが1996年にDelphiより先にしたことです。
この複雑なWindows用のものは必要ありません。

あなたは編集者です。
Delphiにはすでに2つのエディタビルドがあります。

  1. TMemoオブジェクト
  2. TRichEdit。

親としてTMemoを使い、エディタを用意しています。カーソルキーを取得する必要はありません。

interface 

type 
    TMyComponent = class(TMemo) 
    //     ^^^^^^^^^^^^^^^^^^^^<<- use this as your parent class 

protected 
    procedure KeyPress(var Key: Char); override 
    ... 

implementation 

procedure TMyComponent.KeyPress(var Key: Char); 
begin 
    inherited; 
    //it works just like this, TMemo does everything. 
end; 

実際には、あなたはKeyPressを残し、他のものの作業を開始することができます。

低レベルコードを使用する必要はありません。あなたはそれをやっている複雑すぎる

デルファイコンポーネントの設計をしてください。古いDelphiの場合でも、あまり変わっていません。 この件に関する書籍を読む1時間ごとに、20時間のコーディング時間が節約されます。

幸運。

+0

ヨハン、しかし、私はTMemoをベースにしていないコンポーネントで作業します。実際にはそれはWebページの閲覧と編集を行うコンポーネントです あなたのコメントはありません – user653395

+0

どのコンポーネントがベースですか?私たちに名前を教えてください。 – Johan

+0

GeckoSDKはOLE、COM、インターフェースを使用しています。 Essential COMをDavid BoxのISBN 0-201-63446-5 – Johan

関連する問題