Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.01;
Скачать: [xml.tar.bz2];




Вниз

Проблема с встроенным в TStringGrid чекбоксом ! 


kolobok   (2002-03-21 12:33) [0]

Может, кто мне поможет ? У меня такая проблема:
Хочу, чтобы в компоненте TStringGrid в третьей колонке содержались CheckBox"ы
для того чтобы включить/выключить действие описанное в строке.
Проблема же конкретно заключается в следующем:
// Программно создаю TCheckBox
cbOne:=TCheckBox.Create(StringGrid1);
// объявляю родителя CheckBox"а
cbOne.Parent:=StringGrid1;
// в левом верхнем углу он появился.
// Если теперь начать по нему щёлкать, то от него никакой реакции
// Если объявить родителем Form1 или Button1 - никаких проблем
// Пробовал в обработчике OnClick менять Checked, получил бесконечный цикл
// Видимо программное изменение состояния вызывает событие Click->OnClick и далее...
// Немного изловчился и стал обрабатывать событие OnMouseDown для StringGrid1
// В этом обработчике по координатам мыши вычисляется координата ячейки и
// проверяется условие (та ячейка в которой сидит CheckBox или не та), если она
// тогда:
cbOne.Checked:= not cbOne.Checked;
// Работает только, если попадаешь в ячейку. Попадаешь в CheckBox - никакой реакции.

Можно конечно и так приспособиться, но хочется, чтобы всё работало как надо !
И ещё: нет ли у кого хорошего примерчика как в компонент встроить подобное управление типа кнопок, переключателей, выключателей и т.д.
Буду признателен, если вышлете на мыло kolobok11@hotbox.ru



Song   (2002-03-21 12:49) [1]

Может у него Enabled отрицательно? Или выставить самому принудительно..



kolobok   (2002-03-21 13:04) [2]

С Enabled всё в порядке. Я же говорю, стоит только родителем объявить форму или кнопку и всё работает.

С уважением для Song.



Song   (2002-03-21 13:10) [3]

подожди сам попробую



kolobok   (2002-03-21 13:19) [4]

Попробуй Song. По форуму вижу, что человек ты поднаторевший в этом деле, наверняка помочь сможешь. Заранее спасибо.

kolobok11@hotbox.ru



MBo   (2002-03-21 13:21) [5]

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;



Song   (2002-03-21 13:26) [6]

Не получается потому, что на TCheckBox не передаётся фокус ввода. TStringGrid - компонент сам составной, ограничение скорей связано с этим. Если только родителся делать на Form1 или на Self (это одно и тоже будет в данном случае). А координаты назначать чекбоксу самому.



Song   (2002-03-21 13:27) [7]

О-о-о, :)) Я гляжу MBo тебя уже выручил. :)) Оперативен, как всегда. :o



kolobok   (2002-03-21 14:26) [8]

Спасибо МВо за решение, но поскольку разобраться в этом в данный момент слёту не могу, прошу в двух словах объяснить неучу что происходит.

С уважением, kolobok.



MBo   (2002-03-21 14:41) [9]

при создании CheckBox родителем ему назначается форма, а поскольку он позже грида появился, рисуется сверху. В других случаях можно делать BringToFront.
созданный CheckBox вносится в список Objects столбца (можно и в отдельный, но этот-то уже существует)(Cols типа TStrings), Tag -номер строки. OnClick - общий.

С рисованием, видимостью и отработкой клика понятно или объяснить?



kolobok   (2002-03-21 14:58) [10]

МВо, лучше объясни кратенько. Я же говорю - Я НЕУЧ!
А ты, я вижу, МАСТАК! Пару дней подумаю и разберусь наверняка, будет мне наука. А про тебя в хелпе проги упомяну - если доделаю.

С уважением, kolobok.



MBo   (2002-03-21 15:13) [11]

клик - приводим Sender к типу TCheckBox (в общем случае, если событие может быть вызвано объектом другого типа, надо проверять if Sender is TCheckBox), чтобы использовать свойства Checkbox-a

рисование - если колонка нужная, из координат ячейки (в гриде)находим положение чекбокса. Прибавляем коорд. грида, так как положение чекбокса дается относ. родителя - формы.

видимость - если ячейка видна, то и checkBox.
Для колонки можно сделать, как и для ряда,(с поддиапазоном) если они могут быть широкими и только 2 нефикс. помещаются.

Ты конкретнее спрашивай, что именно неясно.



kolobok   (2002-03-21 15:35) [12]

Спасибо МВо!
Теперь я разобрался, с твоей помощью конечно.
Не знаешь ли существует Delphi 6.0 rus или нет?

kolobok.



MBo   (2002-03-21 15:49) [13]

никаких D русских нет. Бывают левые русификации, которые
debug-window Watches переводят как Часики




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.01;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.74 MB
Время: 0.033 c
3-6               Malder                2002-03-05 19:23  2002.04.01  
Как отменить транзакцию в триггере ?


7-333             Filat                 2001-12-29 12:42  2002.04.01  
Оххх, РЕЕСТР! Оххх, ФАЙЛЫ


14-292            Василий               2002-02-16 00:24  2002.04.01  
Хороший водитель может и не знать о том как устроен движек, но классным гонщиком при таком подходе он ни когла не станет!!!


3-41              iea                   2002-03-07 12:20  2002.04.01  
Teкущее значение записи в ADO?


6-278             Velocity              2002-01-17 07:28  2002.04.01  
BROADCAST-пакет в локалке