Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: 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 вся ветка

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.051 c
15-1340886646
alexdn
2012-06-28 16:30
2013.03.22
10-ти дневн демка


15-1340470605
Artem
2012-06-23 20:56
2013.03.22
Как txt скачать на Android?


15-1333088061
macrodens
2012-03-30 10:14
2013.03.22
Outlook 2007


3-1277448717
pavel_guzhanov
2010-06-25 10:51
2013.03.22
Можно ли сравнить два набора данных?


3-1276194806
Дмитрий Белькевич
2010-06-10 22:33
2013.03.22
Еще вопрос по оптимизации запроса.