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

解決


Mark  2004-04-25 00:23:21  No: 8575

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

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


るるとん@K  2004-04-25 00:26:59  No: 8576

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


Mark  2004-04-25 00:34:22  No: 8577

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


るるとん@K  2004-04-25 00:37:17  No: 8578

メニューを表示時に選択するならこうです
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-25 00:41:45  No: 8579

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


Mark  2004-04-25 00:44:50  No: 8580

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


るるとん@K  2004-04-25 00:49:28  No: 8581

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

です


Mark  2004-04-25 01:02:29  No: 8582

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


ふぐちゃん  2004-04-25 01:12:55  No: 8583

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


Mark  2004-04-25 01:18:21  No: 8584

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


ふぐちゃん  2004-04-25 01:44:34  No: 8585

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-25 02:43:13  No: 8586

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


るるとん@K  2004-04-25 02:49:20  No: 8587

ふぐちゃんさん、
>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-25 02:49:26  No: 8588

ふぐちゃんさん、
>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-25 02:50:20  No: 8589

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


通りすがり  2004-04-25 04:09:19  No: 8590

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


るるとん@K  2004-04-25 04:21:37  No: 8591

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


るるとん@K  2004-04-25 04:24:42  No: 8592

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


Mr.XRAY  URL  2004-04-25 09:17:07  No: 8593

るるとん@Kさん,

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

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

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

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

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

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

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


るるとん@K  2004-04-25 16:35:08  No: 8594

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


通りすがり  2004-04-25 16:56:00  No: 8595

>るるとん@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 18:39:33  No: 8596

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


諜惱衿リ  2004-04-25 18:50:09  No: 8597

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


通りすがり  2004-04-25 19:40:17  No: 8598

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


ふぐちゃん  2004-04-25 22:26:57  No: 8599

るるとん@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;


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加