FileListBoxの右クリックメニューについて

解決


Mark  2004-04-24 15:23:21  No: 8575  IP: 192.*.*.*

FileListBoxで右クリックしたとき、そのファイル名を選択状態にし、
右クリックメニューを表示させたいのですが、
選択状態にするのがどうも上手くやる方法がわかりません。

マウスの左クリックを処理させれば同様のことができるかと思ったものの
その処理もどう書けばいいか調べてもなかなかわかりませんでした。。
お願いします。。

編集 削除
るるとん@K  2004-04-24 15:26:59  No: 8576  IP: 192.*.*.*

マウスの位置を取得して、その位置をScreenToClientして、
さらに、ListBoxのアイテムの高さで割って・・・
ItemIndexに代入してはどうでしょう?

編集 削除
Mark  2004-04-24 15:34:22  No: 8577  IP: 192.*.*.*

すいません、どのように書けばいいかわかりませんでした(;´Д`)
もう少し詳しく教えてもらえないでしょうか、、すみません。。

編集 削除
るるとん@K  2004-04-24 15:37:17  No: 8578  IP: 192.*.*.*

メニューを表示時に選択するならこうです
procedure TForm1.PopupMenu1Popup(Sender: TObject);
var
APoint:TPoint;
begin
APoint:=ListBox1.ScreenToClient(PopupMenu1.PopupPoint);
ListBox1.ItemIndex:=(APoint.Y div ListBox1.ItemHeight);
end;
です

編集 削除
るるとん@K  2004-04-24 15:41:45  No: 8579  IP: 192.*.*.*

こっちの方がいいかも
procedure TForm1.ListBox1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
ListBox1.ItemIndex:=(Y div ListBox1.ItemHeight);
end;

編集 削除
Mark  2004-04-24 15:44:50  No: 8580  IP: 192.*.*.*

ありがとうございます。できました。
どのような処理をしているのかいまだに理解できていませんが
少しづつ覚えていこうと思います。

編集 削除
るるとん@K  2004-04-24 15:49:28  No: 8581  IP: 192.*.*.*

リストボックスの何番目を選択しているか:=クリックされたボックス内の上からの位置÷リストボックスで1行表示するのに使う高さ;

です

編集 削除
Mark  2004-04-24 16:02:29  No: 8582  IP: 192.*.*.*

今気づいたんですがファイルが多くてスクロールバーが出ていると
ずれてしまうようですね。。
そこら辺は自分への課題として何とかしてみます。
ありがとうございました。

編集 削除
ふぐちゃん  2004-04-24 16:12:55  No: 8583  IP: 192.*.*.*

Markさんに質問なのですが、Markさんが作っているソフトの仕様では、
TFileListBox内でリストが表示されていない部分(空白の領域)で
ユーザーが右クリックしたときに、ポップアップメニューは
表示されるのですか?

編集 削除
Mark  2004-04-24 16:18:21  No: 8584  IP: 192.*.*.*

はい、表示されます。
それだと空白の部分を右クリックしたときItemIndexに問題がありますかね、やっぱ。。

編集 削除
ふぐちゃん  2004-04-24 16:44:34  No: 8585  IP: 192.*.*.*

FileListBox1のPopupMenuプロパティにPopupMenu1を設定せずに
ポップアップメニューを表示させる方法を使ってみました。

// OnMouseDown
procedure TForm1.FileListBox1MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  PS, PC: TPoint;
  i: Integer;
begin
  if Button = mbRight then
  begin
    GetCursorPos(PS);
    PC := FileListBox1.ScreenToClient(PS);
    i := FileListBox1.ItemAtPos(PC, True);
    if i <> -1 then
      FileListBox1.ItemIndex := i;
    PopupMenu1.Popup(PS.X, PS.Y);
  end;
end;

編集 削除
Mark  2004-04-24 17:43:13  No: 8586  IP: 192.*.*.*

すごい、、バッチリです。
どういう処理をしているのかヘルプを読みながら
必死に考えてみようと思います。
ありがとうございました。

編集 削除
るるとん@K  2004-04-24 17:49:20  No: 8587  IP: 192.*.*.*

ふぐちゃんさん、
>GetCursorPos(PS);
>PC := FileListBox1.ScreenToClient(PS);
なんかしなくても、引数のXとYを使えば出来ます
procedure TForm1.FileListBox1MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  i: Integer;
begin
  if Button = mbRight then
  begin
    i := FileListBox1.ItemAtPos(Point(X,Y), True);
    if i <> -1 then
      FileListBox1.ItemIndex := i;
    PopupMenu1.Popup(X, Y);
  end;
end;

編集 削除
るるとん@K  2004-04-24 17:49:26  No: 8588  IP: 192.*.*.*

ふぐちゃんさん、
>GetCursorPos(PS);
>PC := FileListBox1.ScreenToClient(PS);
なんかしなくても、引数のXとYを使えば出来ます
procedure TForm1.FileListBox1MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  i: Integer;
begin
  if Button = mbRight then
  begin
    i := FileListBox1.ItemAtPos(Point(X,Y), True);
    if i <> -1 then
      FileListBox1.ItemIndex := i;
    PopupMenu1.Popup(X, Y);
  end;
end;

編集 削除
るるとん@K  2004-04-24 17:50:20  No: 8589  IP: 192.*.*.*

多重送信でした、すみません  わざわざ注意まで書いてあるのに・・・

編集 削除
通りすがり  2004-04-24 19:09:19  No: 8590  IP: 192.*.*.*

>るるとん@Kさん
上のコード、一回でも実行してみた?

編集 削除
るるとん@K  2004-04-24 19:21:37  No: 8591  IP: 192.*.*.*

>上のコード、一回でも実行してみた?
上が多すぎて分かりません

編集 削除
るるとん@K  2004-04-24 19:24:42  No: 8592  IP: 192.*.*.*

あ、そうですね。ポップアップの処理がありました

編集 削除
Mr.XRAY  URL  2004-04-25 00:17:07  No: 8593  IP: 192.*.*.*

るるとん@Kさん,

>上のコード、一回でも実行してみた?

これはですね.ご自分がUPしたコードを実際に動作確認してからUPした
のですか,ということです.確認していないコードをUPすると,質問
した方の手間が増えてしまいますよね(前にも同様のレスを書きました)

>上が多すぎて分かりません

実際には,るるとん@Kさんのが3つ,ふぐちゃんさんのが1つです.
これが多すぎるというのであれば,このコードを試す人も大変ですね.
せっかく指摘してくださった,通りすがりさんにちょっと失礼な
感じがします.

>なんかしなくても、引数のXとYを使えば出来ます

多分,るるとん@Kさんの作成するアプリでは,このコードを使用するかも
知れませんが,わたしだったら,ふぐちゃんさんのコードを使用します.
やっぱりユーザインターフェイスは重要ですから.

以上,ゴミレスで申し訳ない.年配者のたわごとです>ALL

編集 削除
るるとん@K  2004-04-25 07:35:08  No: 8594  IP: 192.*.*.*

要するに、
   GetCursorPos(PS);
で取得した座標をScreenToClienするよりも
ポップアップ位置のときに
ひき数XとYをClientToScreenしたほうが、
   GetCursorPos(PS);
をしなくてすむかと思います
以上 中学生のたわごとですn(__)n

編集 削除
通りすがり  2004-04-25 07:56:00  No: 8595  IP: 192.*.*.*

>るるとん@Kさん
あなたは自分が書いた下のコードを一回でも実行してみたの?

procedure TForm1.FileListBox1MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  i: Integer;
begin
  if Button = mbRight then
  begin
    i := FileListBox1.ItemAtPos(Point(X,Y), True);
    if i <> -1 then
      FileListBox1.ItemIndex := i;
    PopupMenu1.Popup(X, Y);
  end;
end;

編集 削除
るるとん@K  2004-04-25 09:39:33  No: 8596  IP: 192.*.*.*

ポップアップがずれるところを
クライアントトゥスクリーンにすれば良いです

編集 削除
諜惱衿リ  2004-04-25 09:50:09  No: 8597  IP: 192.*.*.*

プログラムより先に
日本語やマナーを勉強したほうが
いいんしゃないですか?るるとん@Kさん

編集 削除
通りすがり  2004-04-25 10:40:17  No: 8598  IP: 192.*.*.*

>ポップアップがずれるところを
>クライアントトゥスクリーンにすれば良いです
それはわかってますが、そうじゃなくて自分がテストもしてないコードを
ポストするのはやめてくれと言いたいの。
それとよく知らないことにテキトウなレスをするのも。
質問した人はかなり混乱するよ。
このスレッドでのあなたの回答がよい例。
あなたがテキトウな回答をしたんで質問者は悩んだと思うよ。
あなたが質問したときに同じことをされたらいやでしょ?
質問者は真剣に質問してるんだからまじめに考えてテストしてから回答しようよ。

編集 削除
ふぐちゃん  2004-04-25 13:26:57  No: 8599  IP: 192.*.*.*

るるとん@Kさんに指摘していただいたので、
引数を利用する方法を書いておきます。

procedure TForm1.FileListBox1MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  i: Integer;
  P: TPoint;
begin
  if Button = mbRight then
  begin
    i := FileListBox1.ItemAtPos(Point(X, Y), True);
    if i <> -1 then
      FileListBox1.ItemIndex := i;
    P := FileListBox1.ClientToScreen(Point(X, Y));
    PopupMenu1.Popup(P.X, P.Y);
  end;
end;

編集 削除