Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.013 c
1-26534
Some_Newbie
2003-05-27 20:08
2003.06.09
Эмуляция нажатия клавиш для конкретного процесса.


1-26484
tv
2003-05-29 12:06
2003.06.09
Печать TStringGrid в виде таблицы


14-26766
Тумар
2003-05-23 09:20
2003.06.09
Есть над чем подумать


7-26814
Юра
2003-04-02 03:16
2003.06.09
Сканер штрих-кода


14-26697
Михайлов Антон
2003-05-25 14:32
2003.06.09
Delphi7





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский