StringGridコンポーネントの行と列の数をマウスでコントロールするには?


浪花恋しぐれ  2003-05-04 15:57:47  No: 3480

StringGridコンポーネントの行と列の数をマウス操作で増減できるようにして
あるソフトを見た事があります。(Delphiで開発したと言ってた)
マウスでコンポーネントの右下をクリックしたまま、マウスを動かしていた
ように思います。
自分もこれと同じ事をしたいのですが、ヘルプもだいぶ読んだけど、その方法
に行き当たりません。と言うか、見つけられません。
どなたか御教授をお願い致します。


にしの  2003-05-04 20:35:49  No: 3481

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;


浪花恋しぐれ  2003-05-05 02:24:19  No: 3482

これはこれは、かなり大変な事なのですね。
そんな気はしてましたが・・・。
頂いたサンプルコードを分析して勉強してみます。

にしのさん。ありがとうございました。


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

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






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