Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.02.04;
Скачать: CL | DM;

Вниз

Обьединить события   Найти похожие ветки 

 
Krants   (2006-11-28 14:35) [0]

В ран-тайме компоненту назначаю определенное событие. Применяя проц. SetMethodProp, но если код события был уже задан, он разумеется заменяется новым.
Имеются ли процедуры или какие-нибудь методы обьединения событий?


 
MBo ©   (2006-11-28 14:44) [1]

можно сохранить старый обработчик, и вызывать его при необходимости


 
Krants   (2006-11-28 14:53) [2]


> можно сохранить старый обработчик, и вызывать его при необходимости

неудобно, да и не очень то подходит.


 
MBo ©   (2006-11-28 14:58) [3]

в Дельфи нет цепочек обработчиков, как в С#, если о чем-то подобном речь идет.


 
Krants   (2006-11-28 15:33) [4]


> можно сохранить старый обработчик, и вызывать его при необходимости


а как можно это сделать?


 
guav ©   (2006-11-28 16:02) [5]

можно посмотреть на TApplicationEvents, он позволяет обрабатывать события TApplication в нескольких экзнмплярах себя.


 
DimaBr   (2006-11-28 16:29) [6]

Предположим что ваш компонент Панель с кнопкой, и на нажатие кнопки вы прописали некое действие, а также хотите вывести обработку события нажатия кнопки на поверхность компонента. Тогда пишем так.

procedure TMyComponent.DoButtonClick(Sender: TObject);
begin
//  DoOldButtonClick;
 if Assigned(OnButtonClick) then OnButtonClick(self);
end;


Можно например запоминать предыдущее событие

property OnClick: TNotifyEvent read fOnClick write SetOnClick;
end;

procedure TMyComponent.SetOnClick(const Value: TNotifyEvent);
begin
 if Value = fOnClick then Exit;
 fOldOnClick := fOnClick;
 fOnClick := Value;
end;

procedure TMyComponent.DoButtonClick(Sender: TObject);
begin
 if Assigned(fOldOnClick) then fOldOnClick(self);
 if Assigned(OnClick) then OnClick(self);
end;


 
Krants   (2006-11-29 11:07) [7]

Обьясню на примере. Имеется группа ListBox-в, в дезигн-тайме розработчиком осуществляется компоновка и настройка свойств и событий компонента. Они различны и обьемны! общего у них некоторые параметры и набор процедур(в осн. интерфейсных), активация которых осуществляется в теле событий. Прописывать эти коды для каждого ListBox-а не хочется(засорять модуль). Проще всего разумеется модифицировать компонент, назвать его ListBoxAction и работать с ним, но хочется поискать другой метод, т.к. этот комплекс "кода" в дальнейшем можно использовать и для других компонентов. Переписывать каждый из них сами понимете... Вот появилась идея создать простой модуль с набором готовых событий и настроек, который будет их добавлять к требуемому компоненту.


> Modif_Unit.MakeActionListBox(ListBox1);


разумеется это не критичная задача, и я не ищу оптимальных решений, просто интересно разобраться...


 
Krants   (2006-11-29 11:09) [8]


> DimaBr   (28.11.06 16:29) [6]

Задача скорее состоит в не обьединении а добавлении событий. см. [7]


 
Бурундук ©   (2006-11-29 13:28) [9]

Такая вот дурацкая идея пришла в голову:


type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
   procedure FormCreate(Sender: TObject);
 private
   procedure Button1Click2(Sender: TObject);
   procedure Button1Click3(Sender: TObject);
   procedure Button1Click4(Sender: TObject);
 public
   { Public declarations }
 end;

 TNotifyEventRepeater = class(TComponent)
 private
   FHandlers: array of TNotifyEvent;
   function IndexOf(Handler: TNotifyEvent): Integer;
 public
   procedure Add(Handler: TNotifyEvent);
   procedure Remove(Handler: TNotifyEvent);
   procedure Call(Sender: TObject);
 end;

procedure AddMethodProp(Instance: TComponent; const PropName: string; Value: TNotifyEvent);

var Form1: TForm1;

implementation

{$R *.dfm}

procedure AddMethodProp(Instance: TComponent; const PropName: string; Value: TNotifyEvent);
var oldValue, newValue: TMethod;
   repeater: TNotifyEventRepeater;
begin
 oldValue := GetMethodProp(Instance, PropName);
 if TObject(oldValue.Data) is TNotifyEventRepeater then
   TNotifyEventRepeater(oldValue.Data).Add(Value)
 else
 begin
   repeater := TNotifyEventRepeater.Create(Instance);
   repeater.Add(TNotifyEvent(oldValue));
   repeater.Add(TNotifyEvent(Value));

   TNotifyEvent(newValue) := repeater.Call;
   SetMethodProp(Instance, PropName, newValue);
 end;
end;

//procedure RemoveMethodProp(Instance: TComponent; const PropName: string; Value: TNotifyEvent);

{-------------------------- TNotifyEventRepeater ------------------------------}

function TNotifyEventRepeater.IndexOf(Handler: TNotifyEvent): Integer;
var i: Integer;
begin
 Result := -1;
 for i := 0 to Length(FHandlers)-1 do
   if @FHandlers[i] = @Handler then
   begin
     Result := i;
     Break;
   end;
end;

procedure TNotifyEventRepeater.Add(Handler: TNotifyEvent);
var L: Integer;
begin
 if IndexOf(Handler) > -1 then Exit;
 L := Length(FHandlers);
 SetLength(FHandlers, L+1);
 FHandlers[L] := Handler;
end;

procedure TNotifyEventRepeater.Remove(Handler: TNotifyEvent);
var i: Integer;
begin
 i := IndexOf(Handler);
 if i > -1 then FHandlers[i] := nil; // Влом удалять
end;

procedure TNotifyEventRepeater.Call(Sender: TObject);
var i: Integer;
begin
 for i := 0 to Length(FHandlers)-1 do
   if Assigned(FHandlers[i]) then
     FHandlers[i](Sender);
end;

{------------------------------------------------------------------------------}

procedure TForm1.FormCreate(Sender: TObject);
begin
 //!!! Назначать события ТОЛЬКО через AddMethodProp
 AddMethodProp(Button1, "OnClick", Button1Click2);
 AddMethodProp(Button1, "OnClick", Button1Click2);
 AddMethodProp(Button1, "OnClick", Button1Click3);
 AddMethodProp(Button1, "OnClick", Button1Click4);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Caption := Caption + " Original";
end;

procedure TForm1.Button1Click2(Sender: TObject);
begin
 Caption := Caption + "2";
end;

procedure TForm1.Button1Click3(Sender: TObject);
begin
 Caption := Caption + "3";
end;

procedure TForm1.Button1Click4(Sender: TObject);
begin
 Caption := Caption + "4";
end;


 
Krants   (2006-11-29 16:37) [10]

FHandlers: array of TNotifyEvent; - гениально
спасибо, реально хорошее решение!


 
ors_archangel ©   (2006-12-10 13:03) [11]

Слышали, в C#2 уже анонимные методы сделали, а я вот в Delphi7 сижу и никак не радуюсь...



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

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

Наверх




Память: 0.49 MB
Время: 0.036 c
2-1169106424
Генрих
2007-01-18 10:47
2007.02.04
Помогите плиз


15-1168936830
Petrovsky
2007-01-16 11:40
2007.02.04
Перестала работать отладка


1-1165580125
NeoOrc
2006-12-08 15:15
2007.02.04
32-х битная иконка в imagelist


3-1163160336
Kolan
2006-11-10 15:05
2007.02.04
Как колонки сделать строками(SQL)


2-1169389410
$00FF00
2007-01-21 17:23
2007.02.04
Контролы ХР-стиля в API