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

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


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

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

Выпуск : № 31


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


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

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


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


Вопрос № 65 задаёт: Михаил 
Подскажите пожалуйста, как в StringGrid изменить цвет выделенной ячейки, например на зеленый?
Вопрос № 66 задаёт: CombaSoft
Обрабатываю изображения в jpeg-ах. Необходимо обрабатывать отдельные кадры в mov и avi. Подскажите, как это можно сделать. Нужен простой ответ с четкой последовательностью действий, и с каким-либо примером, "загонящим" к примеру 1-й кадр в TImage.
Вопрос № 67 задаёт: ref 
Интересует всевозможная информация о создании простого скриптового языка на дельфи.
Вопрос № 68 задаёт: #One® 
Требуется, чтобы приложение узнало, когда Виндоус закрывается. Как это сделать?
Вопрос № 69 задаёт: Ольга 
Мне нужен компонент MNSMTP из закладки FastNet. На моей версии Delphi 7 нет такой закладки. Где его взять?

Ответы.

Вопрос № 61 задаёт: Стас Ответить 
Здравствуйте! Как программно разорвать DialUp соединение установленное какой либо другой программой.
Отвечает: illy  
{ ***************************************************
Разрыв Dial-Up соединения
Прекращает активное Dial-Up соединение. Возвращает True в случае успеха
или False, если соединение разорвать невозможно (например при полном или
частичном отсутствии оного :-).
Зависимости: Windows
***************************************************** }

function DisconnectDialUp:Boolean;
var
 Conn: TRasConn;
 Code: DWORD;
 Size: longint;
begin
 Result :=True;
 try
   Conn.dwSize := SizeOf(TRasConn);
   Size:= SizeOf(Conn);
   Code := RasEnumConnections(@Conn, Size, ConnectionsCount);
   if (ConnectionsCount <> 1) or (Code <> 0) then Abort;
   if RasHangUp(Conn.hrasconn) <> 0 then Abort;
 except
  on E: EAbort do Result := False;
 else raise;
 end;
end;


Статья:   Создание главного меню средствами Win API. http://decoding.narod.ru/api/menu/menu.html

Сегодня мы добавим в наше минимальное приложение главное меню. Но прежде рассмотрим некоторые API функции для работы с ним.


CreateMenu

function CreateMenu: HMENU; В случае успешного выполнения, функция возвращает дескриптор созданного меню, иначе возвращает 0.


CreatePopupMenu

function CreatePopupMenu: HMENU; Как и в случае с CreateMenu, после успешного выполнения, функция возвращает дескриптор созданного меню, иначе возвращает 0.


AppendMenu

function AppendMenu( hMenu: HMENU; uFlags, uIDNewItem: UINT; lpNewItem: PChar ): BOOL; Функция AppendMenu добавляет новый элемент (пункт) к концу указанной строки меню, раскрывающегося меню или подменю. Эту функцию можно использовать, чтобы определить содержание, появление, и поведение пункта меню. hMenu Идентификатор строки меню, раскрывающееся меню или подменю, которое будет изменено. uFlags Определяет флажки, управляющие появлением и поведением нового пункта меню. Этот параметр может быть комбинация значений. uIDNewItem Определяет или идентификатор нового пункта меню или, если uFlags параметр установлен в MF_POPUP, дескриптор раскрывающегося меню или подменю. lpNewItem Определяет содержание нового пункта меню.


InsertMenu

function AppendMenu( hMenu: HMENU; uPosition, uFlags, uIDNewItem: UINT; lpNewItem: PChar ): BOOL; Функция InsertMenu вставляет новый пункт в меню, перемещая другие элементы меню вниз. Параметры этой функции те же, что и у AppendMenu, за одним исключением. uPosition Определяет место, в которое должен быть вставлен новый пункт меню.


SetMenu

function SetMenu( hWnd: HWND; hMenu: HMENU ): BOOL; Функция SetMenu связываем новое меню с окном. hWnd Идентификатор окна, которому должно быть назначено новое меню. hMenu Идентификатор меню, которое должно быть назначено окну. Если этот параметр нулевой, текущее меню окна удаляется.


DrawMenuBar

function DrawMenuBar( hWnd: HWND ): BOOL; Функция DrawMenuBar перерисовывает строку меню указанного окна. hWnd Идентификатор окна, чья строка меню нуждается в изменении.


EnableMenuItem

function EnableMenuItem( hMenu: HMENU; uIDEnableItem, uEnable: UINT ): BOOL; Функция EnableMenuItem включает/отключает указанный пункт меню. hMenu Идентификатор меню. uIDEnableItem Определяет пункт меню, состояние которого нужно изменить. uEnable Определяет флажки, управляющие состоянием пункта меню.


CheckMenuItem

function CheckMenuItem( hMenu: HMENU; uIDEnableItem, uEnable: UINT ): BOOL; Функция CheckMenuItem помечает пункт меню или снимает пометку (пометка в виде галочки). hMenu Идентификатор меню. uIDCheckItem Определяет пункт меню, чей атрибут пометки должен быть установлен в соответствии со значением параметра uCheck. uCheck Определяет флажки, управляющие состоянием пункта меню.

Более полную и подробную информацию смотрите в хэлпе. Делая эту программу, я нашел пару способов создать меню (они не очень сильно отличаются друг от друга, но оба имеют право на существование). На первом способе я остановлюсь поподробнее, а, говоря о втором, просто скажу, чем он отличается от первого.

Главное меню программы, это строка, которая располагается в верхней части формы. Она состоит из пунктов, нажатие на любой из них приведет к раскрытию подменю, принадлежащего данному пункту. Это всплывающее меню в Windows называется PopupMenu. Обратите внимание, понятие PopupMenu в Delphi и Windows различаются. В Windows PopupMenu - это подменю, принадлежащее другому пункту меню (который отмечается треугольником справа от текста пункта) или одному из пунктов главного меню. В Delphi PopupMenu — это меню, которое может "всплывать" в любой точке формы. Осознав вышесказанное, приступаем к работе.

Откроем шаблон, написанный в прошлый раз, и дополним список констант и переменных


const
  WndClass      = 'TWinApiWnd';
  WndCaption    = 'Главное меню формы на Win API';
  mFile         = 100;
  mEdit         = 200;
  mCheck        = 300;
  sExit         = 101;
  sCopy         = 201;
  sCut          = 202;
  sPaste        = 203;
  sSelect       = 301;
  sNextMenu     = 302;
  sSecondLevel  = 311;
  SEPARATOR     = 1;

var
  Wc: TWndClassEx;
  Wnd: HWND;
  Msg: TMsg;
  MainMenu: HMENU;
  SubMenuFile: HMENU;
  SubMenuEdit: HMENU;
  SubMenuCheck: HMENU;
  SubMenuSecondLevel: HMENU;
  Check: boolean = false;

Сначала разберемся с константами. Каждый пункт меню должен иметь свой уникальный идентификационный номер. Так как именно по этим номерам мы и будем работать с меню, удобнее всего оформить их как константы. Идея следующая. В главном меню будет 3 пункта: Menu, Edit и Check. Константы для него начинаются с буквы m и имеют номера 100, 200 и 300 соответственно. Каждому из этих пунктов будет сопоставлено свое подменю. Константы для них начинаются с буквы s и номеруются следующим образом: те, которые относятся к первому пункту, начинаются со 100+1, те, которые относятся ко второму пункту, начинаются с 200+1, ну и по аналогии, те, которые относятся к третьему пункту, начинаются с 300+1. В третьем пункте будет подменю второго уровня, константа для него равна 300+10+1. Отдельное значение имеет константа SEPARATOR, это просто разделитель между пунктами подменю.

Переходим к разделу var. Здесь появилось 5 переменных типа HMENU, они содержат Hendle соответствующего меню (какого, понятно из их названия). Переменная Check показывает, установлен или сброшен пункт меню (читайте дальше, и все поймете).

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


function CreateMenuItem( hMenu, SubMenu: HMENU; Cap: PChar;
                         _uID, _wID: UINT; Sep: boolean ): boolean;
var
  Mi: MENUITEMINFO;
begin
   with Mi do
   begin
      cbSize := SizeOf( Mi );
      fMask := MIIM_STATE or MIIM_TYPE or MIIM_SUBMENU or MIIM_ID;
      if not Sep then
         fType := MFT_STRING
      else
         fType := MFT_SEPARATOR;
      fState := MFS_ENABLED;
      wID := _wID;
      hSubMenu := SubMenu;
      dwItemData := 0;
      dwTypeData := Cap;
      cch := SizeOf( Cap );
   end;
   Result := InsertMenuItem( hMenu, _uID, false, Mi );
end;

Поясню входные параметры функции. hMenu - меню, в которое добавляется новый пункт; SubMenu - связанное с этим пунктом подменю (если оно есть); Cap - заголовок нового пункта; _uID - всегда 0 (этот параметр используется в функции InsertMenuItem); _wID - идентификатор, связанный с данным пунктом; Sep - признак, является ли новый пункт разделителем или нет.

Наше приложение должно реагировать на выбор того или иного пункта меню. Дополним оконную процедуру следующим образом:


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;
      WM_COMMAND: begin
         case LOWORD( wParam ) of
            sExit: PostMessage( Wnd, WM_QUIT, 0, 0 );
            sCopy: MessageBox( Wnd, 'Пункт: Copy', 'Меню: Edit', 0 );
            sCut: MessageBox( Wnd, 'Пункт: Cut', 'Меню: Edit', 0 );
            sPaste: MessageBox( Wnd, 'Пункт: Paste', 'Меню: Edit', 0 );
            sSelect: begin
               if Check then
                  CheckMenuItem( SubMenuCheck, sSelect, MF_UNCHECKED )
               else
                  CheckMenuItem( SubMenuCheck, sSelect, MF_CHECKED );
               Check := not Check;
            end;
            sSecondLevel: MessageBeep( MB_ICONHAND );
         end;
      end;
      else
         Result := DefWindowProc( Wnd, Msg, wParam, lParam );
   end;
end;

При выборе пункта Exit (константа sExit) программа будет закрыта. Выбор пунктов Copy, Cut, Paste (константы sCopy, sCut и sPaste соответственно) приведет к появлению сообщения, соответствующего выбранному пункту. Пункт Select (константа sSelect) работает аналогично TCheckBox, то есть может быть установлен или сброшен. При выборе пункта Beep (константа sSecondLevel) мы услышим звуковой сигнал.

Теперь для создания меню все готово. Приступаем.


begin
   // Создаем меню
   MainMenu := CreateMenu;
   // Заполняем структуру TWndClassEx
   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 := @MainMenu;
      lpszClassName := WndClass;
   end;
   // Регистрируем класс в системе
   RegisterClassEx( Wc );
   // Создаем подменю
   SubMenuFile := CreatePopupMenu;
   SubMenuEdit := CreatePopupMenu;
   SubMenuCheck := CreatePopupMenu;
   SubMenuSecondLevel := CreatePopupMenu;
   // Создаем окно
   Wnd := CreateWindowEx( 0, WndClass, WndCaption, WS_OVERLAPPEDWINDOW,
                          10, 10, 300, 100, 0, MainMenu, hInstance, nil );
   // Создаем пункты главного меню
   CreateMenuItem( MainMenu, subMenuFile, 'File', 0, mFile, false );
   CreateMenuItem( MainMenu, subMenuEdit, 'Edit', 0, mFile, false );
   CreateMenuItem( MainMenu, subMenuCheck, 'Check', 0, mFile, false );
   // Подменю для пункта File
   CreateMenuItem( SubMenuFile, 0, 'Exit', 0, sExit, false );
   // Подменю для пункта Edit
   CreateMenuItem( SubMenuEdit, 0, 'Copy', 0, sCopy, false );
   CreateMenuItem( SubMenuEdit, 0, 'Cut', 0, sCut, false );
   CreateMenuItem( SubMenuEdit, 0, '', 0, SEPARATOR, true );
   CreateMenuItem( SubMenuEdit, 0, 'Paste', 0, sPaste, false );
   // Подменю для пункта Check->NextMenu
   CreateMenuItem( SubMenuSecondLevel, 0, 'Beep', 0, sSecondLevel, false );
   // Подменю для пункта Check
   CreateMenuItem( SubMenuCheck, 0, 'Select', 0, sSelect, false );
   CreateMenuItem( SubMenuCheck, SubMenuSecondLevel, 'NextMenu', 0, sNextMenu, false );
   // Перерисовываем меню
   DrawMenuBar( Wnd );
   // Показываем окно
   ShowWindow( Wnd, SW_SHOWNORMAL );

   // Цикл обработки сообщений
   while GetMessage( Msg, 0, 0, 0 ) do
   begin
      TranslateMessage( Msg );
      DispatchMessage( Msg );
   end;
   Halt( Msg.wParam );
end.

Разбираемся. Первым делом создаем главное меню. Указатель на него присваиваем полю lpszMenuName структуры Wc (раньше оно было равно nil). После регистрации класса в системе создаем подменю. При создании окна, параметр hMenu функции CreateWindowEx равен MainMenu (Handle созданного меню, а не 0, как было в шаблоне). После создания всех пунктов, перерисовываем меню при помощи функции DrawMenuBar.

Теперь второй способ создания меню. Здесь я приведу его в сокращении, и поясню произведенные изменения (полный текст программы имеется в архиве с примерами в конце статьи).


begin
   // Заполняем структуру TWndClassEx
   with Wc do
   begin
      ...
      lpszMenuName := nil;
      ...
   end;

   ...

   // Создаем меню
   MainMenu := CreateMenu;

   ...

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

   ...

   // Устонавливаем меню
   SetMenu( Wnd, MainMenu );

   ...
end.

Поле lpszMenuName структуры Wc остается равным nil. Главное меню создаем после регистрации класса в системе. При создании окна, параметр hMenu функции CreateWindowEx можно оставить равным 0, т.к. здесь мы не перерисовываем меню, а назначаем его форме, используя функцию SetMenu.

Все. Теперь у нашей формы есть меню. Это оказалось совсем не сложно. До новых встреч, удачи в программировании.

.: Пример к данной статье :.
Исходники:   

Lancontrolbeta

Программа для локальной сети. Позволяет просматривать/запускать/удалять/копировать себе и на чужой компьютер/распечатывать все файлы и папки "вражьей" машины, а не только открытые для сетевого доступа; просматривать содержимое его экрана с сохранением в jpg или без - в "видео :)" режиме, увидеть список запущенных процессов и завершить "мешающие"... Ну и еще немного :)
Используемые библиотеки: RxLib, Indy 9.0, FastZLib

Modular Implementation of heX Editor

Шестнадцатеричный редактор с гибким плагинным интерфейсом. Поддерживается работа с файлами, а также жесткими дисками, дискетами, физической (оперативной) памятью. Распространяется по лицензии GNU GPL.

Real Information

Прога может быть вам полезна, если вам хочется узнать кое-что о своём компе, о Вашей локальной сети, поиздеваться над видеоадаптером (он много умеет, о чём вы и не подозреваете), узнать кое-что о железе и массу других полезных вещей.

AvtoShema V 2.2

Программа AvtoShema V 2.2. Эта программа предназначена для построения Блок-схемы алгоритма по готовому коду синтаксиса "Паскаль". Загрузка кода как через модуль PAS так и через буфер обмена. Возможна загрузка из сохраненных файлов *.txt; Пригодится для лучшего понимания чужого кода. А также забытого своего для тех кто ленится комментировать. Также благодаря возможности строить схемы через буфер обмена можно строить Блок-схемы кусков кода прямо во время их написания скопировав код и выбрать контекстное меню иконки данной программы в трее. Можно строить цветные блок-схемы. Настраивать размеры блоков, строить очень длинные блок-схемы.
Используемые библиотеки: RxLib, QReport.

Rename Word Files

Программа позволяет переименовывать кучу вордовских документов. В качестве имени выбираются первые несколько слов из документа. Для работы необходим установленный Word.
Использовалась, когда в результате сбоя диска потерялись имена у файлов.


Компоненты:   

TAnimationFX 5.2 For Delphi 

Эта библиотека предоставляет программисту более 150 анимационных эффектов при выводе изображений
shareware d20 d30 d40 d50 d60 c30 c40 c50 c60

TPicShow & TDBPicShow

Version 3.10  shareware  D3,4,5,6,7

Этот компонент позволяет создавать различные эффекты над картинками. 
Можно взять две картинки и создать красивый визуальный переход между ними. 
Таким образом, легким движением руки делаются презентации с переходами между кадрами в виде визуальных эффектов. 
Можно использовать компонент и как способ создания эффектов в графическом редакторе или аниматоре! 

Вот некоторые плюсы и минусы компонента:
Плюсы 

    1) Очень качественно написан исходник!
    2) В комплекте 122 эффекта...
    3) Очень легко добавлять новые эффекты (демка входит в архив);
    4) Эффекты могут просчитываются и прорисовываются в отдельных потоках, что увеличивает скорость обрисовки.
    5) Есть возможность работы с картинками из базы данных.

Минусы

    1) При некоторых сочетаниях настроек замечены глюки, но в основном работает стабильно...
    2) Реально эффектов меньше 122, потому что один эффект повторяется 2-4 раза, просто с разных сторон.

MapiControl

Компонент который занимается отправкой почты через почтовые программы Outlook Express, The bat. Файл занимает всего 9 Кб.

Google Parser 1.00

Google Parser это компонент для WEB-поиска, использующий возможности поискового сервера Google. Каждый найденный результат, это набор свойств: Title, URL, Excerpt, Description, URLs для Category, Translation, Cache, и Similar Pages. Google Parser используется для добавления в приложения возможности поиска в Интернет. В отличие от Google API, Google Parser не ограничено 1000 запросами в день. Google Parser не требует наличия SOAP и компилируется в Delphi Standard. Содержит плагин DIHtmlParser Unicode HTML, который поддерживает TStream интерфейс.

TmxWebUpdate v.1.1

TmxWebUpdate предназначен для подключения возможности автоматического обновления созданных вами приложений. Получает информацию из Web на наличие новых версий, и, если она доступна, загружает её, используя HTTP, затем запускает обновление.

HTTPFileDownloader

HTTPFileDownloader - компонент для скачивания файлов по HTTP-протоколу, базирующийся на компоненте IdHTTP Indy Client.

ProgressBar в StatusBar'e

Невизуальный компонент - ProgressBar, который отрисовывает линейку програсса в Статусбаре. Для настройки нужно указать StatusBar, в котором будет отрисовка и PanelIndex - индекс панели в статусбаре. Работает как в обычном ProgressBar, оптимизировано на отрисовку изменений. Часть кода взято из примеров. Freeware.

Перехватчик ошибок

Невизуальный компонент. Перехватывает обработчик ошибок приложения.Сохраняет ошибки, делает скриншоты происходящего в программе(активной формы в jpg) и предлагает отправить их по почте к разработчикам софта.Все регулируется.Freeware Написал для себя, но думаю, что понадобится многим :)

FastZlib 1.1.4

FastZlib - бесплатная быстрая и удобная реализация zLib (библиотеки для сжатия данных)


Книги для online - чтения:   http://www.noil.pri.ee/?mod=book/book

Delphi 3: библиотека программиста

Учебник по Delphi 4

Иллюстрированный самоучитель по Delphi 6

Иллюстрированный самоучитель по Delphi 7 для начинаюших

Иллюстрированный самоучитель по Delphi 7 для профессионалов


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

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


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

- Что означают числа 95, 98 и 2000 после логотипа Windows? 
- Минимальное количество переустановок, прежде, чем вы привыкнете.


Штирлиц открыл окно, в окно дуло,
Штирлиц нажал Alt-F4 дуло исчезло.....


Пиво, водка, чёрный хлеб - подключайся к фидонет...


У сисадмина спрашивают:
- А вы часто по порносайтам ползаете?
- Нет, все необходимое в кэше нахожу.


Почему у "Микрософт" даже в логотипе кривые окна?


Один (1) звонит другому (2):
(1) - Кинь мне по по модему дистрибутив Виндов
(2) - Лови
Через полчаса:
(1) - Чево-йто ты мне кинул? Этож полуось!
(2) - А у меня модем с коррекцией ошибок!


Пока я была на сессии, муж оставался предоставлен сам себе.
Однажды он решил сварить суп из пакетика. В инструкции сказано:
вскипятить литр воды. Все хорошо, но как этот литр высчитать?
Помогла логика программиста. Он пошел в магазин и купил литровый
баллон клинского.
А потом посмотрел на него и подумал: <А зачем мне суп? >


Из всего софта y меня только BIOS лицензионный!



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

Рассылки 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
Отписаться
Вспомнить пароль

В избранное