Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

Присвоение 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.055 c
15-1349037002
Юрий
2012-10-01 00:30
2013.03.22
С днем рождения ! 1 октября 2012 понедельник


3-1282479566
larsp
2010-08-22 16:19
2013.03.22
Имеется приложение, работающее с FB через BDE.


15-1342444836
картман
2012-07-16 17:20
2013.03.22
точка пересечения двух графиков


15-1352554012
Артём
2012-11-10 17:26
2013.03.22
Написание программ


2-1338230735
Max
2012-05-28 22:45
2013.03.22
бред с оптимизацией





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский