Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вот не пойму


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

кто?


Наверх

Титульная страница Поиск, карта сайта Написать письмо