Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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 переводят как Часики



Страницы: 1 вся ветка

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

Наверх




Память: 0.47 MB
Время: 0.005 c
1-159
ded_di
2002-03-19 09:43
2002.04.01
Графические файлы


6-275
Satrap
2002-01-18 16:04
2002.04.01
Обработка искл. ситуаций в сокетах


3-13
Bura
2002-03-05 17:50
2002.04.01
Select в IB


3-14
vasilly
2002-03-06 10:26
2002.04.01
Помогите примером!!! Как получить выходные параметры хранимой процедуры!!!


1-209
Evgenyk
2002-03-10 16:35
2002.04.01
Как программно получить данные о версии файла ?





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