Форум: "Основная";
Текущий архив: 2002.06.24;
Скачать: [xml.tar.bz2];
ВнизCheckBox in StringGrid Найти похожие ветки
← →
ValeX (2002-06-13 14:49) [0]Прикрутил чекбоксы к стринггриду, но когда скролбаром выбираю
строку, они остаються на месте, а надо чтобы двигались вместе
со строкой. Облом по координатам...
Может как-то проще можно?
P.S. или компонент, аля stringgrid, чтобы были чекбоксы;
← →
Lusha (2002-06-13 15:05) [1]Для начала просто рисуйте его (Check box) в обработчике OnDrawCell. Потом анализируйте координаты курсора мыши при клике и вычисляйте, а не попал ли он на нарисованный Check box... и все дела...
← →
MBo (2002-06-13 15:28) [2]SG1 - StringGrid
procedure TForm1.FormCreate(Sender: TObject);
var cb:TCheckBox;
i:integer;
begin
for i:=1 to SG1.RowCount-1 do begin
cb:=TCheckBox.Create(self);
cb.Parent:=self;
cb.width:=12;
cb.tag:=I;
cb.Caption:="";
cb.color:=SG1.Color;
cb.Visible:=(i in [SG1.TopRow..SG1.TopRow+SG1.VisibleRowCount-1]);
cb.onClick:=CheckBox1Click;
SG1.Cols[3].Objects[i]:=cb;
end;
end;
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
if TCheckBox(Sender).Checked then
Sg1.Cells[3,TCheckBox(Sender).Tag]:="Ку-Ку"
else
Sg1.Cells[3,TCheckBox(Sender).Tag]:="Тссс...";
end;
procedure TForm1.SG1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
if (ACol=3) and (ARow>0) then begin
TCheckBox(SG1.Cols[3].Objects[ARow]).top:=SG1.top+Rect.Top+5;
TCheckBox(SG1.Cols[3].Objects[ARow]).left:=SG1.left+Rect.right-12;
end;
end;
procedure TForm1.SG1TopLeftChanged(Sender: TObject);
var i:integer;
begin
for i:=1 to SG1.RowCount-1 do
TCheckBox(SG1.Cols[3].Objects[i]).Visible:=
(SG1.LeftCol<=3) and (i in [SG1.TopRow..SG1.TopRow+SG1.VisibleRowCount-1]);
end;
← →
Бурундук (2002-06-13 18:36) [3]Вариант с рисованием рисованием чекбоксов:
(Мне лично он больше нравится)
const
CheckBoxCol = 2;
imgChecked = 0;
{---------------------------------------------------------------}
function GetCheckBoxRect(CellRect: TRect): TRect;
begin
Result := Classes.Rect(0, 0, 16, 16);
OffSetRect(Result, CellRect.Left + 4, CellRect.Top + 4);
end;
function CheckBoxValue(ACol, ARow: Integer): Boolean;
begin
Result := Form1.SGrid.Cells[ACol, ARow] = "True";
end;
function SwitchCheckBox(ACol, ARow: Integer): TRect;
begin
with Form1.SGrid do
if Cells[Col, Row] = "True" then Cells[Col, Row] := "False"
else Cells[Col, Row] := "True";
end;
{---------------------------------------------------------------}
procedure TForm1.FormCreate(Sender: TObject);
begin
SGrid.DefaultDrawing := False;
end;
procedure TForm1.SGridDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var CbRect: TRect;
begin
with Sender as TStringGrid do
begin
Canvas.Font.Color := clBlack;
if (gdFixed in State) then
Canvas.Brush.Color := clBtnFace
else if (gdSelected in State) and (not (gdFocused in State)) then
begin
Canvas.Brush.Color := clHighlight;
Canvas.Font.Color := clWhite;
end else
Canvas.Brush.Color := Color;
Canvas.FillRect(Rect);
if (ACol = CheckBoxCol)and(ARow >= FixedRows) then
begin
// CheckBox
CbRect := GetCheckBoxRect(Rect);
Canvas.Brush.Color := Color;
Canvas.FillRect(CbRect);
DrawEdge(Canvas.Handle, CbRect, EDGE_SUNKEN, BF_RECT);
if CheckBoxValue(ACol, ARow) then
begin
Canvas.Pen.Width := 2;
Canvas.Pen.Color := clBlack;
Canvas.MoveTo(CbRect.Left+2, CbRect.Top+6);
Canvas.LineTo( (CbRect.Left + CbRect.Right-2) div 2, CbRect.Bottom-5);
Canvas.LineTo(CbRect.Right-3, CbRect.Top+5);
InflateRect(CbRect, -2, -2);
Canvas.FrameRect(CbRect);
// Вместо этого можно хранить изображение галочки в ImageList
// ImgList.Draw(Canvas, CbRect.Left, CbRect.Top, imgChecked);
end;
end else
begin
// Text
Canvas.TextRect(Rect, Rect.Left+2, Rect.Top+2, Cells[ACol, ARow]);
end;
if gdFixed in State then DrawEdge(Canvas.Handle, Rect, BDR_RAISEDINNER, BF_RECT);
if (gdFocused in State) then Canvas.DrawFocusRect(Rect);
end;
end;
procedure TForm1.SGridMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
DownCol, DownRow: Integer;
Rect, CbRect: TRect;
begin
with Sender as TStringGrid do
begin
MouseToCell(X, Y, DownCol, DownRow);
if (DownCol = CheckBoxCol)and(DownRow >= FixedRows) then
begin
Rect := CellRect(DownCol, DownRow);
CbRect := GetCheckBoxRect(Rect);
if PtInRect(CbRect, Point(X, Y)) then SwitchCheckBox(DownCol, DownRow);
end;
end;
end;
procedure TForm1.SGridSelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
begin
with Sender as TStringGrid do
if ACol = CheckBoxCol then Options := Options - [goEditing]
else Options := Options + [goEditing];
end;
procedure TForm1.SGridKeyPress(Sender: TObject; var Key: Char);
begin
with Sender as TStringGrid do
if (Key = " ") and (Col = CheckBoxCol)and(Row >= FixedRows) then
SwitchCheckBox(Col, Row);
end;
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.06.24;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.007 c