はじめまして、ひろ と申します。
TListViewでExcelの抽出機能のようなものを自前で作って見たのですが
スクロールすると正常な位置(クリックされたカラムの左側を合わせる)に
抽出フォームが表示されません。(スクロールしなければ問題ありません)
Q1. ListViewの横スクロール量をピクセル値で取得するにはどうすればよいでしょうか?
Q2. ListViewのヘッダーカラムの高さはどのように取得するのでしょうか?
以上、宜しくお願いします。
procedure TfrmMain.ListViewColumnClick(Sender: TObject; Column: TListColumn);
var
Pt, DlgPt: TPoint;
ColLeft: Integer;
ScrollPos: Integer;
begin
//ListViewのスクロール位置の取得
ScrollPos := GetScrollPos(ListView.Handle, SB_HORZ);
//クリックされたカラムの左側座標の取得
ColLeft := GetColumnLeft(Column.Index-1);
//ListViewのクライアント領域座標をグローバルな画面座標に変換
Pt := ListView.ClientToScreen(Point(ColLeft, 0));
//DlgPt.X := Pt.X + ScrollPos; ←ListViewの横Scroll量(ピクセル値)?
//DlgPt.Y := Pt.Y+17 ←17は固定でカラム高さを足しています
//抽出ダイアログの表示
with frmDlgExtract do begin
Left := DlgPt.X;
Top := DlgPt.Y;
ShowModel;
end;
end;
//クリックされたカラムの左側座標の取得
function TfrmMain.GetColumnLeft(ColIndex: Integer): Integer;
var
i: Integer;
begin
Result := 0;
for i:=0 to ColIndex do
Result := Result + ListView.Columns[i].Width;
end;
クリックしたヘッダーの直下にFormを出せばいいのかな?
uses CommCtrl;
procedure TForm1.ListView1ColumnClick(Sender: TObject;
Column: TListColumn);
var
x, y: Integer;
pt: TPoint;
f2: TForm;
hHeader: HWND;
R: TRect;
begin
hHeader:= ListView_GetHeader(ListView1.Handle);
Header_GetItemRect(hHeader, Column.Index, @R);
x:= R.Left -GetScrollPos(ListView1.Handle, SB_HORZ);
y:= R.Bottom-R.Top;
pt:= ListView1.ClientOrigin;
f2:= TForm.Create(self);
with f2 do
try
parent:= self.Parent;
SetBounds(pt.X+x, pt.Y+y, Width, Height);
ShowModal;
finally
Release;
end;
end;
ぺ さん、ご回答ありがとうございます。
期待していた動作が確認できました。
GetScrollPos 関数はピクセル値を返すで当っていたんですね。
そのピクセル値をグローバル画面座標に足しておりました。^^;
ListView_GetHeader関数でカラムヘッダーのハンドルを取得して
Header_GetItemRect関数で指定したカラムのTRectを取得する。
カラムのWidth を足しこむ必要はなかったのですね。
とても勉強になりました。
有難うございました。
解決マーク忘れておりました。
有難うございました。
ツイート | ![]() |