掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
StringGridコンポーネントの行と列の数をマウスでコントロールするには? (ID:3481)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
OnMouseDownイベントで、[ColCount-1,RowCount-1]を右ボタンで押されたら、マウスキャプチャし、「処理開始=true」にする。それ以外は「処理開始=false」 OnMouseMoveイベントで「処理開始=true」ならば、マウスの位置にColCount,RowCountを更新し、Col,RowをそれぞれColCount-1,RowCount-1に設定する。 OnMouseUpイベントで、マウスキャプチャを解放し、「処理開始=false」にする。 とするだけです。 以下はサンプルです。かなり汚いソースですがご容赦を。細かいところはヘルプで確認してくださいね。 # 流れだけつかんでください。「処理開始=true/false」は、「.Tag=1/0」で対処しています procedure TForm1.StringGrid1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var Coord: TGridCoord; begin Coord := TStringGrid(Sender).MouseCoord(X, Y); if (Coord.x=TStringGrid(Sender).ColCount - 1) and (Coord.y=TStringGrid(Sender).RowCount - 1) then with TStringGrid(Sender) do begin if Button = mbRight then begin Tag := 1; Windows.SetCapture(Handle); end else Tag := 0; end; end; procedure TForm1.StringGrid1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var Coord: TGridCoord; begin Coord := TStringGrid(Sender).MouseCoord(X, Y); with TStringGrid(Sender) do begin Tag := 0; Windows.ReleaseCapture; end; end; procedure TForm1.StringGrid1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var Coord, Coord2: TGridCoord; begin Coord := TStringGrid(Sender).MouseCoord(X, Y); if TStringGrid(Sender).Tag = 1 then begin if (Coord.X = -1) or (Coord.Y = -1) then begin //マウスの下にセルはない if X < 0 then begin // StringGridの左方向 if TStringGrid(Sender).LeftCol>0 then TStringGrid(Sender).LeftCol := TStringGrid(Sender).LeftCol - 1; TStringGrid(Sender).ColCount := TStringGrid(Sender).LeftCol; end else begin // StringGridの右方向 // マウスのあるX位置に一番近い、現在表示されている最初の行を使う Coord2 := TStringGrid(Sender).MouseCoord(1, 1); TStringGrid(Sender).Row := Coord2.Y; Coord2 := TStringGrid(Sender).MouseCoord(X, 1); while (Coord2.x = -1) do begin TStringGrid(Sender).ColCount := TStringGrid(Sender).ColCount + 1; Coord2 := TStringGrid(Sender).MouseCoord(X, 1); end; end; if Y < 0 then begin // StringGridの上方向 if TStringGrid(Sender).TopRow>0 then TStringGrid(Sender).TopRow := TStringGrid(Sender).TopRow - 1; TStringGrid(Sender).RowCount := TStringGrid(Sender).TopRow; end else begin // StringGridの下方向 // マウスのあるY位置に一番近い、現在表示されている最初の桁を使う Coord2 := TStringGrid(Sender).MouseCoord(1, 1); TStringGrid(Sender).Col := Coord2.X; Coord2 := TStringGrid(Sender).MouseCoord(1, Y); while (Coord2.y = -1) do begin TStringGrid(Sender).RowCount := TStringGrid(Sender).RowCount + 1; Coord2 := TStringGrid(Sender).MouseCoord(1, Y); end; end; end else begin //マウスの下にセルはある TStringGrid(Sender).ColCount := Coord.X + 1; TStringGrid(Sender).RowCount := Coord.Y + 1; end; TStringGrid(Sender).Col := TStringGrid(Sender).ColCount - 1; TStringGrid(Sender).Row := TStringGrid(Sender).RowCount - 1; end; end;
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.