Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-77593
Kiko
2002-05-21 14:56
2002.06.24
Помогите организовать структуру БД


7-77621
Dr.Den.
2002-03-17 14:09
2002.06.24
PS/2 Mouse


14-77558
Malder
2002-05-14 19:37
2002.06.24
Master Of Magic & Windows


1-77331
Georg
2002-06-12 17:21
2002.06.24
проблемы с DLL


1-77496
koty
2002-06-07 09:26
2002.06.24
Help по Дельфи





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский