StringGridコンポーネントの行と列の数をマウス操作で増減できるようにして
あるソフトを見た事があります。(Delphiで開発したと言ってた)
マウスでコンポーネントの右下をクリックしたまま、マウスを動かしていた
ように思います。
自分もこれと同じ事をしたいのですが、ヘルプもだいぶ読んだけど、その方法
に行き当たりません。と言うか、見つけられません。
どなたか御教授をお願い致します。
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;
これはこれは、かなり大変な事なのですね。
そんな気はしてましたが・・・。
頂いたサンプルコードを分析して勉強してみます。
にしのさん。ありがとうございました。
ツイート | ![]() |