Виртуальная библиотека Delphi - [17]
>var
>H: HWND;
>begin
>{если Code>=0, то ловушка может обработать событие}
>if Code >= 0 then
>begin
> {это те клавиши?}
> if ((wParam = VK_ADD)or(wParam = VK_SUBTRACT)) and
>(lParam and $40000000 = 0)
> then begin
> {ищем окно по имени класса и по заголовку}
> H := FindWindow('TForm1', 'XXX');
> {посылаем сообщение}
> if wParam = VK_ADD then
> SendMessage(H, wm_NextShow_Event, 0, 0)
> else
> SendMessage(H, wm_PrevShow_Event, 0, 0);
> end;
> {если 0, то система должна дальше обработать это событие}
> {если 1 - нет}
> Result:=0;
>end
>else
> {если Code<0, то нужно вызвать следующую ловушку}
> Result := CallNextHookEx(HookHandle,Code, wParam, lParam);
>end;
>{при выгрузке DLL надо снять ловушку}
>procedure LocalExitProc; far;
>begin
>if HookHandle<>0 then
>begin
> UnhookWindowsHookEx(HookHandle);
> ExitProc := SaveExitProc;
>end;
>end;
>{инициализация DLL при загрузке ее в память}
>begin
>{устанавливаем ловушку}
>HookHandle := SetWindowsHookEx(wh_Keyboard, Key_Hook,
> hInstance, 0);
>if HookHandle = 0 then
> MessageBox(0, 'Unable to set hook!', 'Error', mb_Ok)
>else begin
> SaveExitProc := ExitProc;
> ExitProc := @LocalExitProc;
>end;
>end.
Размер такой DLL в скомпилированном виде будет около 3Кб, поскольку в ней не используются объекты из VCL.
Далее приведен код модуля в Delphi, который загружает DLL и обрабатывает сообщения от ловушки, просто отображая их в Label1.
>unit Unit1;
>interface
>uses
>SysUtils,WinTypes,WinProcs,Messages,Classes,Graphics,
>Controls,Forms,Dialogs,StdCtrls;
>{пользовательские сообщения}
>const
>wm_NextShow_Event = wm_User + 133;
>wm_PrevShow_Event = wm_User + 134;
>type
> TForm1 = class(TForm)
> Label1: TLabel;
> procedure FormCreate(Sender: TObject);
> private
>{обработчики сообщений}
> procedure WM_NextMSG (Var M : TMessage); message wm_NextShow_Event;
> procedure WM_PrevMSG (Var M : TMessage); message wm_PrevShow_Event;
> end;
>var
> Form1: TForm1;
> P : Pointer;
>implementation
>{$R *.DFM}
>{загрузка DLL}
>function Key_Hook : Longint; far; external 'SendKey';
>procedure TForm1.WM_NextMSG (Var M : TMessage);
>begin
> Label1.Caption:='Next message';
>end;
>procedure TForm1.WM_PrevMSG (Var M : TMessage);
>begin
> Label1.Caption:='Previous message';
>end;
>procedure TForm1.FormCreate(Sender: TObject);
>begin
> {если не использовать вызов процедуры из DLL в программе,
> то компилятор удалит загрузку DLL из программы}
> P:=@Key_Hook;
>end;
>end.
Конечно, свойство Caption в этой форме должно быть установлено в "XXX".
Ставите у формы KeyPreview = true и создаете событие KeyPress следующего вида:
>procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
>begin
> if (Key = #13) then begin
> Key:=#0;
> Perform(WM_NEXTDLGCTL,0,0);
> end;
>end;
Вопрос:
Каким образом можно отследить вставку и удаление компонент в форму в design-time? Такая информация могла бы пригодится, если моя компонента имеет ссылки на другие компоненты (например, как в связке TDateSource,TTable и др.)
Ответ:
Для получения такой информации предназначен метод
>procedure Notification (AComponent: TComponent; Operation: TOperation); virtual;
класса TComponent. Перекрыв его в своей компоненты Вы можете произвести необходимые действия, в зависимости от значения параметра Operation типа
>TOperation = (opInsert, opRemove);
объявленного в модуле Classes. Параметр AComponent — компонента, соответственно вставлемая или удаляемая, в зависимости от Operation.
(Пример для Delphi 1.0 поскольку в Delphi 2-3 лучше использовать:
>var MsWord : variant;
>MsWord := CreateOleObject('Word.Basic');
Для Delphi 3, пример ниже)
Создавать отчет в программе Word удобно если отчет имеет сложную структуру (тогда его быстрее создать в Word, чем в Qreport от Delphi, кроме того, этот QReport имеет "глюки"), либо, если после создания отчета его нужно будет изменять. Итак, первым делом в Word создается шаблон будущего отчета, это самый обыкновенный не заполненный отчет. А в места куда будет записываться информация нужно поставить метки. Например (для наглядности метки показаны синим цветом, реально они конечно не видны):
Накладная № Num
№ | Поставщик | Наименование товара | Код товара | Кол-во | Цена | Сумма |
---|---|---|---|---|---|---|
Table | ? | ? | ? | ? | ? | ? |
Сдал_______________________ Принял________________________
М.П. М.П.
Далее в форму, откуда будут выводиться данные, вставляете компоненту DdeClientConv из палитры System. Назовем ее DDE1. Эта компонента позволяет передавать информацию между программами методом DDE. Свойства:
ConnectMode : ddeManual — связь устанавливаем вручную
DdeService : (winword) — с кем устанавливается связь
ServiceApplication : C:\MSOffice\Winword\WINWORD.EXE — полный путь доступа к программе. (Вот здесь можно наступить на грабли. Ведь Word может лежать в любой папке! Поэтому путь доступа к нему лучше взять из реестра, а еще лучше использовать OLE см.начало раздела)
Теперь пишем процедуру передачи данных:
>{ Печать накладной }
>procedure Form1.PrintN;
>Var
> S : string;
> i : integer;
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге собраны предания и поверья о призраках ночи — колдунах и ведьмах, оборотнях и вампирах, один вид которых вызывал неподдельный страх, леденивший даже мужественное сердце.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
…«Песнь о Нибелунгах» принадлежит к числу наиболее известных эпических произведений человечества. Она находится в кругу таких творений, как поэмы Гомера и «Песнь о Роланде», «Слово о полку Игореве» и «Божественная комедия» Данте — если оставаться в пределе европейских литератур…В. Г. Адмони.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Сейчас во многих школах, институтах и других учебных заведениях можно встретить компьютеры старого парка, уже отслужившие свое как морально, так и физически. На таких компьютерах можно изучать разве что Dos, что далеко от реалий сегодняшнего дня. К тому же у большинства, как правило, жесткий диск уже в нерабочем состоянии. Но и выбросить жалко, а новых никто не дает. Различные спонсоры, меценаты, бывает, подарят компьютер (один) и радуются, как дети. Спасибо, конечно, большое, но проблемы, как вы понимаете, этот компьютер в общем не решает, даже наоборот, усугубляет, работать на старых уже как-то не хочется, теперь просто есть с чем сравнивать.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.