![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вот не пойму
Recurse © (2010-12-23 09:46:00)Создаю в процессе выполнения программы экземпляр TBUTTON, в перерисовке TDBGRID я их рисую по ячейкам.
if Field.Name = 'Edite' then
begin
New (PBtn);
PBtn := Ptr(Field.AsInteger);
with PBtn^ do
begin
BoundsRect := Rect;
Name := 'EditButton'+IntToStr(DataModule2.cdsRecords.FieldByName('ID').AsInteger);
Tag := DataModule2.cdsRecords.FieldByName('ID').AsInteger;
caption := 'Ðåäàêòèðîâàòü' ;
OnClick := Self.OnClickButton; // x
Parent := DBGrid1;
end;
end;
Не вызывается обработчик OnClickButton
procedure TMDIChild.OnClickButton(Sender : TObject);
begin
ShowMessage( IntToStr(TButton(Sender).Tag));
end;
KSergey (2010-12-23 10:35:00) [1]> brother © (23.12.10 10:28) [11]
> > оно вообще компилиться не должно...
> погорячился (ну и форматирование)
Конечно не должно. Вот это, наример
FindComponent('EditButton'+ ...)
Ну и эта, статью прочитать бы и осмыслить для начала надо, а не тупо код закопировать.
Вы на каждуюотрисовку грида (вы вообще понимаете сколько отрисовок происходит?) создаете экземпляр кнопки!
Это вы понимаете? brother © гы [15]! не обратил внимания на DBGrid1DrawDataCell sniknik © поменяй парента на панель... грид не обязан передавать сообщения своим "деткам", не предусмотрен для этого (наверное модно поправить, но не до этого). brother © Алексей! Прочитай ПОЛНОСТЬЮ всю статью! Потом попробуй сам (без статьи) реализовать: Создание 5 кнопок, обработку на клик их, и УНИЧТОЖЕНИЕ!
Пока, я думаю, ты не понимаешь, что делаешь... KSergey © Если не ошибаюсь, без написания наследника грида кнопки встроить вообще нельзя, т.к. нет готового события добавления/удаления строк из грида. А именно в нем надо создавать (и удалять, к стати!). Особенно это касается DBGrid'а.
Возьмите любой готовый грид, в котором уже есть реализована готовая возможность включать кнопки в нужных ячейках просто установкой свойства.
Например, возьмите набор компонентов EhLib sniknik © > наверное модно поправить
можно, а не модно конечно.
но все одно простейший путь сделать подложкой панель. Recurse У меня компилиться, поэтому ваши выпады совершенно не имеют отношения к делу. Проверьте настройки своего компилятора.
Вот пример из хелпа по FindComponent:
TEdit(FindComponent(NamePrefix + IntToStr(i)))
> Вы на каждую отрисовку грида (вы вообще понимаете сколько
> отрисовок происходит?) создаете экземпляр кнопки!
Нет, не должно происходить , потому что FindComponent стоит
а ты думаешь оно идеально?
У меня в IDE всё кошерно. При переносе в Memo на форуме расползается. brother © те у тебя все гуд? Recurse
> те у тебя все гуд?
Стараюсь всегда соблюдать форматирование! brother © удачи! KSergey © > sniknik © (23.12.10 10:37) [17]
> грид не обязан передавать сообщения своим "деткам", не предусмотрен для этого
Реально?! от сцуко...
> поменяй парента на панель...
Как-то я идею с панелью не понимаю. Куда ее сувать? ТС ведь хочет кнопку в ячейку грида засунуть. Ega23 ©
> brother © (23.12.10 10:41) [18]
> Создание 5 кнопок, обработку на клик их, и УНИЧТОЖЕНИЕ!
А чё вы все на уничтожение-то зацепились?
Да, у товарища код корявый, но мемлика быть не должно. Да и не будет.
А если ClientDataSet не переоткроет, то вообще ничего страшного не случится.
2 Recurse
TButton.BringToFront;brother © Я предлагаю, создать РАБОЧИЙ код, а потом привязывать к гриду... KSergey © > Ega23 © (23.12.10 10:52) [26]
> 2 Recurse
> TButton.BringToFront;
Как это поможет? Я так понял, что кнопка отрисовывается, но OnClick не приходит.
Возможно, sniknik © (23.12.10 10:37) [17] прав. sniknik © > ТС ведь хочет кнопку в ячейку грида засунуть.
панель на грид, кнопку на панель.
brother (2010-12-23 10:34:00) [2]> А что не так с форматированием ???
а ты думаешь оно идеально?
например:
begin
BoundsRect := Rect;
Name := 'EditButton'+IntToStr(...);
Tag := DataModule2.cdsRecords.FieldByName('ID').AsInteger;
caption := 'блаблабла';
OnClick := OnClickButton;
Parent := DBGrid1;
end;
Ega23 (2010-12-23 10:31:00) [3]
> Нет эффекта
Что дебаггер показывает?
Recurse (2010-12-23 10:29:00) [4]
> ну и форматирование
А что не так с форматированием ???
brother (2010-12-23 10:28:00) [5]> оно вообще компилиться не должно...
погорячился (ну и форматирование)
Recurse (2010-12-23 10:27:00) [6]
TMDIChild = class(TForm)
...
DBGrid1: TDBGrid;
...
procedure DBGrid1DrawDataCell....
...
private
{ Private declarations }
public
Procedure OnClickButton( Sender : TObject );//как в статье
{ Public declarations }
end;
иprocedure TMDIChild.OnClickButton(Sender : TObject);
begin
ShowMessage( IntToStr(TButton(Sender).Tag));
end;
brother (2010-12-23 10:27:00) [7]> Ну, пусть будет по вашему:
уговорили?)
оно вообще компилиться не должно...
sniknik (2010-12-23 10:25:00) [8]> Я не смог найти этой статьи на "Королевтстве"!!!! Люди, как так? :(
1 "клик" по автору в твоей ссылке, внизу список его статей... одна из них -
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=342
Recurse (2010-12-23 10:25:00) [9]Ну, пусть будет по вашему:
procedure TMDIChild.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
Field: TField; State: TGridDrawState);
var EmptySet : TGridDrawState;
var Buttons : array [0..10] of TBUTTON ;
begin
...
if Field.Name = 'Edite' then
begin
if FindComponent('EditButton'+...)=nil then
begin
Buttons[DataModule2.cdsRecords.RecNo] := TButton.Create( Self );
with Buttons[DataModule2.cdsRecords.RecNo] do
begin
BoundsRect := Rect;
Name := 'EditButton'+IntToStr(...);
Tag := DataModule2.cdsRecords.FieldByName('ID').AsInteger;
caption := 'блаблабла';
OnClick := OnClickButton;
Parent := DBGrid1;
end;
end;
end;
end;
Нет эффекта
KSergey (2010-12-23 10:09:00) [10]New (PBtn);
PBtn := Ptr(Field.AsInteger);
with PBtn^ do
Это что за ужос?!
Почитайте вот тут
http://www.delphisources.ru/pages/faq/base/rtti_life.html
ЗЫ
Я не смог найти этой статьи на "Королевтстве"!!!! Люди, как так? :(
Recurse (2010-12-23 09:57:00) [11]>> имя формы = TMDIChild ?
так точно
И еще попытался назначить обработчик в DataModule , вот :
procedure TDataModule2.cdsRecordsCalcFields(DataSet: TDataSet);
var PBtn : PBUTTON;
begin
if cdsRecords.FieldByName('Ðåäàêòèðî 226;àòü') nil then
begin
if cdsRecords.FieldByName('Ðåäàêòèðî 226;àòü').AsInteger = 0 then
begin
New (PBtn);
PBtn^ := TButton.Create(Self);
with PBtn^ do
begin
OnClick := DataModule2.OnClick1; // x
end;
cdsRecords.FieldByName('EditButton').AsInteger := Integer(PBTN);
end;
end;
end;
Медвежонок ХМЛ (2010-12-23 09:52:00) [12]Не вызывается обработчик OnClickButton
Потому что он не назначен на кнопку
Recurse (2010-12-23 09:50:00) [13]self == Имя_формы
brother (2010-12-23 09:50:00) [14]имя формы = TMDIChild ?
brother (2010-12-23 09:48:00) [15]> Self
кто?