StringGridのFixedの列幅を変更


たけし  2008-05-21 20:21:33  No: 30761

表題の件ですが、ColSizingをTrueにしておくと通常Cellは列幅の変更ができますが、固定列に関しては列幅の変更ができません。
良い方法がありましたら、お教えいただけないでしょうか?


良い方法?  2008-05-24 02:18:36  No: 30762

真琴:「ねぇ、質問の人は"良い方法があったら"って書いてるけど、"良くない方法"ってあるの?」
海都:「うぅ〜ん、あらゆる条件で不具合がないのが "良い方法"なんだろうけど…とりあえず、コレで」

type
  TStringGrid = class(Grids.TStringGrid)
  private
    HorzOffset: Integer;
    SizingPosX: Integer;
    AnchorPosX: Integer;
    SizingLeft: Integer;
    SizingCol: Integer;
    CurColNum: Integer;
  public
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
    procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
    procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
  end;
type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    .......

procedure TStringGrid.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  inherited;
  if (goColSizing in Options)and(Button = mbLeft) then begin
   SizingCol := CurColNum;
   if SizingCol <> -1 then begin
    SizingPosX := AnchorPosX;
    HorzOffset := SizingPosX - X;
   end;
  end;
end;

procedure TStringGrid.MouseMove(Shift: TShiftState; X, Y: Integer);
var
  i: Integer;
begin
  if not(ssLeft in Shift) then begin
   SizingCol := -1;
   CurColNum := -1;
   Cursor := crDefault;
   if (goColSizing in Options)and(Y < RowHeights[0]) then begin
    AnchorPosX := 0;
    for i:=0 to Pred(FixedCols) do begin
     SizingLeft := AnchorPosX;
     inc(AnchorPosX, ColWidths[i]);
     if (X > AnchorPosX-3)and(X < AnchorPosX+4) then begin
      Cursor := crHSplit;
      CurColNum := i;
      break;
     end;
    end;
   end;
  end;
  if SizingCol <> -1 then begin
   SizingPosX := X + HorzOffset;
   if (X > SizingLeft+4) then begin
    ColWidths[SizingCol] := SizingPosX - SizingLeft;
   end;
  end;
  inherited;
end;

procedure TStringGrid.MouseUP(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if SizingCol <> -1 then begin
   SizingCol := -1;
   Cursor := crDefault;
  end;
  inherited;
end;

procedure TForm1. 〜
........

真琴:「ふ〜ん、こうすれば固定列の幅も広げたり出来るんだネ、カイトさん」
広海:「マコト、もっと、もっと広げてみろよ」
真琴:「あれっ? 固定列をGrid全体に広げたら、その右のセルがスクロールしても出て来なくなったよ? カイトさん」
海都:「あっそうか…、広げる幅の制限を付け加えないと…」

× if (X > SizingLeft+4) then begin
○ if (X > SizingLeft+4)and(X < ClientWidth-16) then begin

広海:「あとぉ〜、Drag途中でキャンセルもしたいよねェ」
真琴:「あッそうよね、それも出来た方が便利よ、カイトさん」
海都:「それなら…、MouseUPイベントにコレ追加すれば、Drag中の右クリックでキャンセル出来るかな…」

  if SizingCol <> -1 then begin
   if (Button = mbRight) then ColWidths[SizingCol] := AnchorPosX - SizingLeft; // コレを追加
   SizingCol := -1;
   Cursor := crDefault;
   ......

真琴:「うん、これでもうイイんじゃない? カイトさん」
海都:「いや、FixedColsは複数でもOKだけど…FixedRowsが複数なら最上行でしかDrag出来ない、あと、条件次第ではゴミが…」
真琴:「えっ、そうなの? じゃぁ、これってまだ"良い方法"じゃないの?」
海都:「ン…まぁ、そうかも…」
春子:「でもぉ、カンペキなのって、作るのも検証するのも大変よね」
海都:「確かに…、プログラムをカンペキに仕上げるのは、時間と手間が必要だョ」
広海:「ダメダメ、カンペキなのを教えてあげなよ」
海都:「そんなヒマないだろぅ」
春子:「そうよ、今日はお客様が多いから、さぁ早く皆で食事の準備しなきゃ」
海都:「じゃぁ、オレは、魚の盛り付けするよ」
春子:「ヨロシクね、マコトとアタシはテーブルの準備よ」
真琴:「は〜い」
海都:「速いよな…、もう半年になるな、正月にココに戻ってから…」
広海:「トシとると時間が経つのが速くなるって、よく言うじゃん」
海都:「違うだろ、楽しい時間はアッという間に過ぎるってコト」
広海:「そういうコト…だネ^^;」
海都:「オレは、もう次の準備始めてるけど…、アンタは? まさか、ココに居付くつもり?」
広海:「それもイイかなぁ…、オレ、ここでサーフィン始めようかと思ってンだ」
海都:「サーフィン? 直前にケガしなきゃ水泳のオリンピック候補トップになれたんだから、やる気出せば次のオリンピック出場も夢じゃないのに」
広海:「オリンピックは、オレの夢なんかじゃないんだよね…、たまたまガキの頃から水泳やらされてただけのコト」
海都:「そうなのか…でも、もったいないな、オレもココが好きで、ズ〜ット居たいとも思う…けど、やっぱり」
広海:「あぁ〜ダメダメ、それじゃ魚の向きが反対」
海都:「えっ、向き? そんなのどっちだってイイだろぅ、偉そうに…」
広海:「盛り付けにも"良い方法"ってのがあるの、それに…ここではオレの方がセンパイ、そういうコト、分かるぅ〜?」


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

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






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