Вниз
Скачать: CL | DM;

Присвоение TNotifyEvent   Найти похожие ветки 

← →
webpauk ©   (2012-06-22 13:48) [0]

Программно создаю 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;


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


← →
ProgRAMmer Dimonych ©   (2012-06-22 13:54) [1]

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


← →
webpauk ©   (2012-06-22 15:26) [2]

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

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;


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


← →
Ega23 ©   (2012-06-22 15:31) [3]


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


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


← →
webpauk ©   (2012-06-22 15:36) [4]

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


← →
webpauk ©   (2012-06-22 15:40) [5]

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


← →
Leonid Troyanovsky ©   (2012-06-22 15:44) [6]


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

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

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

--
Regards, LVT.


← →
ProgRAMmer Dimonych ©   (2012-06-22 15:48) [7]

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

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


← →
webpauk ©   (2012-06-22 15:58) [8]

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


← →
webpauk ©   (2012-06-22 16:04) [9]

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

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


← →
webpauk ©   (2012-06-22 16:05) [10]

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


← →
webpauk ©   (2012-06-22 16:06) [11]

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


← →
Leonid Troyanovsky ©   (2012-06-22 16:13) [12]


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

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

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

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

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

--
Regards, LVT.


← →
webpauk ©   (2012-06-22 16:20) [13]


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


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


← →
webpauk ©   (2012-06-22 16:25) [14]

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

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

спасибо!


← →
webpauk ©   (2012-06-22 16:27) [15]

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;


← →
Leonid Troyanovsky ©   (2012-06-22 16:28) [16]


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

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

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

--
Regards, LVT.



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

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.058 c
15-1338461166
Jeer
2012-05-31 14:46
2013.03.22
Хинди-Руси бхай-бхай


2-1337605535
TStas
2012-05-21 17:05
2013.03.22
Плохо ловится WM_DRAWCLIPBOARD ричедитом


15-1351768641
brother
2012-11-01 15:17
2013.03.22
Анимация в Excel часть 2


15-1333440113
MonoLife
2012-04-03 12:01
2013.03.22
Aser Aspire one &amp; Asus WL-500g Premium v.2


15-1330196934
wl
2012-02-25 23:08
2013.03.22
выскажите нодостатки ноута




   Наверх