Здравствуйте все!
по статье из
http://forum.sources.ru "запихнула" CheckBox-ы в Гриду, Как при выборе CheckBox в Гриде узнать его положение в данной сетке? пробовала так:
Код:
procedure TForm1.StringGrid1Click(Sender: TObject);
begin
//Showmessage(IntToStr(StringGrid1.Col));
//Showmessage(IntToStr(StringGrid1.Row));
if (StringGrid1.Objects[StringGrid1.Col,StringGrid1.Row].ClassType =TCheckBox)
then
Showmessage('SheckBox');
-это частично работает, если при добавлении Чекбокса делать его ширину поменьше и ухитриться попасть меду границей Чекбокса и оставшимся пространством ячейки
Привожу полный код:
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, ExtCtrls;
type
TForm1 = class(TForm)
Panel1: TPanel;
StringGrid1: TStringGrid;
CheckBox1: TCheckBox;
procedure FormCreate(Sender: TObject);
procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
procedure CheckBox1Click(Sender: TObject);
Procedure set_checkbox_alignment;
Procedure clean_previus_buffer;
procedure AddCheckBoxes;
procedure StringGrid1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
Procedure AutoVidth(zagolovok:string;Grid:TstringGrid;Col:Integer);
var i:Integer;
begin
i:=Length(zagolovok);
Grid.ColWidths[Col] := i+1;
end;
procedure AutoSizeGridColumn(Grid: TStringGrid; column: integer);
var
i: integer;
temp: integer;
max: integer;
begin
max := 0;
for i := 0 to (Grid.RowCount - 1) do
begin
temp := Grid.Canvas.TextWidth(grid.cells[column, i]);
if temp > max then max := temp;
end;
Grid.ColWidths[column] := Max + Grid.GridLineWidth + 3;
end;
Procedure TForm1.clean_previus_buffer;
var
NewCheckBox: TCheckBox;
i: Integer;
begin
for i := 1 to StringGrid1.RowCount do
begin
NewCheckBox := (StringGrid1.Objects[4,i] as TCheckBox);
if NewCheckBox <> nil then
begin
NewCheckBox.Visible := false;
StringGrid1.Objects[4,i] := nil;
end;
end;
end;
procedure TForm1.AddCheckBoxes;
var
i: Integer;
NewCheckBox: TCheckBox;
NewCheckBox1: TCheckBox;
begin
clean_previus_buffer; // î÷èùàåì íåèñïîëüçóåìûå ÷åêáîêñû...
for i := 1 to 4 do
begin
StringGrid1.Cells[0,i] := 'a';
StringGrid1.Cells[1,i] := 'b';
StringGrid1.Cells[2,i] := 'c';
StringGrid1.Cells[3,i] := 'd';
NewCheckBox := TCheckBox.Create(Application);
NewCheckBox.Width := 0;
NewCheckBox.Visible := false;
NewCheckBox.Caption := '';
NewCheckBox.Color := clWindow;
NewCheckBox.Tag := i;
NewCheckBox.OnClick := CheckBox1.OnClick; //Ñâÿçûâàåì ïðåäûäóùåå ñîáûòèå OnClick
NewCheckBox.Parent := Panel1;
NewCheckBox1:=NewCheckBox;; // ñ ñóùåñòâóþùèì TCheckBox
StringGrid1.Objects[4,i] := NewCheckBox;
//StringGrid1.Objects[5,i] := NewCheckBox1;
StringGrid1.RowCount := i;
end;
set_checkbox_alignment; // ðàñïîëîæåíèå ÷åêáîêñîâ â ÿ÷åéêàõ òàáëèöû...
end;
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
//ShowMessage('There it is!!');
end;
// Çàïîëíÿåì çàãîëîâîê StringGrid
procedure TForm1.FormCreate(Sender: TObject);
begin
StringGrid1.Cells[0,0] := 'Ñîîòâåòñòâèÿ';
AutoSizeGridColumn(StringGrid1,0);
StringGrid1.Cells[1,0] := '1';
StringGrid1.Cells[2,0] := '2';
StringGrid1.Cells[0,1] := '1';
StringGrid1.Cells[0,2] := '2';
StringGrid1.Cells[3,0] := 'Òåêñò ñîîòâåòñâèÿ';
StringGrid1.Cells[4,0] := 'Òåê';
AutoSizeGridColumn(StringGrid1,3);
AutoSizeGridColumn(StringGrid1,4);
AddCheckBoxes; // äîáàâëÿåì ÷åêáîêñû...
end;
Procedure TForm1.set_checkbox_alignment ;
var
NewCheckBox: TCheckBox;
Rect: TRect;
i: Integer;
begin
for i := 1 to StringGrid1.RowCount do
begin
NewCheckBox := (StringGrid1.Objects[4,i] as TCheckBox);
if NewCheckBox <> nil then
begin
Rect := StringGrid1.CellRect(4,i); // ïîëó÷àåì ðàçìåð ÿ÷åéêè äëÿ ÷åêáîêñà
NewCheckBox.Left := StringGrid1.Left + Rect.Left+2;
NewCheckBox.Top := StringGrid1.Top + Rect.Top+2;
NewCheckBox.Width := Rect.Right - Rect.Left;
NewCheckBox.Height := Rect.Bottom - Rect.Top;
NewCheckBox.Visible := True;
end;
end;
end;
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
if not (gdFixed in State) then set_checkbox_alignment;
end;
end.
Спасибо