Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> Обновлён FAQ для скачивания, Версия 2.0 (Более 1700 статей) 
:(
    Опции темы
Vit
  Дата 8.12.2003, 03:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



Существенно обновлён FAQ.

1. Добавлено более 300 статей
2. В существующие статьи добавлено большое количество нового материала
3. Улучшена классификация, навигация.
4. Исправлены ошибки.
5. Добавлены мои комментарии к некоторым статьям.

Ссылки для скачивания:

1) Основная: http://chicago.lastplanet.com/DelphistFAQ.2.0.zip
2) Дополнительная: http://www.delphist.com/DelphistFAQ.2.0.zip

Формат: Файл CHM (упакован zip), размер 5 496 039 байт (5.24 MB)


Очень прошу сообщать о всех пожеланиях, дополнениях, неточностях и т.п.


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
dr.ZmeY
Дата 8.12.2003, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Политолог
****


Профиль
Группа: Участник Клуба
Сообщений: 3892
Регистрация: 26.3.2002
Где: ..::STALINGRAD::. .

Репутация: нет
Всего: 60



Интересно.. посмотрим...



--------------------
PM MAIL WWW ICQ Skype   Вверх
NiJazz
Дата 8.12.2003, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 6
Всего: 23



Vit, спасибо! Предыдущие были хороши, представляю, что с этим. smile.gif
PM MAIL   Вверх
Vit
Дата 8.12.2003, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



2 Snick_Y2K - я знаю, что ты сейчас занят, но мне необходимо твоё мнение и помощь как специалиста:

1) Нужно выработать какой-нибудь индивидуальный и оригинальный стиль для этого FAQ, только такой, чтобы не надо было переформатировать каждый топик (этого я не переживу - это работы будет ну уж очень много), хотя бы красиво оформленные страницы главных разделов...

2) Нужен логотип FAQ - не очень большой, но оригинальный





--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
Vit
Дата 8.12.2003, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



2 All - мне нужен помошник. Желателен опыт работы с Help and Manual и хотя бы поверхностное знание Дельфи.

Нужно помочь мне с составлением внутренних ссылок в FAQ - как в официальных Help - везде есть линк на "See Also" и список ссылок близких тем...


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
December
Дата 13.12.2003, 01:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


Профиль
Группа: Участник
Сообщений: 4423
Регистрация: 14.8.2002
Где: Харьков

Репутация: 8
Всего: 57



Дубляж:

API - Windows - Как скрыть ТаскБар
API - Windows - Как принудительно скрыть ТаскБар

API - Windows - Как скрыть/показать иконки на рабочем столе?
API - Windows - Как скрыть /показать иконки на рабочем столе?


--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
Vit
Дата 13.12.2003, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vitaly Nevzorov
****


Профиль
Группа: Экс. модератор
Сообщений: 10964
Регистрация: 25.3.2002
Где: Chicago

Репутация: 48
Всего: 207



2 December - спасибо, это самая большая проблема - дубляжи, я уже не помню - что есть, а чего нет.


--------------------
With the best wishes, Vit
I have done so much with so little for so long that I am now qualified to do anything with nothing
Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru
PM MAIL WWW ICQ   Вверх
December
Дата 13.12.2003, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


Профиль
Группа: Участник
Сообщений: 4423
Регистрация: 14.8.2002
Где: Харьков

Репутация: 8
Всего: 57



Soon will be more...


--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
December
Дата 14.12.2003, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


Профиль
Группа: Участник
Сообщений: 4423
Регистрация: 14.8.2002
Где: Харьков

Репутация: 8
Всего: 57



Системные функции и WinAPI - Windows - Шрифты, языки... - Перекодировка
Хороший алгоритм, только вот что-то непонятное там со строкой
Цитата

Str[dos] := 'Ђ ?Ў‚ўѓЈ„¤…Ґ†¦‡§?Ё‰©ЉЄ‹"Њ¬?­Ћ®?Ї?а'б'в"г"де–ж—з?и™йљк›лњм?нћоџп';

Просто перенести в свой проект не удаётся.

Также есть несколько (три или больше) статей "Как научить BDE и Database Desktop говорить по-русски". Имеет смысл удалять клоны или лучше оставить как есть, чтобы проще найти было?


--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
December
Дата 14.12.2003, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


Профиль
Группа: Участник
Сообщений: 4423
Регистрация: 14.8.2002
Где: Харьков

Репутация: 8
Всего: 57



И вообще, нужно в раздел "Языки, перекодировка..." впихнуть топик из "Работа с dBase"
При использовании DOS DBF файлов - перекодировка между форматами


--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
StayAtHome
Дата 31.1.2004, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Домосед
**


Профиль
Группа: Участник
Сообщений: 456
Регистрация: 26.1.2004
Где: Украина

Репутация: 1
Всего: 16



1. В разделе "Математика, алгоритмы" есть статья с ошибкой в названии:
"Как проверить правильность номера средитной карточки?"
2. Дублирующиеся темы:
Цитата
Работа с графикой и мультимедиа/GDI - графика в Delphi
  Работа с графикой и мультимедиа/Разные вопросы, связанные с графикой/GDI: графика в Delphi

Цитата
VCL/DBGrid/Как экспортировать содержимое DBGrid в Excel или ClipBoard?
  ActiveX,COM.../Работа с Excel из Delphi/Как экспортировать содержимое DBGrid в Excel или ClipBoard
(ИМХО это разные статьи а не ссылки, т.к. названия у них отличаются)
Цитата
Delphi IDE/Работа с ToolsAPI/Текущий модуль и проект -- есть две одинаковые статьи с таким названием.

3. -
Цитата
"ActiveX,COM.../Общие вопросы о COM.../ Общие сведения о COM/Понятие интерфейсе"
-- наверно лучше "Понятие об интерфейсе"
PM MAIL WWW ICQ YIM   Вверх
StayAtHome
Дата 31.1.2004, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Домосед
**


Профиль
Группа: Участник
Сообщений: 456
Регистрация: 26.1.2004
Где: Украина

Репутация: 1
Всего: 16



Кандидатуры на добавление в FAQ:

Как правильно работать с прозрачными окнами (стиль WS_EX_TRANSPARENT)?
Стиль окна-формы указывается в CreateParams. Только вот когда перемещаешь его, фон остается со старым куском экрана. Чтобы этого не происходило, то когда pисуешь своё окно, запоминай, что было под ним,а пpи пеpемещении восстанавливай.
HDC hDC = GetDC(GetDesktopWindow()) тебе поможет..
Andrei Bogomolov
http://cardy.hypermart.net
ICQ UIN:7329451
[email protected]
e-pager: [email protected]
(2:5013/11.3)
------------------------------------------------------------------------------------------
OpneGL: Каким обpазом выбиpать pазмеp шpифта, т.к. все мои стpадания по выбоpy паpаметpов шpифта в CreateFont() никак не отpажались на его pазмеpе
Все что я пpидyмал, это юзать glScale(), но в этом слyчае полyчаем плохое качество (по сpавнению с той-же Воpдой) пpи малом pазмеpе символов. Вот часть работающего примера на Си (переведенного мною на Паскаль (АА)).
Код

procedure GLSetupRC( pData: Pointer )
//void GLSetupRC(void *pData)
//{
var
//  HDC hDC;
hDC: HDC;
//  HFONT hFont;
hFont: HFONT;
//  GLYPHMETRICSFLOAT agmf[128];
agmf: array [0..127] of GLYPHMETRICSFLOAT;
//  LOGFONT logfont;
logfont: LOGFONT;

begin

 logfont.lfHeight := -10;
 logfont.lfWidth := 0;
 logfont.lfEscapement := 0;
 logfont.lfOrientation := 0;
 logfont.lfWeight := FW_BOLD;
 logfont.lfItalic := FALSE;
 logfont.lfUnderline := FALSE;
 logfont.lfStrikeOut := FALSE;
 logfont.lfCharSet := ANSI_CHARSET;
 logfont.lfOutPrecision := OUT_DEFAULT_PRECIS;
 logfont.lfClipPrecision := CLIP_DEFAULT_PRECIS;
 logfont.lfQuality := DEFAULT_QUALITY;
 logfont.lfPitchAndFamily := DEFAULT_PITCH;
 //strcpy(logfont.lfFaceName,"Arial");
//  strcpy(logfont.lfFaceName,"Decor");
 StrPCopy( logfont.lfFaceName, 'Decor' );

 glDepthFunc(GL_LESS);
 glEnable(GL_DEPTH_TEST);  // Hidden surface removal
 glFrontFace(GL_CCW);      // Counter clock-wise polygons face out
 glEnable(GL_CULL_FACE);   // Do not calculate insides
 glShadeModel(GL_SMOOTH);  // Smooth shading
 glEnable(GL_AUTO_NORMAL);
 glEnable(GL_NORMALIZE);
 glEnable(GL_COLOR_MATERIAL);

 glClearColor(0.0, 0.0, 0.0, 1.0 );

 glEnable(GL_LIGHTING);
 glLightfv(GL_LIGHT0,GL_AMBIENT,ambientLight);
 glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuseLight);
 glLightfv(GL_LIGHT0,GL_SPECULAR,specular);
 glLightfv(GL_LIGHT0,GL_POSITION,lightPos);
 glEnable(GL_LIGHT0);

 glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);

 glMaterialfv(GL_FRONT, GL_SPECULAR,specular);
 glMateriali(GL_FRONT,GL_SHININESS,100);

 // Blue 3D Text
 glRGB(0, 0, 255);

 // Select the font into the DC
 hDC := (HDC)pData;
//  hFont = CreateFontIndirect(&logfont);
 hFont := CreateFontIndirect( Addr(logfont) );
 SelectObject (hDC, hFont);

 //create display lists for glyphs 0 through 255 with 0.3 extrusion
 // and default deviation. The display list numbering starts at 1000
 // (it could be any number).

//  if(!wglUseFontOutlines(hDC, 0, 128, 1000, 0., 0.3,
//                            WGL_FONT_POLYGONS, agmf))
 if not wglUseFontOutlines(hDC, 0, 128, 1000, 0., 0.3,

//>                                         ``` - это тебе поможет
//> Выводить текст можно в любым масштабе

                           WGL_FONT_POLYGONS, agmf) then

    Windows.MessageBox(nil,'Could not create Font Outlines',
                    'Error',MB_OK or MB_ICONSTOP);

 // Delete the font now that we are done

 DeleteObject(hFont);
//}
end;

// void GLRenderScene(void *pData)
procedure GLRenderScene(pData: Pointer);
begin
 (*  ...  *)

 // Draw 3D text
 glListBase(1000);
 glPushMatrix();
 // Set up transformation to draw the string.
 glTranslatef(-35.0, 0.0, -5.0);
 glScalef(60.0, 60.0, 60.0);
 glCallLists(3, GL_UNSIGNED_BYTE, 'Decor');
 glPopMatrix();  // Clear the window with current clearing color

 (* ... *)
end;

Автор: Garik Pozdeev (2:5021/15.9)

Это сообщение отредактировал(а) StayAtHome - 31.1.2004, 12:45
PM MAIL WWW ICQ YIM   Вверх
StayAtHome
Дата 31.1.2004, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Домосед
**


Профиль
Группа: Участник
Сообщений: 456
Регистрация: 26.1.2004
Где: Украина

Репутация: 1
Всего: 16



Как по IP адресу получить HostName (и обратно)
Хм... А ты увеpен, что пытался найти эту функцию?
Ты, навеpно, будешь очень удивлен (так уж повелось в этой эхе), но это gethostbyaddr, а если в Winsock2, то можно еще SAAddressToString
Скачиваешь с microsoft или с intel WinSock2 SDK и документацию (она отдельно),там все есть.
Мне лень сейчас вспоминать и pазбиpаться, вот тебе кусочек, в котоpом этим функции используются (не пpетендую на абсолютную истину, но с IP pаботает):
Код

function TGenericNetTask.GetPeerOrigin( const ALogin : String ) : DWORD;
const AddressStrMaxLen = 256;
var len : DWORD;
       ptr : PChar;
       pHE : PHostEnt;
       addr : TSockAddr;
       buf : Array [0..AddressStrMaxLen-1] of Char;
begin
   if FNet=nil then raise ESocketError.Error(-1,ClassName+'.GetPeerAds: Net is
not defined',WSAHOST_NOT_FOUND);
   len := SizeOf(TSockAddr);
   if getpeername(FSocket,addr,len)<>0 then
RaiseLastSocketError(-1,ClassName+'.GetPeerAds: getpeername()');
   case addr.sin_family of
   AF_INET: // TCP/IP

       begin
           pHE := gethostbyaddr( PChar(@addr.sin_addr), SizeOf(TInAddr),
AF_INET );
           if pHE=nil then RaiseLastSocketError(-1,ClassName+'.GetPeerAds:
gethostbyaddr()');
           FPeerNodeName := pHE^.h_name;
           if FNet.NodeByName(FPeerNodeName)=nil then
           begin
               ptr := StrScan(pHE^.h_name,'.');
               if ptr<>nil then FPeerNodeName :=
Copy(pHE^.h_name,1,ptr-pHE^.h_name);
           end;
       end;

   else
       len := AddressStrMaxLen;
       if WSAAddressToStringA(sin,sinlen,nil,buf,len)<>0 then
RaiseLastSocketError(-1,ClassName+'.GetPeerAds: WSAAddressToStringA()');
       ptr := StrRScan(buf,':');
       if ptr<>nil then len := ptr-buf;
       FPeerNodeName := Copy(buf,1,len);
   end;
   Result :=
FNet.EncodeAddress(ALogin,FPeerNodeName,'',[bLoginIdRequired,bNodeIdREquired,bR
aiseError]);
end; {TGenericNetTask.GetPeerOrigin}

Alex Konshin
mailto:[email protected]"
(2:5030/217)
------------------------------------------------------------------------------------------------------
Хотелось бы иметь возможность отмены вставки нового узла в TTreeView по нажатию кнопки Esc. Как сделать?
Код
unit BetterTreeView;
interface
uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 ComCtrls, CommCtrl;

type
 TTVNewEditCancelEvent = procedure( Sender: TObject;
   Node: TTreeNode; var Delete: Boolean) of object;
 TBetterTreeView = class(TTreeView)
 protected
   FIsEditingNew: Boolean;
   FOnEditCancel: TTVChangedEvent;
   FOnNewEditCancel: TTVNewEditCancelEvent;
   procedure Edit(const Item: TTVItem); override;
 public
   function NewChildAndEdit(Node: TTreeNode; const S: String)

     : TTreeNode;
 published
   property IsEditingNew: Boolean read FIsEditingNew;
   property OnEditCancel: TTVChangedEvent
     read FOnEditCancel write FOnEditCancel;
   property OnNewEditCancel: TTVNewEditCancelEvent
     read FOnNewEditCancel write FOnNewEditCancel;
 end;

implementation

procedure TBetterTreeView.Edit(const Item: TTVItem);
var
 Node: TTreeNode;
 Action: Boolean;
begin
 with Item do begin
   { Get the node }
   if (state and TVIF_PARAM)  0 then
     Node := Pointer(lParam)

   else
     Node := Items.GetNode(hItem);

   if pszText = nil then begin
     if FIsEditingNew then begin
       Action := True;
       if Assigned(FOnNewEditCancel) then
         FOnNewEditCancel(Self, Node, Action);
       if Action then
         Node.Destroy
     end
     else
       if Assigned(FOnEditCancel) then
         FOnEditCancel(Self, Node);
   end
   else
     inherited;
 end;
 FIsEditingNew := False;
end;

function TBetterTreeView.NewChildAndEdit
 (Node: TTreeNode; const S: String): TTreeNode;

begin
 SetFocus;
 Result := Items.AddChild(Node, S);
 FIsEditingNew := True;
 Node.Expand(False);
 Result.EditText;
 SetFocus;
end;

end.

Том Сван "Секреты..."







Это сообщение отредактировал(а) StayAtHome - 31.1.2004, 12:48
PM MAIL WWW ICQ YIM   Вверх
StayAtHome
Дата 31.1.2004, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Домосед
**


Профиль
Группа: Участник
Сообщений: 456
Регистрация: 26.1.2004
Где: Украина

Репутация: 1
Всего: 16



Как зафиксировать один или несколько столбцов в TDBGrid с возможностью навигации по этим столбцам?
Код
procedure TDbGridEx.ColEnter;

procedure ProcessColEnter;
begin
 // -----------------------------------------------------------
 if (SelectedIndex  _Mark) then
   begin
     ColumnMoved(Columns.Count, StaticCol + 1);
     SelectedField := Fields[StaticCol];
   end;
   Exit;
 end;

 // -----------------------------------------------------------
 if (SelectedIndex > StaticCol) then
 begin

   if _LastSelectedIndex = StaticCol then
   begin
     if _Mark = Columns[SelectedIndex].Title.Caption then

     begin
       ColumnMoved(StaticCol + 1, Columns.Count);
       SelectedField := Fields[Columns.Count - 1];
     end
       else
     begin
       ColumnMoved(StaticCol + 1, Columns.Count);
       SelectedField := Fields[StaticCol];
     end;
   end;

 end;
end;

begin
 if (_EntryCol > 0) or _MouseDown or (StaticCol = 0) then
 begin
   _MouseDown := FALSE;
 end else
 begin
   inc(_EntryCol);
   ProcessColEnter;
   dec(_EntryCol);
 end;

 if Assigned(OnColEnter) then OnColEnter(Self);

 _LastSelectedIndex := SelectedIndex;
end;

Автор: Ramil Galiev
(2:5085/33.11)




PM MAIL WWW ICQ YIM   Вверх
StayAtHome
Дата 31.1.2004, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Домосед
**


Профиль
Группа: Участник
Сообщений: 456
Регистрация: 26.1.2004
Где: Украина

Репутация: 1
Всего: 16



Использование HOOK в Дельфи.

Что такое НООК?
НООК - это механизм перехвата сообщений, предоставляемый системой Microsoft Windows. Программист пишет специального вида функцию (НООК-функция), которая затем при помощи функции SetWindowsHookEx вставляется на верх стека НООК-функций системы. Ваша НООК-функция сама решает, передать ли ей сообщение в следующую НООК-функцию при помощи CallNextHookEx или нет.

Какие бывает НООК'и?
НООК бывают глобальные, контролирующие всю систему, так и локальные, ориентированные на какой-либо поток (Thread). Кроме того НООК различаются по типу перехватываемых сообщений (подробнее об этом - ниже). НООК несколько подтормаживают систему, поэтому ставить их рекомендуется только при необходимости, и кактолько необходимость в них отпадает - удалять.

Как создавать НООК?
НООК устанавливается в систему при помощи функции SetWindowsHookEx, вот её заголовок:
Код
function SetWindowsHookEx(idHook: Integer; lpfn: TFNHookProc; hmod: HINST; dwThreadId: DWORD): HHOOK;

idHook
константа, определяющая тип вставляемого НООК'а, должна быть одна из нижеследующих констант:
WH_CALLWNDPROC
вставляемая НООК-функция следит за всеми сообщения перед их отпралением в соответствующую оконную функцию
WH_CALLWNDPROCRET
вставляемая НООК-функция следит за всеми сообщениями после их отправления в оконную функцию
WH_CBT
вставляемая НООК-функция следит за окнами, а именно: за созданием, активацией, уничтожением, сменой размера; перед завершением системной команды меню, перед извлечением события мыши или клавиатуры из очереди сообщений, перед установкой фокуса и т.д.
WH_DEBUG
вставляемая НООК-функция следит за другими НООК-функциями.
WH_GETMESSAGE
вставляемая НООК-функция следит за сообщениями, посылаемыми в очередь сообщений.
WH_JOURNALPLAYBACK
вставляемая НООК-функция посылает сообщения, записанные до этого WH_JOURNALRECORD НООК'ом.
WH_JOURNALRECORD
эта НООК-функция записывает все сообщения куда-либо в специальном формате, причем позже они могут быть "воспроизведены" при помощи НООК'а WH_JOURNALPLAYBACK. Это в некотором роде аналог магнитофонной записи сообщений.
WH_KEYBOARD
вставляемая НООК-функция следит за сообщениями клавиатуры
WH_MOUSE
вставляемая НООК-функция следит за сообщениями мыши
WH_MSGFILTER
WH_SHELL
WH_SYSMSGFILTER
lpfn
указатель на непосредственно функцию. Обратите внимание, что если Вы ставите глобальный НООК, то НООК-функция обязательно должна находиться в некоторой DLL!!!
hmod
описатель DLL, в которой находится код функции.
dwThreadId
идентификатор потока, в который вставляется НООК
Подробнее о НООК-функциях смотри справку по Win32API.

Как удалять НООК?
НООК удаляется при помощи функции UnHookWindowsEx.

Пример использования НООК.
Ставим НООК, следящий за мышью (WH_MOUSE). Программа следит за нажатием средней кнопки мыши, и когда она нажимается, делает окно, находящееся непосредственно под указателем, поверх всех остальных (TopMost). Код самой НООК-функции помещен в библиотеку lib2.dll, туда же помещены и функции Start - для установки НООК, и Remove - для удаления НООК.

Файл sticker.dpr
Код
program sticker;
 uses windows, messages;
var
 wc : TWndClassEx;
 MainWnd : THandle;
 Mesg : TMsg;
//экспортируем две функции из библиотеки с НООК'ами
procedure Start; external 'lib2.dll' name 'Start';
procedure Remove; external 'lib2.dll' name 'Remove';

function WindowProc(wnd:HWND; Msg : Integer; Wparam:Wparam; Lparam:Lparam):Lresult; stdcall;
var
 nCode, ctrlID : word;
Begin
 case msg of
 wm_destroy :
   Begin
   Remove;//удаляем НООК
   postquitmessage(0); exit;
   Result:=0;
   End;
 else
   Result:=DefWindowProc(wnd,msg,wparam,lparam);
 end;
End;

begin
 wc.cbSize:=sizeof(wc);
 wc.style:=cs_hredraw or cs_vredraw;
 wc.lpfnWndProc:=@WindowProc;
 wc.cbClsExtra:=0;
 wc.cbWndExtra:=0;
 wc.hInstance:=HInstance;
 wc.hIcon:=LoadIcon(0,idi_application);
 wc.hCursor:=LoadCursor(0,idc_arrow);
 wc.hbrBackground:=COLOR_BTNFACE+1;
 wc.lpszMenuName:=nil;
 wc.lpszClassName:='WndClass1';

 RegisterClassEx(wc);

 MainWnd:=CreateWindowEx(0,'WndClass1','Caption',ws_overlappedwindow,
           cw_usedefault,cw_usedefault,cw_usedefault,cw_usedefault,0,0,
           Hinstance,nil);
 ShowWindow(MainWnd,CmdShow);
 Start;//вставляем НООК

 While GetMessage(Mesg,0,0,0) do
  begin
  TranslateMessage(Mesg);
  DispatchMessage(Mesg);
  end;
end.
[code]

[i]Файл lib2.dpr[/i]
library lib2;
uses
 windows, messages;
var
 pt : TPoint;
 theHook : THandle;
function MouseHook(nCode, wParam, lParam : integer) : Lresult; stdcall;
var
 msg : PMouseHookStruct;
 w : THandle;
 style : integer;
Begin
 if nCode<0 then
   begin
   result := CallNextHookEx(theHook, nCode, wParam, lParam);
   Exit;
   end;
 msg := PMouseHookStruct(lParam);
 case wParam of
 WM_MBUTTONDOWN :
   pt := msg^.pt;
 WM_MBUTTONUP :
   begin
   w := WindowFromPoint(pt);
   style := GetWindowLong(w, GWL_EXSTYLE);
   if (style and WS_EX_TOPMOST) <> 0 then
     begin //уже поверх всех - сделать обычным
     ShowWindow(w, sw_hide);
     SetWindowPos(w, HWND_NOTOPMOST, 0,0,0,0, SWP_NOMOVE or SWP_NOSIZE OR SWP_SHOWWINDOW);
     end
   else
     begin //сделать поверх остальных
     ShowWindow(w, sw_hide);
     SetWindowPos(w, HWND_TOPMOST, 0,0,0,0, SWP_NOMOVE OR SWP_NOSIZE OR SWP_SHOWWINDOW);
     end;
   end;
 end;
 Result := CallNextHookEx(theHook, nCode, wParam, lParam);
End;

procedure Start;
begin
 theHook := SetWindowsHookEx(wh_mouse, @mouseHook, hInstance, 0);
 if theHook = 0 then
   messageBox(0,'Error!','Error!',mb_ok);
end;

procedure Remove;
begin
 UnhookWindowsHookEx(theHook);
end;

exports
 Start index 1 name 'Start',
 Remove index 2 name 'Remove';
end.

Всё.

(С) Автор статьи: Sergey Stolyarov
Development и Дельфи (http://MDelphi.far.ru).
При использовании этого материала ссылка на автора и
источник информации обязательна!!!
PM MAIL WWW ICQ YIM   Вверх
Закрытая темаСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1010 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.