3

SetWindowLong コマンドを使用してツリービューの方向を変更すると、そのノードの popupmenu が表示されません。完全なコードはここにあります:

Procedure SetWinControlBiDi(Control: TTreeView);
 var
  ExStyle: Longint;
 begin

  ExStyle := GetWindowLong(Control.Handle, GWL_EXSTYLE);

  SetWindowLong(Control.Handle, GWL_EXSTYLE, ExStyle or WS_EX_RTLREADING or WS_EX_RIGHT or WS_EX_LAYOUTRTL or WS_EX_NOINHERITLAYOUT );

 end;


procedure TMainForm.FormShow(Sender: TObject);
 begin

  SetWinControlBiDi(TreeView1);

 end;
4

2 に答える 2

3

これを行う標準的な方法は、DelphiBiDiModeプロパティを使用することです。右から左への変換が必要であることを VCL が認識できるように、このようにすることをお勧めします。BiDiModeポップアップ メニューのプロパティも変更する必要があります。

これを行う正しい方法は、個々のコンポーネントのプロパティを変更しないことです。そのようにするのは面倒で、非常にエラーが発生しやすくなります。アプリケーションの初期化のどこかに設定Application.BiDiModeすると、変更がすべてのコンポーネントに反映されます。

たとえば、アプリケーションの .dpr ファイルを次のように変更できます。

Application.Initialize;
Application.MainFormOnTaskbar := True;
Application.BiDiMode := bdRightToLeft;
Application.CreateForm(TMainForm, MainForm);
Application.Run;

BiDiModeコンポーネントやParentBiDiMode.dfm ファイルを変更していないことを確認する必要があります。これらの行を .dfm ファイルから単純に削除すると、単一のアプリケーション全体のApplication.BiDiMode設定ですべてを制御できるようになります。


あなたの設定方法にGWL_EXSTYLEは問題があります。VCL はその設定を制御しており、変更する必要がある場合は、変更するTForm.OnShowと奇妙なバグが発生します。場合によっては、ウィンドウを再作成する必要があり、これが発生すると、設定GWL_EXSTYLEするコードが実行されず、ツリー ビューが左から右に戻ります。ウィンドウ スタイルを変更する必要がある場合TWinControl.CreateParamsは、コンポーネントをオーバーライドする必要があります。ただし、この場合、VCL は BiDi を直接サポートしているため、これが最適なソリューションです。

于 2011-06-24T09:38:26.877 に答える
0

これは、TPopupMenu を表示するための代替ソリューションです。

1-使用OnMouseDownイベント

2- マウスの右ボタンをクリックしたときに TPopupMenu を表示するには、次のコードを記述します。

 var
  pt : TPoint;

  begin
  pt := Mouse.CursorPos;

   if Button = mbRight then
        APopupMenu.Popup(pt.X, pt.Y);

幸運を !

于 2018-02-16T20:07:04.957 に答える