Home
Top.Mail.Ru Yandeks.Metrika
Forum: "Main";
Current archive: 2002.04.01;
Download: [xml.tar.bz2];

Down

The problem with the built-in checkbox TStringGrid! Find similar branches


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]: = "Ku-Ku"
else
Sg1.Cells [3, TCheckBox (Sender) .Tag]: = "Shhhh ...";
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]

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

Best regards, 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 or not?

kolobok.



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

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



Pages: 1 whole branch

Forum: "Main";
Current archive: 2002.04.01;
Download: [xml.tar.bz2];

Top









Memory: 0.6 MB
Time: 0.024 c
We answer immediately.
Vladimir Lubenchenko
2002-02-15 22:08
2002.04.01
Report Builder Enterprise 6.03 for Delphi 6


We answer immediately.
Malder
2002-03-06 16:58
2002.04.01
Error while query1.edit;


We answer immediately.
LenAk
2002-03-21 07:58
2002.04.01
How to determine which component of the form is the focus?


We answer immediately.
S
2002-03-21 18:02
2002.04.01
Help to hide the form!


We answer immediately.
Romul
2002-01-31 10:44
2002.04.01
Save OpenDialog through API





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 Español 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
English French German Italian Portuguese Russian Spanish