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

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

Присвоение TNotifyEvent [D7]


webpauk ©   (2012-06-22 13:48:00) 

Программно создаю TToolButton и передаю обработчик нажатия. Хочу, чтобы помимо обработчика выполнялся еще небольшой код при нажатии на кнопку.

type
 TMyProc =  Procedure(Sender: TObject) of Object;
...

 public
   procedure Add(const cCaption: String; Icon: TIcon; Prc: TMyProc);
...

procedure TFormpopupMenu.Add(const cCaption: String; Icon: TIcon; Prc: TMyProc);
var
 fT: TToolButton;
begin
 ImageList_ReplaceIcon(ImageList1.Handle, -1, Icon.Handle);

 fT:=TToolButton.Create(Self);
 fT.Caption:=cCaption;
 fT.ImageIndex:=ImageList1.Count-1;
 fT.OnClick:=Prc; {здесь хочу выполнять не только Prc, но и другую обработку}

 ToolBar1.InsertControl(fT);
end;


Подскажите как правильно реализовать


Leonid Troyanovsky   (2012-06-22 16:28:00) [1]


> webpauk ©   (22.06.12 16:20) [13]

> в моем случае - это не упрощение решения, а усложнение.

28 строк твоих (кривых) против 10 правильных.
Можно еще на inherited сэкономить, здесь он не нужен.

--
Regards, LVT.


webpauk   (2012-06-22 16:27:00) [2]

type
 TMyProc =  Procedure(Sender: TObject) of Object;
 TMyButton = class(TToolButton)
   procedure Click; override;
 end;
...

procedure TMyButton.Click;
begin
 TForm(Owner).Hide;
 inherited;
 TForm(Owner).Close;
end;

procedure TFormpopupMenu.Add(const cCaption: String; Icon: TIcon; Prc: TMyProc);
const
 cLen = 20;
var
 fT: TMyButton;
begin
 ImageList_ReplaceIcon(ImageList1.Handle, -1, Icon.Handle);

 fT:=TMyButton.Create(Self);
 fT.Caption:=cCaption;
 fT.ImageIndex:=ImageList1.Count-1;
 fT.OnClick:=Prc;
 ToolBar1.InsertControl(fT);
end;


webpauk   (2012-06-22 16:25:00) [3]

нда... а переписывать тулбар и не надо...
действительно получилось изящнее.

> Leonid Troyanovsky ©   (22.06.12 15:44) [6]

спасибо!


webpauk   (2012-06-22 16:20:00) [4]


> Leonid Troyanovsky ©   (22.06.12 16:13) [12]


в моем случае - это не упрощение решения, а усложнение. неинтересно.


Leonid Troyanovsky   (2012-06-22 16:13:00) [5]


> webpauk ©   (22.06.12 15:58) [8]

> мля... это хорошо для 1 компонента...

Напряги мыслительную мышцу.

> а мне еще и тулбар переписать надо...

Оному не мешает.

--
Regards, LVT.


webpauk   (2012-06-22 16:06:00) [6]

мля... TToolButton(fT).Tag:=Integer(@Prc)


webpauk   (2012-06-22 16:05:00) [7]

прошу прощения...
TToolButton(fT).Tag:=Штеупук(@Prc)


webpauk   (2012-06-22 16:04:00) [8]

лучше уж впихнуть в tag. не знаю только как обработчик правильно из tag вытащить...

TToolButton(fT).Tag:=@Prc
подскажите как обратиться к обработчику который прописан в таге?


webpauk   (2012-06-22 15:58:00) [9]

мля... это хорошо для 1 компонента... а мне еще и тулбар переписать надо...
не... не классно


ProgRAMmer Dimonych   (2012-06-22 15:48:00) [10]

> [6] Leonid Troyanovsky ©   (22.06.12 15:44)

<OffTop>
Фигасе, через 9 лет вспомнить свой ответ на аналогичный вопрос, да ещё и найти его!
</OffTop>


Leonid Troyanovsky   (2012-06-22 15:44:00) [11]


> webpauk ©   (22.06.12 15:26) [2]

> Более интересных вариантов никто не подскажет?

http://groups.google.com/group/fido7.ru.delphi.chainik/msg/01c067cc09ef3ade

--
Regards, LVT.


webpauk   (2012-06-22 15:40:00) [12]

Integer(@Prc) - так наверное...
а обратное преобразование как сделать?


webpauk   (2012-06-22 15:36:00) [13]

как? Integer(Prc) - ошибка...


Ega23   (2012-06-22 15:31:00) [14]


> Более интересных вариантов никто не подскажет?


В Tag записывай адрес Prc


webpauk   (2012-06-22 15:26:00) [15]

на каждую добавляемую кнопку влом (да и бессмысленно) писать обработчик.
Реализовал так:

type
 TMyButtonRec = record
   rTB: TToolButton;
   rPrc: TMyProc;
 end;

 TMyButtonRecArr = array of TMyButtonRec;

var
 fArr: TMyButtonRecArr ;
...

 fT.OnClick:=DoClick;

 SetLength(fArr, Length(fArr)+1);
 with fArr[Length(fArr)-1] do
 begin
   rTB:=fT;
   rPrc:=Prc;
 end;
...

procedure TForm1.ClickButton(Sender: TObject);
var
 fI: Integer;
begin
 ...;
 for fI := Low(fArr) to High(fArr) do
 begin
   if fArr[fI].rTB=TToolButton(Sender) then
   begin
     fArr[fI].rPrc(Sender);
     Break;
   end;
 end;
 ...;
end;


рогатенько... но работает.
Более интересных вариантов никто не подскажет?


ProgRAMmer Dimonych   (2012-06-22 13:54:00) [16]

Присваивать другой метод, который будет дёргать Prc и заодно выполнять всё остальное?


Наверх

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