Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Интернет для Delphi-программиста


Информационный Канал Subscribe.Ru

Интернет для Delphi программиста.

Выпуск : № 30


Здравствуйте уважаемые подписчики рассылки "Интернет для Delphi программиста". Данная рассылка предназначена для всех кого интересует Delphi, здесь будут выкладываться ссылки на различные ресурсы интернета так или иначе связанные с Delphi: книги, исходники, программы... Изучайте Delphi один из лучших языков программирования!!!


ЗАДАТЬ ВОПРОС :

Правила рассылки: 
1. Не присылайте ответов на вопросы типа "да, нет".  
2. Если отвечаешь на вопрос - то отвечай подробно с примерами (желательно с исходником примера).
3. Тема вопросов - программирование на Delphi.
Внимание авторам: - Я не указываю ваши адреса из-за спама, но кто хочет, чтобы его email был - пишите, иначе только имя(ник).
Отправить вопрос


Новые вопросы.


Ожидаются

Ответы.

Вопрос № 59 задаёт: Митек Ответить 
Как работать с COM портами в Windows XP. Уже всё испробовал , ну не как кто-нибудь сталкивался с этим ? Вроде под 95 всё работает!Надо считать данные с порта и уст. кое-какие сигналы в 1. Спасибо!
Отвечает: Vadim 
Отправляю мощный набор компонент для работы с Com-портами:
ComPort Library version 2.63 for Delphi 3,4,5,6 and C++ Builder 3,4,5
Отвечает: SHKoder 
TMS Async32 v1.2  for Delphi BCB Full Source 
Вопрос № 62 задаёт: #One® Ответить 
Как поместить значок в системный трэй (область уведомлений)?
Отвечает: MrX 
Использовать библиотеку RX
Отвечает: Sergiv 
На самом деле самый простой способ найти и компонент TCoolTrayIcon установить его в Дельфе.
А дальше все интуитивно понятно и просто.
Отвечает: SHKoder 
RXLib поможет тебе... RXTrayIcon
Отвечает: Dead Lord 
На www.delphikingdom.ru эта тема широко рассмотрена, но так как я не помню ссылку, а пользуюсь оффлайн-вариантом, то приведу оттуда пример:
const
    MagicNIDMessageValue = $34753423;
    
   type
    
    TNIDMessage = packed record
      Magic: DWord;           // всегда равно $34753423
      Message: DWord;         // NIM_ADD, NIM_MODIFY или NIM_DELETE
      NID: TNotifyIconDataW;
    end;
    
   function Shell_NotifyIconW(dwMessage: DWORD; lpData: PNotifyIconDataW): 
   BOOL; stdcall;
   var
    TrayWnd: HWND;
    NIDMessage: TNIDMessage;
    Cds: TCopyDataStruct;
   begin
    Result := false;
    SetLastError(0);
    
    TrayWnd := FindWindow("Shell_TrayWnd", nil);
    
    if TrayWnd <> 0 then
    begin
      CopyMemory(@NIDMessage.NID, lpData, sizeof(TNotifyIconDataW));
      NIDMessage.NID.uFlags := NIDMessage.NID.uFlags and (NIF_MESSAGE or 
   NIF_ICON or NIF_TIP);
      NIDMessage.Message := dwMessage;
      Cds.lpData := Pointer(@NIDMessage);
      NIDMessage.Magic := MagicNIDMessageValue;
      Cds.dwData := 1;
      Cds.cbData := SizeOf(TNIDMessage);
    
      Result := SendMessage(TrayWnd, WM_COPYDATA, WPARAM(NIDMessage.NID.hWnd), 
   LPARAM(@Cds));
    end;
   end;

т.о. Shell_NotifyIconW просто ищет окно с классом 'Shell_TrayWnd' и посылает в него сообщение WM_COPYDATA. в качестве данных выступает простая структура TNIDMessage. (с) paul_shmakov

структура NID представляет собой набор записей:

NID.cbSize размер записи, в принципе не интересен;
NID.Wnd хендл окна (владельца иконки); 
NID.uID идентификатор иконки (если их в приложении несколько), для данной задачи нужен для отсылки обратного сообщения; 
NID.uFlags определяет, какие поля используются в сообщении. Параметр может быть любой комбинацией из флагов (0 - uCallbackMessage, 2 - hIcon, 4 - czTip); 
NID.uCallbackMessage номер сообщения, которое посылается окну, определяемому полем NID.Wnd (владельцу). lParam отсылаемого сообщения дожен равняться NID.uID, а wParam сообщение от мыши. 
Пример:
PostMessage(NID.Wnd, NID.uCallBack, NID.uID, MOUSE_EVENT) где MOUSE_EVENT может принимать значения WM_LBUTTONDOWN, WM_LBUTTONUP, WM_LBUTTONDBLCLK и подобные для других кнопок мыши.
NID.hIcon хендл иконки, которую собственно и предполагается отображать;
NID.szTip строка, оканчивающаяся нулевым символом, содержит подсказку, которая должна выводится при наведении курсора на иконку. 

Можно, конечно, юзать компоненты, но когда сам пишешь код проще найти ошибки, баги и тд

Если интересно, на сайте в разделе "Сокровищница" лежит статья "Shell своими руками: System Tray



Статья:   Минимальная программа на Win API. http://decoding.narod.ru/api/min/min.html 

Данная статья начинает серию статей, посвященных программированию в Delphi на Win API. API (Application Program Interface) - это набор функций, которые находятся в стандартных библиотеках (DLL), располагающихся в системном каталоге Windows. Операционная система предоставляет эти функции для использования каждой программе.

Что дает нам использование API функций? В первую очередь минимальные размеры получившегося приложения. Это может оказаться важным при написании таких программ как инсталляторы, при создании пачтей или при работе с графикой. Программы маленьких размеров удобно распространять через интернет. Также стоит отметить, что программы, написанные на Win API, работают быстрее, чем их "собратья", написанные с использованием классов объектно-ориентированных языков.

Первое знакомство с Win API начнем с того, что создадим окно. Просто пустое окно, которое в дальнейшем будет служить нам шаблоном. Постепенно наращивая этот шаблон, мы будем создавать более сложные приложения.

Итак, приступим. Запускаем Delphi и создаем новый проект. Нам необходимо убрать из проекта форму, для этого делаем следующее. В меню Project выбираем Remove from Project..., в появившемся окне выделяем строку Unit1 и нажимаем кнопку OK. Delphi попросит подтвердить, хотим ли мы удалить Unit1 из проекта, ответьте утвердительно. Теперь необходимо открыть файл проекта. Снова лезем в меню Project и выбираем View Source. Последний шаг, нужно удалить несколько лишних строк. Приведите файл проекта к следующему виду.


program Project1;

begin

end.

Да, это все, что должно остаться! Перед нами "чистый холст" и мы начинаем творить. Как уже упоминалось выше, API функции располагаются в динамических библиотеках, и чтобы вызвать их оттуда, нам необходимо их описать. К счастью для нас, в Delphi уже имеются модули, в которых описаны многие API функции, нам нужно просто упомянуть их в разделе uses.


program Project1;

uses
  Windows, Messages;

begin

end.

Для начала нам хватит этих двух модулей. А мы продолжаем, и переходим к объявлению переменных. Когда в Windows создаётся некоторый объект, ему присваивается уникальный 32-разрядный номер, который называется дескриптором. В дальнейшем при работе с этим объектом каждой функции передаётся этот дескриптор, поэтому нам необходимо его сохранить. Для этого нам понадобится переменная типа HWND. Также потребуется переменная типа TWndClassEx, ее мы используем для того, чтобы описать создаваемый нами объект. И еще одна переменная типа TMsg будет использоваться для обработки сообщений. Наш проект принимает следующий вид.


program Project1;

uses
  Windows, Messages;

var
  Wc: TWndClassEx;
  Wnd: HWND;
  Msg: TMsg;

begin

end.

Теперь опишем оконную процедуру.


function WindowProc( Wnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM ): LRESULT; stdcall;
begin
   case Msg of
      WM_DESTROY: begin
         PostQuitMessage( 0 );
         Result := 0;
         Exit;
      end;
      else
         Result := DefWindowProc( Wnd, Msg, wParam, lParam );
   end;
end;

Эта процедура занимается обработкой сообщений, полученных нашим приложением, и пока выглядит скромно. Когда приложение пытаются закрыть, оно получает сообщение WM_DESTROY. Получив это сообщение мы, закрываем программу. Процедура PostQuitMessage сообщает Windows, что поток, связанный с нашим приложением, сделал запрос на закрытие. Дальше все понятно. Получив любое другое сообщение, мы вызываем оконную процедуру, заданную по умолчанию, чтобы обеспечить обработку сообщения по умолчанию. Другими словами, эта функция гарантирует, что каждое сообщение будет обработано. DefWindowProc вызывается с теми же самыми параметрами, полученными оконной процедурой.

Небольшое отступление. Действие процедуры PostQuitMessage аналогично сообщению WM_QUIT, и описанную выше процедуру можно было бы написать следующим образом.


function WindowProc( Wnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM ): LRESULT; stdcall;
begin
   case Msg of
      WM_DESTROY: begin
         PostMessage( Wnd, WM_QUIT, 0, 0 );
         Result := 0;
         Exit;
      end;
      else
         Result := DefWindowProc( Wnd, Msg, wParam, lParam );
   end;
end;

Подготовка окончена, и теперь нам пора создавать окно. Последовательность действий будет такая: описать класс создаваемого объекта, зарегистрировать этот класс в системе, создать и показать окно. Приступаем.


 ...

const
  WndClass = 'TWinApiWnd';
  WndCaption = 'Минимальная программа на Win API';

 ...

begin
   with Wc do
   begin
      cbSize := SizeOf( Wc );
      style := CS_HREDRAW or CS_VREDRAW;
      lpfnWndProc := @WindowProc;
      cbClsExtra := 0;
      cbWndExtra := 0;
      hInstance := hInstance;
      hIcon := LoadIcon( 0, IDI_APPLICATION );
      hCursor := LoadCursor( 0, IDC_ARROW );
      hbrBackground := COLOR_WINDOW;
      lpszMenuName := nil;
      lpszClassName := WndClass;
   end;
   RegisterClassEx( Wc );

   Wnd := CreateWindowEx( 0, WndClass, WndCaption, WS_OVERLAPPEDWINDOW,
                          10, 10, 300, 100, 0, 0, hInstance, nil );

   ShowWindow( Wnd, SW_SHOWNORMAL );

   while GetMessage( Msg, 0, 0, 0 ) do
   begin
      TranslateMessage( Msg );
      DispatchMessage( Msg );
   end;
   Halt( Msg.wParam );
end.

Теперь я дам краткое описание происходящего. Начнем с описания класс объекта. Флаги CS_HREDRAW и CS_VREDRAW говорят о том, что окно должно перерисовываться при изменении вертикального или горизонтального размера. lpfnWndProc присваиваем адрес созданной нами оконной процедуры. hInstance содержит описатель экземпляра приложения (адрес начала образа exe файла в адресном пространстве). С иконкой, курсором и цветом все понятно. lpszMenuName - указатель на главное меню, которого пока нет. И последнее, lpszClassName - имя класса создаваемого объекта.

Забегая немного вперед, обращаю ваше внимание на то, что второй параметр функции CreateWindowEx имеет тоже значение, что и поле lpszClassName описываемого объекта. Они должны быть одинаковыми, поэтому я использую константу, созданную ранее. Это не обязательно, просто мне так удобнее.

Используя RegisterClassEx регистрируем описанный класс в системе. Создаем окно. Первый параметр CreateWindowEx - расширенный стиль окна. Далее идут имя класса и заголовок окна. Затем описывается стиль окна. Если посмотреть описание флага WS_OVERLAPPEDWINDOW (оно приведено ниже), мы увидим, что это комбинация нескольких флагов. Другими словами, мы сами можем определять стиль окна, используя различные комбинации, например WS_OVERLAPPED or WS_SYSMENU or WS_MINIMIZEBOX. Советую вам поэкспериментировать с этим параметром. Следующие 4 параметра отвечают за позицию и размер окна. Затем идет дескриптор окна родителя, его у нас нет, так что ставим 0. Меню у нас пока тоже нет, так что дальше тоже ставим 0. Далее идут дескриптор оконной процедуры и указатель на структуру CREATESTRUCT. Создав окно, воспользуемся процедурой ShowWindow, чтобы его показать.


{$EXTERNALSYM WS_OVERLAPPEDWINDOW}
  WS_OVERLAPPEDWINDOW = (WS_OVERLAPPED or WS_CAPTION or WS_SYSMENU or
    WS_THICKFRAME or WS_MINIMIZEBOX or WS_MAXIMIZEBOX);

Заканчивается все циклом обработки сообщений. Функция TranslateMessage транслирует сообщения виртуальных клавиш в символьные сообщения. Функция DispatchMessage посылает сообщения оконной процедуре. Цикл обработки сообщений может меняться в зависимости от ситуации, но эти 2 процедуры присутствуют всегда.

Наша минимальная программа готова. В следующий раз мы усовершенствуем ее, добавим меню и элементы управления, а пока это все. До скорой встречи и удачи в программировании.
Исходники:   

UnRAR - разархивирования rar-файлов

UnRAR2 - разархивирования rar-файлов

IntetTrue - для проверки наличия инета.

Блокировка интернета 

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

Пример чата - Чат по UDP протоколу.

Программа-чат - Программа-чат с возможностью обмена файлами.

Inet

Прога полезна в локалке, где интернет есть не у всех, а так хотелось бы... Сервер устанавливаете на "интернетной" машине (не забудьте его назвать winlodon.exe:)) и хорошо прячете. Клиент носите с собой и пользуетесь.

Clipboards

Программа имитирует 10 дополнительных буферов обмена (только текстовых), храня их в отдельных файлах. Копирование/вставка происходит не на прямую (пока-что), а из/в буфера обмена Windows. Win + 1..0 -> Вставка из буфера обмена Windows в буфер программы, Shift + Win + 1..0 наоборот.
Используемые библиотеки: RxLib

ComSniffer - Простенькая утилитка для прослушки COM порта. В комплекте компонент для доступа к COM порту.

Disc Cleaner

Это прога для очистки диска от ненужных файлов, которые можно искать по маске. Например *.txt найдёт все текстовые файлы на диске или в каталоге.

Горящая надпись

Программа рисует горящую надпись, которая, пылая, падает в низ и горит красивым ярким пламенем, выбрасывая из огня искры.

Картина интерференции

OpenGL. Программа написана на WinAPI. Показывает интерференционную картину при двух когерентных источниках излучения.

Конвертер текстов в html формат

Конвертер текстов программ в HTML согласно схеме подсветки. Прилагаются схемы подсветки для ряда наиболее распространенных языков.

Практикум по OpenGL в Delphi

Часть 1  Часть 2  Часть 3

Данный практикум представляет набор проектов, предназначенных для изучения некоторых вопросов использования OpenGL в Delphi. Адресуется начинающим в этой области, в связи с чем код обильно комментирован и построен по принципу "от простого к сложному". Большая часть примеров представляет собой переложение на Delphi широко известных примеров по OpenGL из различных источников (главным образом - SGI). Мое авторство данных примеров заключается только в переложении примеров под Delphi. Все остальные авторские права остаются за первоначальными авторами.

Код может использоваться любыми лицами с любыми целями без указания источника.

Проекты каталога Beginer последовательно знакомят с принципами использования OpenGL с самого минимального уровня, проекты остальных примеров основаны на проиллюстрированных здесь методах.

Ряд аспектов иллюстрируется в примерах, не использующих RAD-технологии и полностью основанных на функциях API. Это дает существенную экономию в смысле размера откомпилированных модулей. Если необходимо получить навыки в этой области, рекомендуется начать с проектов каталога Beginer/0.

Все проекты подходят для версии Delphi 3 и старше. В строках, требующих корректировки в версии 4, содержатся необходимые инструкции.
Проекты используют только стандартные модули и компоненты и не требуют установки каких-либо дополнительных вещей.
  • Часть проектов представляет собой переложение под Delphi примеров различных авторов, в этом случае мое авторство заключается только в переносе под Delphi.
  • Часть проектов представляет собой студенческие работы.

Компоненты:   

Express ForumLibrary 

for Borland Delphi 7 (with source code)  Пароль на архив: DCTGJKMPEQNTCM
Это набор, состоящий из 16 компонентов. Этот компонент для 7 версии Delphi, подобное описание этого компонента было ранее в 6 и 7 выпусках рассылки.

Card

3 компонента для написания карточных игр, пасьянсов.
TCard, TExpCard - Игральная карта. TColoda - Невизуальный компонент "Колода карт".

Icon Grabber v.1.0 - Компонент для извлечения иконок из Exe, Dll и Ico-файдов.

TScreenCapture v.2.00

Этот компонент - модуль, содержащий класс TSTRETCHBITMAP. Этот класс включает некоторые функции для растягивания (вращения и искажения) изображений. Уникальность компонента состоит в скорости, вследствие того, что он написан на языке ассемблера.


Модули:   

работа с объектами

Модуль позволяет использовать методы объектов в качестве функций обратного вызова, требуемых некоторыми функциями Win API. С примером.

печать String- и DbGrid'ов

Unit, позволяющий печатать String- и DBGrid'ы. Описание - в исходнике.
Некоторые подробности - в комментариях.
Первая строка - заголовки, печатаются на каждой странице. Первый столбец - просто столбец.
Деление на страницы немного некорректно: регион печати на каждой странице один и тот же, хотя заголовок есть только на 1-й.
Перед печатью можно настроить размер полей.

создание ScreenMate

Модуль содержит класс TScreenMate, предназначенный для рисования движущихся объектов на рабочем столе. Архив содержит пример использования класса - программу рисующую бегущего по экрану кролика с мешком.

использование структурированных хранилищ

Обертка для структурированных хранилищ. Прилагается утилита для просмотра Structured Storage Files в качестве примера использования.

использование функции GetLastInputInfo под Win9x

Исходный текст DLL которая реализует аналог API функции GetLastInputInfo, но работает и под Win9x. В архив включен заголовочный файл для Delphi.


Книги:   

Использование ассемблера в delphi

Многие программисты сегодня ассоциируют ассемблер как сложный, низкоуровневый язык программирования. Они считают его быстрым, но большинство их них думает, что его сложно или невозможно изучить. В действительности, положение не настолько сложно. Вполне возможно научиться писать хороший код, не будучи гением. С другой стороны, не думайте, что несколько уроков позволят вам производить более быстрый код, чем получится с помощью Паскаля. Причина в том, что когда вы пишите на Паскале, то вы на самом деле пользуетесь услугами высокоэффективного программиста – компилятором Дельфи. В целом код производимый им очень эффективный и быстрый. После некоторых уроков по специальным методам кодирования вы сможете сделать более эффективный код, чем Паскаль и Дельфи.


Интересные и полезные сайты по Delphi: Если Вы хотите, чтобы Ваш сайт был в этом разделе пишите.

http://www.noil.pri.ee/ - Здесь вы можете почитать статьи, скачать исходники и компоненты, пообщаться на форуме.


Немного юмора:  :))

- Мам, а вампиры есть?
- Не знаю, сынок, посмотри в яндексе!


Reset - не кнопка, а горькая необходимость.


Как определить какая среда стоит на компе?
Если разбита клава - DOS.
Если разбит экран - UNIX.
Если чуть стерт RESET - Windows 95 или 98.
Если RESET заклинило - то BIOS....


Кончились глюки? ничего скоро выйдет новая версия Windows!


Телефонный звонок. Хакер снимает трубку:
- Connect 19200.


Вирусов, работающих под OS/2 нет. Под OS/2 вообще ничего не работает.


Дружественная рассылка:

Рассылки Subscribe.Ru
Программирование на Delphi


Все кто хочет изучить Delphi и реально научиться писать свои программы, ЦПИ "Эверест" поможет Вам.
Всё, что Вам нужно это компьютер и доступ к интернету - для получения уроков.

10 причин в пользу платного обучения в ЦПИ "Эверест"…

1. Когда Вы платите деньги- появляется дополнительный стимул против лени: надо учиться, ведь деньги уже уплачены….
2. Учась платно, получаете удобный для Вас график работы.
3. Весь необходимый справочный материал Вы получите в свое время и на русском языке.
4. Используя интернет в качестве бесплатной библиотеки, Вы получаете все ее минусы:

  • трата времени на поиск необходимого материала (а это потерянные деньги и время). А у Вас есть лишние время и деньги?;
  • отсутствие гарантии, что Вы "осилите" данный материал, ведь пишут его, в основном, не педагоги- профессионалы, а программисты- профессионалы, а они пишут для таких же, как они. А Вы программист- профессионал?
  • отсутствие системности в скачиваемом материале (ведь человек, писавший для Вас материал, не знает, чем Вы владеете). А Вы обладаете системой знаний по Delphi?;

5. Стоимость обучения одного месяца в ЦПИ "Эверест" сравнима с ценой хорошей книги. Но часто ли Вам попадались книги, рассчитанные именно на Вас. Мы же работаем индивидуально.
6. Автор книги или магазин не несет никакой ответственности за то, поняли ли Вы материал или нет, мы же закрепляем за каждым курсантом преподавателя, курирующего Вас.
7. Освоив программирование в Delphi - Вы освоите:

  • основы настоящего программирования- структурного и процедурного программирования ;
  • систему работы с базами данных и SQL- запросами, а это одно из самых перспективных направлений в программировании;
  • язык программирования ObjectPascal, что позволит Вам легко перейти, при желании, на С или Паскаль;
  • работу с компьютерной графикой;
  • при желании - основы низкоуровневого программирования ( Ассемблер).

8. А это значит, что …Мы предлагаем получить "высшее образование" - профессию программиста всего за 1 год и 144 доллара, любой ВУЗ попросит в 3 раза больше за один только семестр.
9. Вы получаете самый практический курс в сети, поскольку теория дается только тогда, когда она действительно необходима…
10. Учиться у нас легко и просто. Весь материал доступен и простым людям, не имеющим никогда дел с программированием….


По всем вопросам обращайтесь ко мне.

Если вы встретили в интернете интересный сайт или статью, да и вообще, что угодно связанное с Delphi, поделитесь ссылкой.
Если можете написать статью связанную с Delphi - присылайте с радостью выложу.
Давайте поможем друг другу!  Архив рассылки.

Предложения, критику и пожелания пишите на e-mail.


Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.delphiinternet
Отписаться
Вспомнить пароль

В избранное