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

Вниз

Автоматический LOG программы   Найти похожие ветки 

 
Shaman_ ©   (2006-08-08 11:20) [0]

Стоит задача разработать универсальный механизм ведения истории работы с программой. Необходимо на всех формах приложения отслеживать нажатия всех TButton и заносить в историю запись вида:
Открыта форма "TForm.Caption"
На форме "TForm.Caption" нажата клавиша "TButton.Caption"
и.т.д.

Думаю как это лучше организовать одним универсальным методом? Добавлять к кажому TObject событие не подойдет- форм 90 штук, элементов форм - не поддается подсчету. Наверняка уже многие сталкивались и есть свои наработки в этой области.


 
StriderMan ©   (2006-08-08 11:24) [1]

способы:
1. сделать свой компонент от TButton, добавив запись в лог. Написать программулину, которая перелопатит в проекте все TButton в *.pas и *.dfm.

2. копать в сторону Application.OnMessage


 
Shaman_ ©   (2006-08-08 12:29) [2]

1. - Немного не то
2. - В этом направлении сейчас и копаю


 
Ketmar ©   (2006-08-08 12:37) [3]

повесить хук и ловить всё, что надо.


 
StriderMan ©   (2006-08-08 12:40) [4]


> Shaman_ ©   (08.08.06 12:29) [2]

отпишитесь пожалуйста как сделаете. Интересный вопрос.


 
Loginov Dmitry ©   (2006-08-08 15:38) [5]

Еще вариант: использовать наследование форм. Обработку сообщений выполнять в процедуре WndProc(), которая объявляется так:

TParentForm = class(TForm)
.....
protected
 procedure WndProc(var Message: TMessage); override;
end;

(Вообще, полезая вещь "наследование форм", сильно сокращает объем кода)


 
DiamondShark ©   (2006-08-08 16:46) [6]

Интересно, а чем такой лог может быть полезен?


 
clickmaker ©   (2006-08-08 16:56) [7]


> DiamondShark ©   (08.08.06 16:46) [6]
> Интересно, а чем такой лог может быть полезен?

никак не могут прищучить юзера, который лажает, а потом валит все на прграммеров, наверно )


 
Shaman_ ©   (2006-08-08 17:35) [8]

DiamondShark [6]
Чем может быть полезен это уже вопрос творческий, а не программерский. В том числе- clickmaker ©   (08.08.06 16:56) [7] :)

В общем вот пример как реализовал. Все не буду расписывать, просто пишу пример перехвата Caption нажимаемых пользователем TButton

Все делаем через обработку сообщений:

...
private
  procedure MsgHandler(var Msg:TMsg);
...

procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnMessage := MsgHandler;
end;

procedure TForm1.MsgHandler(var Msg:TMsg);
var
CaprionBuffer: PChar;
begin
case Msg.message of
  //Перехват нажатия на TButton
  WM_LBUTTONDOWN:
   begin
    //Получаем Caption кнопки
    GetMem(lpBuffer,255);
    GetWindowText(msg.hwnd,CaprionBuffer,255);
    //Вот собственно и все
    ShowMessage("Перехвачено нажатие кнопки ""+CaprionBuffer+""");
   end;

  //Если нужно перехватить другое действие пользователя
  //то соответственно обрабатываем здесь нужное сообщение
  ...
end;
end;


Это естественно пример. В реале весь код получился на ~300 строк и еще не дописан :)


 
Loginov Dmitry ©   (2006-08-08 17:44) [9]

А я вот решил сабж с помощью читерства :)

unit BntLoggerUnit;

{$define UserHook}

interface

uses
 Windows, Messages, SysUtils, StdCtrls, Buttons, ComCtrls;

{$ifdef UserHook}
type
 TMyButton = class(TButton)
 public
   procedure Click; override;
 end;

 TMySpeedButton = class(TSpeedButton)
 public
   procedure Click; override;
 end;

 TMyToolButton = class(TToolButton)
 public
   procedure Click; override;
 end;

 TButton = class(TMyButton);
 TSpeedButton = class(TMySpeedButton);
 TToolButton = class(TMyToolButton);

procedure WriteToLog(AText: string);

{$endif UserHook}

implementation

{$ifdef UserHook}
procedure WriteToLog(AText: string);
begin
 // Здесь выполняй запись в лог-файл
end;

{ TMyButton }

procedure TMyButton.Click;
begin
 inherited;
 Beep;
 WriteToLog(Caption);
end;

{ TMySpeedButton }

procedure TMySpeedButton.Click;
begin
 inherited;
 Beep;
 WriteToLog(Caption);
end;

{ TMyToolButton }

procedure TMyToolButton.Click;
begin
 inherited;
 Beep;  
 WriteToLog(Caption);
end;
{$endif UserHook}
end.


Добавь имя данного модуля в список USES секции INTERFACE каждого модуля формы. Оно должно быть в конце списка.

P.S.: enjoy ;)


 
Loginov Dmitry ©   (2006-08-08 17:46) [10]

> Application.OnMessage := MsgHandler;


Мой совет: никогда так не делай. Для этих целей в Дельфи есть компонент TApplicationEvents.


 
Shaman_ ©   (2006-08-08 18:02) [11]

Loginov Dmitry ©   (08.08.06 17:46) [10]

Опасения основаны на том, что обработчик может быть только 1? Или может есть еще какие негативные стороны?


 
Loginov Dmitry ©   (2006-08-08 18:37) [12]

Вот именно! Только 1. Это ни есть гуд, так как может понадобиться обработка OnMessage в совершенно разных местах программы. А если ты делашь так
Application.OnMessage := MsgHandler;
то все компоненты TApplicationEvents перестают работать.


 
Shaman_ ©   (2006-08-08 18:48) [13]

Можно выстроить цепочку на передачу сообщения от одного обработчика к другому, но в целом согласен, лишняя, ненужная замороченность получается


 
Гутан Орангович   (2006-08-09 02:01) [14]


> Loginov Dmitry ©   (08.08.06 17:46) [10]
> > Application.OnMessage := MsgHandler;Мой совет: никогда
> так не делай. Для этих целей в Дельфи есть компонент TApplicationEvents.
>



> Loginov Dmitry ©   (08.08.06 18:37) [12]
> Вот именно! Только 1. Это ни есть гуд, так как может понадобиться
> обработка OnMessage в совершенно разных местах программы.
>  А если ты делашь такApplication.OnMessage := MsgHandler;
> то все компоненты TApplicationEvents перестают работать.
>


Своя обработка OnMessage совершенно не мешает иметь сколько угодно других обработчиков.


 
Loginov Dmitry ©   (2006-08-09 07:51) [15]

> Гутан Орангович   (09.08.06 02:01) [14]
> Своя обработка OnMessage совершенно не мешает иметь
> сколько угодно других обработчиков.


А самому проверить не судьба?


 
StriderMan ©   (2006-08-09 09:04) [16]


> Loginov Dmitry ©   (09.08.06 07:51) [15]

можно же сохранить указатель на стандартный обработчик перед переопределением OnMessage, и в своем, после нужных действий вызывать стандартный. Чем это плохо?


 
Гутан Орангович   (2006-08-09 09:28) [17]


> Loginov Dmitry ©   (09.08.06 07:51) [15]
> > Гутан Орангович   (09.08.06 02:01) [14]> Своя обработка
> OnMessage совершенно не мешает иметь > сколько угодно других
> обработчиков.А самому проверить не судьба?


И проверять нечего. Это тривиально.


 
Loginov Dmitry_   (2006-08-09 10:32) [18]


> и в своем, после нужных действий вызывать стандартный


Что еще за "стандартный" обработчик? Таких здесь нету. Если имеется ввиду старый обработчик, тогда ладно. Но предпочтительнее все же не вешать собственный обработчик, а использовать механизм ApplicationEvents.


 
Гутан Орангович   (2006-08-09 10:38) [19]

Каждому овощу свое время. В том числе и OnMessage и TApplicationEvent.

Не имеет смысла говорить о том, что один метод лучше другого.
Это всего лишь дело вкусовых рецепторов каждого.



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

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

Наверх




Память: 0.52 MB
Время: 0.049 c
3-1152509382
Delphi basic
2006-07-10 09:29
2006.09.17
Проблемы с FIBPlus


15-1156709967
Petr V. Abramov
2006-08-28 00:19
2006.09.17
Еще раз про откаты


3-1152870911
syte_ser78
2006-07-14 13:55
2006.09.17
Колво видимых столбцов ДБГрида


1-1154958562
webpauk
2006-08-07 17:49
2006.09.17
Расположение кнопок в ToolBar


2-1156764359
Dr. Genius
2006-08-28 15:25
2006.09.17
Drag n Drop для Edit