Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.06.09;
Скачать: CL | DM;

Вниз

Как в 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.022 c
6-26642
Сергей
2003-04-07 00:25
2003.06.09
создание своего WinPopup а


7-26793
Wizd
2003-04-01 10:26
2003.06.09
Как заставить прогу работать до ввода логина и пароля? Win2000ser


1-26522
Jaxtor
2003-05-27 16:17
2003.06.09
Динамический TComboBox


1-26483
-= Demon =-
2003-05-29 14:27
2003.06.09
Запуск DOS-окна


7-26824
VR
2003-04-05 04:18
2003.06.09
CD-ROM