StreingGridにチェックボックスのようなもの

解決


めん  2010-03-16 11:00:12  No: 38039  IP: 192.*.*.*

StreingGridにチェックボックスのようなもの可能ですか?

やりたいことは、各Gridの一つのCellをClickしたらそこにチェックが入ったり、または色がそこだけ変わったりという操作をしたいです。
OnMouseDownイベントなどで処理しなければいけませんかね。
一部分だけに処理をする方法を教えて下さい。

よろしくお願いします。

編集 削除
TS  2010-03-16 13:01:59  No: 38040  IP: 192.*.*.*

コンポーネントで処理しようと思えば
MOStringGrid
https://www.petitmonte.com/bbs/answers?question_id=3815
グリッド寄生コンポーネント
http://park15.wakwak.com/~nam-g/delphi/index.html
等がありますが。

自前で処理しようと思えばOnDrawCellで自分で描画する事に
なると思います、その場合OnDrawCellで検索してみて下さい。

編集 削除
Ru  2010-03-16 13:03:52  No: 38041  IP: 192.*.*.*

昔回答したやり方です。参考にどうぞ。
https://www.petitmonte.com/bbs/answers?question_id=5670

一部だけチェックボックスを表現する為には,ARowとAColを制御してください。
色の変更は掲示板で検索かければサンプルあると思います。

編集 削除
Delphi大好き  2010-03-16 15:08:05  No: 38042  IP: 192.*.*.*

前にここで教えて貰った方法です。
カーソルがあるグリッドを黄色に塗りつぶすサンプルです。
ソフトから抽出してサンプルにしてみました。
ご参考までに・・・

あと、古いDelphi3で記述してますので、ColとRowをAColとARowに書き換える必要があるかも知れません。


var
  Form1: TForm1;
  sw1:boolean=false;
implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
  sw1 := true;
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; Col, Row: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  if sw1 then begin
   StringGrid1.canvas.Brush.Color := clYellow;
          StringGrid1.Canvas.FillRect(rect);
          StringGrid1.Canvas.Font.Color := clBlack;

          drawtext(StringGrid1.canvas.Handle,
            PChar(StringGrid1.cells[col,row]),
            Length(StringGrid1.cells[col,row]),
            rect,DT_LEFT);//WinAPIを使って、セルを正しく再描画
  sw1 := false;
  end;
end;

編集 削除
KHE00221  2010-03-16 21:35:59  No: 38043  IP: 192.*.*.*

こゆうことかな?

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
    if StringGrid1.Objects[ACol,ARow] = Pointer(1) then
    begin
      StringGrid1.OnDrawCell := nil;

      StringGrid1.Canvas.Brush.Color := clRed;
      TStringGridEx(StringGrid1).DrawCell(ACol,ARow,Rect,State);

      StringGrid1.OnDrawCell := StringGrid1DrawCell;
    end;
end;

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
  var CanSelect: Boolean);
begin
    if StringGrid1.Objects[ACol,ARow] = Pointer(0) then
    begin
      StringGrid1.Objects[ACol,ARow] := Pointer(1);
    end
    else
    begin
      StringGrid1.Objects[ACol,ARow] := Pointer(0);
    end;
end;

編集 削除
めん  2010-03-18 08:57:01  No: 38044  IP: 192.*.*.*

みなさん意見ありがとうございます。
DrawCellで選択されたセルの情報に色を描くという形ですね。

ちなみに解決としますが、KHE00221さんのサンプルにある
TStringGridExはないため実行できませんでした。

編集 削除
TS  2010-03-18 09:34:51  No: 38045  IP: 192.*.*.*

>ちなみに解決としますが、KHE00221さんのサンプルにある
>TStringGridExはないため実行できませんでした。
下記の追加行を追加してテストしてみて下さい。

type
  TStringGridEx=class(TStringGrid);  //追加
  TForm1 = class(TForm)

編集 削除
めん  2010-03-19 09:39:54  No: 38046  IP: 192.*.*.*

TSさん
ありがとうございます。
思っていたようにできました。

みなさんありがとうございました

編集 削除