TListView のスクロール量(ピクセル値)の取得について

解決


ひろ  2007-06-23 13:17:22  No: 26806

はじめまして、ひろ と申します。

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;


  2007-06-23 15:34:06  No: 26807

クリックしたヘッダーの直下に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;


ひろ  2007-06-24 01:08:36  No: 26808

ぺ さん、ご回答ありがとうございます。
期待していた動作が確認できました。

GetScrollPos 関数はピクセル値を返すで当っていたんですね。
そのピクセル値をグローバル画面座標に足しておりました。^^;

ListView_GetHeader関数でカラムヘッダーのハンドルを取得して
Header_GetItemRect関数で指定したカラムのTRectを取得する。

カラムのWidth を足しこむ必要はなかったのですね。
とても勉強になりました。
有難うございました。


ひろ  2007-06-26 05:40:48  No: 26809

解決マーク忘れておりました。
有難うございました。


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

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






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