FileListBoxで右クリックしたとき、そのファイル名を選択状態にし、
右クリックメニューを表示させたいのですが、
選択状態にするのがどうも上手くやる方法がわかりません。
マウスの左クリックを処理させれば同様のことができるかと思ったものの
その処理もどう書けばいいか調べてもなかなかわかりませんでした。。
お願いします。。
マウスの位置を取得して、その位置をScreenToClientして、
さらに、ListBoxのアイテムの高さで割って・・・
ItemIndexに代入してはどうでしょう?
すいません、どのように書けばいいかわかりませんでした(;´Д`)
もう少し詳しく教えてもらえないでしょうか、、すみません。。
メニューを表示時に選択するならこうです
procedure TForm1.PopupMenu1Popup(Sender: TObject);
var
APoint:TPoint;
begin
APoint:=ListBox1.ScreenToClient(PopupMenu1.PopupPoint);
ListBox1.ItemIndex:=(APoint.Y div ListBox1.ItemHeight);
end;
です
こっちの方がいいかも
procedure TForm1.ListBox1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
ListBox1.ItemIndex:=(Y div ListBox1.ItemHeight);
end;
ありがとうございます。できました。
どのような処理をしているのかいまだに理解できていませんが
少しづつ覚えていこうと思います。
リストボックスの何番目を選択しているか:=クリックされたボックス内の上からの位置÷リストボックスで1行表示するのに使う高さ;
です
今気づいたんですがファイルが多くてスクロールバーが出ていると
ずれてしまうようですね。。
そこら辺は自分への課題として何とかしてみます。
ありがとうございました。
Markさんに質問なのですが、Markさんが作っているソフトの仕様では、
TFileListBox内でリストが表示されていない部分(空白の領域)で
ユーザーが右クリックしたときに、ポップアップメニューは
表示されるのですか?
はい、表示されます。
それだと空白の部分を右クリックしたときItemIndexに問題がありますかね、やっぱ。。
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;
すごい、、バッチリです。
どういう処理をしているのかヘルプを読みながら
必死に考えてみようと思います。
ありがとうございました。
ふぐちゃんさん、
>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;
ふぐちゃんさん、
>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さん
上のコード、一回でも実行してみた?
>上のコード、一回でも実行してみた?
上が多すぎて分かりません
あ、そうですね。ポップアップの処理がありました
るるとん@Kさん,
>上のコード、一回でも実行してみた?
これはですね.ご自分がUPしたコードを実際に動作確認してからUPした
のですか,ということです.確認していないコードをUPすると,質問
した方の手間が増えてしまいますよね(前にも同様のレスを書きました)
>上が多すぎて分かりません
実際には,るるとん@Kさんのが3つ,ふぐちゃんさんのが1つです.
これが多すぎるというのであれば,このコードを試す人も大変ですね.
せっかく指摘してくださった,通りすがりさんにちょっと失礼な
感じがします.
>なんかしなくても、引数のXとYを使えば出来ます
多分,るるとん@Kさんの作成するアプリでは,このコードを使用するかも
知れませんが,わたしだったら,ふぐちゃんさんのコードを使用します.
やっぱりユーザインターフェイスは重要ですから.
以上,ゴミレスで申し訳ない.年配者のたわごとです>ALL
要するに、
GetCursorPos(PS);
で取得した座標をScreenToClienするよりも
ポップアップ位置のときに
ひき数XとYをClientToScreenしたほうが、
GetCursorPos(PS);
をしなくてすむかと思います
以上 中学生のたわごとですn(__)n
>るるとん@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さん
>ポップアップがずれるところを
>クライアントトゥスクリーンにすれば良いです
それはわかってますが、そうじゃなくて自分がテストもしてないコードを
ポストするのはやめてくれと言いたいの。
それとよく知らないことにテキトウなレスをするのも。
質問した人はかなり混乱するよ。
このスレッドでのあなたの回答がよい例。
あなたがテキトウな回答をしたんで質問者は悩んだと思うよ。
あなたが質問したときに同じことをされたらいやでしょ?
質問者は真剣に質問してるんだからまじめに考えてテストしてから回答しようよ。
るるとん@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;
ツイート | ![]() |