Форум: "Основная";
Текущий архив: 2003.06.09;
Скачать: [xml.tar.bz2];
ВнизКак в StringGreed поместить CheckBox? Найти похожие ветки
← →
Lin (2003-05-29 14:05) [0]Хочу колонку в StringGeed с CheckBox чтобы иметь возможность выделять определенные строки
Как это можно сделать?
← →
pasha_golub (2003-05-29 14:23) [1]Создаешь ЧекБокс, родителем устанавливаешь Грид, размеры и положение подгоняешь под размеры ячейки, назначаешь обработчики событий и т.д.
← →
Lin (2003-05-29 14:27) [2]А пример можно: а то надо быстро.
Спасибо
← →
Кулюкин Олег (2003-05-29 14:30) [3]DrawFrameControl
Пример на Королевстве Дельфи в резделе Hello, World! в статье
"Разноцветный DBGrid"
← →
Lin (2003-05-29 14:35) [4]Не могу зайти на страничку. говорит неавторизован
← →
Кулюкин Олег (2003-05-29 14:37) [5]Зависло королевство. :(
Не иначе, как Матрица его захватила :))))
Отвиснет...
← →
reonid (2003-05-29 14:41) [6]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;
// Можно также рисовать с помощью DrawFrameControl,
// но для больших прямоугольников слишком маленькая галочка
// получается
// DrawFrameControl(Canvas.Handle, CbRect, DFC_BUTTON, DFCS_BUTTONCHECK {or DFCS_CHECKED});
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;
← →
Lin (2003-05-29 14:44) [7]Большое вам спасибо, добрые люди.
← →
MegaVolt (2003-05-29 15:01) [8]Я делал так:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var
r1:TRect;
begin
if StringGrid1.Cells[0,ARow]<>"" // проверяем есть ли в строке значение
then
with StringGrid1.Canvas do
begin
case StringGrid1.Cells[0,Arow][1] of
"N":
begin
Brush.Color:=BgFontNew; // выставляем цвет и фон в заыисимости от первого элемента в нулевой колонке
Font.Color:=ClFontNew
end;
"C":
begin
Brush.Color:=BgFontChange;
Font.Color:=ClFontChange;
end;
"R":
begin
Brush.Color:=BgFontRename;
Font.Color:=ClFontRename;
end;
"O":
begin
Brush.Color:=BgFontStar;
Font.Color:=ClFontStar;
end;
"D":
begin
Brush.Color:=BgFontDel;
Font.Color:=ClFontDel;
end;
"M":
begin
Brush.Color:=BgFontMove;
Font.Color:=ClFontMove;
end;
end;
FillRect(Rect);
if ACol=1 then TextOut(Rect.Left+2,Rect.Top,StringGrid1.Cells[ACol, ARow]);
if ACol=0
then
R1.Left:=Rect.Left+1;
R1.Top:=Rect.Top+1;
R1.Right:=Rect.Right-1;
R1.Bottom:=Rect.Bottom-1;
case StringGrid1.Cells[0,Arow][2] of //В зависимости от второго элемента рисуем CheckBox
"C":DrawFrameControl(StringGrid1.Canvas.Handle,R1,DFC_BUTTON,DFCS_BUTTONCHECK+DFCS_CHECKED);
"N":DrawFrameControl(StringGrid1.Canvas.Handle,R1,DFC_BUTTON,DFCS_BUTTONCHECK);
end;
end;
end;
procedure TForm1.StringGrid1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
x1,y1:integer;
z:PFileData;
begin
StringGrid1.MouseToCell(x,y,x1,y1);
if (StringGrid1.Cells[0,y1]<>"") and (x1=0) //если нахдимся над CheckBox-ом то:
then
begin
case StringGrid1.Cells[0,y1][2] of
"C":StringGrid1.Cells[0,y1]:=StringGrid1.Cells[0,y1][1]+"N";
"N":StringGrid1.Cells[0,y1]:=StringGrid1.Cells[0,y1][1]+"C";
end;
end;
StringGrid1.Invalidate;
end;
end;
Само собой варианты хранения положения CheckBox-a могут быть и другими
← →
McSimm2 (2003-05-29 15:21) [9]>> To MegaVolt
поясни плиз значение строки
StringGrid1.Cells[0,Arow][2]
^^^ это как ?
← →
MegaVolt (2003-05-29 15:47) [10]Взять из ячейки с координатами 0 по X и Arow по Y (это значение передаётся в нашу функцию при её вызове) вторую букву.
← →
McSimm2 (2003-05-29 15:53) [11]ага я понял уже - что то по началу протормозил немного...
← →
Vit@ly (2003-05-29 16:14) [12]Возможно удобнее вместо StringGrid воспользоваться ListView?
← →
MegaVolt (2003-05-30 09:53) [13]Он тормозит сильно при добавлении больших объёмов информации
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.06.09;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.01 c