Это короткий фрагмент для ознакомления с книгой.
Обзор
Данный раздел содержит справочную информацию. Как и сами "Советы", он разбит на темы и перечисляет содержащиеся в них сами советы и их количество. По причине большого количества советов, плохих телефонных линий в России, проблематичности большинства пользователей сидеть в Интернете без оглядки на часы, да и просто ввиду непредназначенности Интернета для публикования справочных систем, "Советы по Delphi" не предусматривают online-версии и существуют в виде скомпилированного файла с удобной системой инсталляции.
Введение
Что такое "Советы по Delphi"?
"Советы по Delphi" – коллекция ответов на нетрадиционные вопросы программирования на Delphi, нестандартных решений, хитростей и интересных идей. Для практической пользы дела приведены конкретные примеры кода, позволяющие донести идею или полностью ответить на заданный вопрос.
Aвтором предусматривается попытка на периодичность издания, подробности получения новых версий смотрите на страничке "Получение". При составлении "Советов" не ставилась цель включить ВСЕ материалы, отбирались лишь самые интересные. Источником "Советов" служили многочисленные западные источники (FAQ), кропотливо отобранные и переведенные на русский язык.
Учитывая плачевное состояние наших линий, "Советы" практически не содержат графики. Весь приведенный код отформатирован таким образом, чтобы вы могли скопировать его прямо со странички в свое приложение. По этой же причине отсутствует online-версия "Советов". Тем не менее, оглавление советов приведены на страничке "Индексы" (дабы не оказался кот в мешке).
Так, если Вы обладаете интересной информацией, и ее нет в "Советах", не поленитесь, пришлите ее мне. Пожалуйста не задавайте мне вопросов по электронной почте. У меня есть работа и я занятый человек. Помещайте свои вопросы в группу новостей, я попытаюсь ответить на них там.
Шлите примеры, советы, полезности, статьи и давайте ссылки на свои и не свои сайты. От вас самих зависит наполняемость советов. Авторы! Дайте вторую жизнь вашим произведениям! Присылайте статьи и переводы!
Предупреждение
Яне отвечаю за последствия применения приведенного кода. Используйте его на свой страх и риск. Не нужно меня обвинять и слать гневные письма, если Ваш компьютер взорвется из-за какого-нибудь "Совета".
Тем не менее, если Ваш компьютер все-таки взорвался, сообщите мне пожалуйста об этом и я просмотрю код в поисках ошибки.
Объявление
Aвтор ищет возможность размещения домашней странички "Советов" с возможностью размещения на ней самих "Советов". Желателен канал не меньше 64К и возможность работы по FTP. Страничка небольшая, но "Советы" – растущий файл, который трудно разместить, а тем более скачать с бесплатных серверов. Буду благодарен за предоставленную возможность.
Лицензионное соглашение
Использование Вами любой версии Советов по Delphi указывает на то, что Вы принимаете все условия данного лицензионного соглашения:
Предоставление лицензии
Bалентин Озеров предоставил Вам ограниченную лицензию на "Советы по Delphi". Она НЕ ВКЛЮЧАЕТ В СЕБЯ лицензию на изменение, транслирование, перепроектирование, декомпилирование, дизассемблирование (за исключением случаев, когда соответствующие законы специально запрещают такое ограничение), или создание других программных продуктов, основанных на этом.
Особые условия
Ограничение на обратное конструирование, декомпиляцию и дизассемблирование.
Вы не имеете права предпринимать обратное конструирование, декомпиляцию или дизассемблирование "Советов по Delphi" за исключением и только в той степени, в которой такие действия явно разрешены действующими законами в изъятие из данного положения.
Tак как все программное обеспечение бесплатно, компания Mechanical Result и автор не несут ответственности за любые последствия использования данного программного обеспечения на вашем компьютере.
Советы по Delphi распространяется по принципу "КАК ЕСТЬ", т.е. без гарантий любого вида, включая отсутствие гарантии на соответствие указанным задачам и отсутствие сбоев. Весь риск относительно качества и эффективности программного обеспечения лежит на Вас. Если использование данной программы приведет к проблемам, Вы принимаете на себя всю стоимость любого обслуживания и ремонта.
Механизмы защиты, выполненные в программе, имеют свои ограничения, и Вы, как пользователь, должны решить, отвечает ли данное программное обеспечение в достаточной мере вашим требованиям. Если это так, то Вы можете использовать данное приложение пока Вам это необходимо и пока Вы следуете вышеупомянутым условиям.
Распространение
Вы свободны в распространении Советов по Delphi на любом общественном (открытом) Web/FTP/Gopher сервере без обязательного получения разрешения автора, пока это распространение проводится АБСОЛЮТНО БЕСПЛАТНО. Если Вы хотите издать данный продукт на или совместно с любым носителем (например, на компакт диске с журналом или книгой, на любой коллекции программного обеспечения, совместно с другим программным обеспечением или любым другим дистрибутивным пакетом), требуется разрешение автора. Обычно разрешение может быть получено без проблем – свободно, за исключением некоторых особых случаев.
Помните
Валентин Озеров – единственый человек, который может дать разрешение на коммерческое использование и распространение справочной системы Советы по Delphi.
ЕСЛИ ВЫ НЕ ПОНИМАЕТЕ КАКОЙ-ЛИБО ЧАСТИ ДАННОГО ЛИЦЕНЗИОННОГО СОГЛАШЕНИЯ ИЛИ ВСЕГО СОГЛАШЕНИЯ В ЦЕЛОМ, СВЯЖИТЕСЬ СО МНОЙ ПО ЭЛЕКТРОННОЙ ПОЧТЕ ИЛИ ЛЮБЫМ ДРУГИМ СПОСОБОМ, ЧТОБЫ Я МОГ ОБЪЯСНИТЬ ИХ ВАМ.
Рассылка
Bероятно вы хотели бы иметь у себя самую последнюю версия "Советов по Delphi"? Нет ничего проще. Выберите подходящий способ, отправьте мне письмо и не забудьте указать Ваш email, ФИО и город проживания (исключительно для статистики). Вам будет посылаться раз в месяц небольшой файл (около 150Кб), который позволит установить справочную систему через Интернет.
Вам необходимо:
Подписаться на ежемесячную рассылку? (посылается небольшой файл setup.exe, производящий инсталляцию с сервера).
Oпределитесь и нажмите на соответствующую ссылку.
Цены
Услуга | Стоимость |
---|---|
Справочная система "Советы по Delphi" | Бесплатно |
Размещение монопольного банера на титульной странице в течение месяца | На правах обмена |
Прием советов | Бесплатно |
Ссылки
Разработчик Delphi
Русскоязычные
N | Сервер | Описание |
---|---|---|
1 | http://www.inprise.ru Российское представительство Inprise | Фирма – разработчик Delphi |
Англоязычные
N | Сервер | Описание |
---|---|---|
1 | http://www.inprise.com Inprise | Фирма – разработчик Delphi |
Сайты, посвященные Delphi
Англоязычные
N | Сервер | Описание |
---|---|---|
1 | http://sunsite.icm.edu.pl/delphi Delphi Super Page | Самая большая в мире коллекция компонентов для всех продуктов фирмы Borland. |
Пиратские сайты
Русскоязычные
N | Сервер | Описание |
---|---|---|
1 | http://delphi4.da.ru KiraSoft Warez Page | Delphi distr, DB Aware, Communication, General, Reports, Experts, Misc, Tools, Links |
2 | www.audit.kharkov.com/barry/Delphi Barry's Delphi Page | VCL's, VCL packs, Help Design, FAQ's, IB DataBase, Utilities, Forum |
Другие
N | Сервер | Описание |
---|---|---|
1 | http://www.netease.com/~dce Delphi Components Crack (with Dr.Dai) | Как там написано, "Following components ONLY for Delphi 3.0", остальное понять трудно, как и идентифицировать родной язык автора сайта, хотя по скриншотам разобраться что и где лежит вполне можно |
Домашние страницы
Русскоязычные
N | Сервер | Описание |
---|---|---|
1 | http://www.ph.usmga.ru/lexa Delphi Russian Suite | Сайт, посвященный программированию на Дельфи. Автор страницы Алексей Спицын. Можно скачать документацию по Дельфи (в том числе и на русском языке). Есть список ссылок на страницы в интернете, посвященные Дельфи, а также на адреса электронных версий компьютерных журналов. |
Алгоритмы
Преобразования
HEX→Integer
Решение 1
var
i: integer;
s: string;
begin
s:= '$' + ThatHexString;
i:= StrToInt(a);
end;
Решение 2
CONST HEX: ARRAY['A'..'F'] OF INTEGER = (10,11,12,13,14,15);
VAR str : String;
Int, i: integer;
BEGIN
READLN(str);
Int:= 0;
FOR i:= 1 TO length(str) DO
IF str[i] < 'a' THEN Int:= Int * 16 + ord(str[i]) – 48
ELSE Int:= Int * 16 + hex[str[i]];
WRITELN(Int);
READLN;
END.
Преобразование десятичного числа в шестнадцатиричное
Самое простое преобразование – через строку.
HexString:= Format('%0x', DecValue);
Преобразование ASCII в шестнадцатиричное представление
Строка представляет собой массив байтов в виде ASCII-символов. Необходимо организовать преобразование типов по аналогии с Delphi-функциями Ord и Chr.
Функция BytesToHexStr преобразует, к примеру, набор байтов [0,1,1,0] в строку '30313130', HexStrToBytes выполнит обратное преобразование.
unit Hexstr;
interface
uses String16, SysUtils;
Type
PByte = ^BYTE;
procedure BytesToHexstr(var hHexStr: String; pbyteArray: PByte; InputLength: WORD);
procedure HexStrToBytes(hHexStr: String; pbyteArray: Pointer);
procedure HexBytesToChar(var Response: String; hexbytes: PChar; InputLength: WORD);
implementation
procedure BytesToHexStr(var hHexStr: String; pbyteArray: PByte; InputLength: WORD);
Const
HexChars : Array[0..15] of char = '0123456789ABCDEF';
var
i, j: WORD;
begin
SetLength(hHexStr, (InputLength * 2));
FillChar(hHexStr, sizeof(hHexStr), #0);
j:= 1;
for i := 1 to InputLength do begin
hHexStr[j]:= Char(HexChars[pbyteArray^ shr 4]); inc(j);
hHexStr[j]:= Char(HexChars[pbyteArray^ and 15]); inc(j);
inc(pbyteArray);
end;
end;
procedure HexBytesToChar(var Response: String; hexbytes: PChar; InputLength: WORD);
var
i: WORD;
c: byte;
begin
SetLength(Response, InputLength);
FillChar(Response, SizeOf(Response), #0);
for i:= 0 to (InputLength – 1) do begin
c:= BYTE(HexBytes[i]) And BYTE($f);
if c > 9 then Inc(c, $37)
else Inc(c, $30);
Response[i + 1]:= char(c);
end;{for}
end;
procedure HexStrToBytes(hHexStr: String; pbyteArray: Pointer);
{pbyteArray указывает на область памяти, хранящей результаты}
var
i, j: WORD;
tempPtr: PChar;
twoDigits: String[2];
begin
tempPtr:= pbyteArray;
j:= 1;
for i:= 1 to (Length(hHexStr) DIV 2) do begin
twoDigits:= Copy(hHexStr, j, 2); Inc(j, 2);
PByte(tempPtr)^:= StrToInt('$' + twoDigits); Inc(tempPtr);
end;{for}
end;
end.
UNIT string16.
interface
{$IFNDEF Win32}
procedure SetLength(var S: string; Len: Integer);
procedure SetString(var Dst: string; Src: PChar; Len: Integer);
{$ENDIF}
implementation
{$IFNDEF Win32}
procedure SetLength(var S: string; Len: Integer);
begin
if len > 255 then S[0]:= Chr(255)
else S[0]:= Chr(Len)
end;
procedure SetString(var Dst: string; Src: PChar; Len: Integer);
begin
if Len > 255 then Move(Src^, Dst[1], 255)
else Move(Src^, Dst[1], Len);
SetLength(Dst, Len);
end;
{$ENDIF}
end.
Преобразование двоичного числа в десятичное
Может ли кто-нибудь дать мне идею простого преобразования двоичного кода (base2) в десятичный (base10)?
Решение 1
/////////////////////////////////////////////////////////////////////////
// преобразование 32-битного base2 в 32-битный base10 //
// максимальное число = 99 999 999, возвращает –1 при большем значении //
/////////////////////////////////////////////////////////////////////////
function base10(base2:integer) : integer; assembler;
asm
cmp eax,100000000 // проверка максимального значения
jb @1 // значение в пределах допустимого
mov eax,-1 // флаг ошибки
jmp @exit // выход если –1
@1:
push ebx // сохранение регистров
push esi
xor esi,esi // результат = 0
mov ebx,10 // вычисление десятичного логарифма
mov ecx,8 // преобразование по формуле 10^8-1
@2:
mov edx,0 // удаление разницы
div ebx // eax – целочисленное деление на 10, edx – остаток от деления на 10
add esi,edx // результат = результат + разность[I]
ror esi,4 // перемещение разряда
loop @2 // цикл для всех 8 разрядов
mov eax,esi // результат функции
pop esi // восстанавление регистров
pop ebx
@exit:
end;
Решение 2
function IntToBin(Value: Longint; Size: Integer): String;
var
i: Integer;
begin
Result :='';
for i:= Size downto 0 do begin
if value and (1 shl i)<>0 then begin
Result:= Result+'1';
end else begin
Result:= Result+'0';
end;
end;
end;
Function BinToInt(Value: String): Longint;
var
i,Size: Integer;
begin
Result:= 0;
Size:= Length(Value);
for i:=Size downto 0 do begin
if copy(value,i,1) = '1' then begin
Result:= Result + (1 shl i);
end;
end;
end;
Решение 3
Следующая функция получает в качестве параметра Base (1..16) любую десятичную величину и возвращает результат в виде строки, содержащей точное значение BaseX. Вы можете использовать данный алгоритм для преобразования арабских чисел в римские (смотри ниже).
function DecToBase(Decimal: Longint; const Base: Byte): String;
const Symbols: String[16] = '0123456789ABCDEF';
var
scratch: String;
remainder: Byte;
begin
scratch:= '';
repeat
remainder:= Decimal mod base;
scratch:= Symbols[remainder + 1] + scratch;
Decimal:= Decimal div base;
until (decimal = 0);
Result:= scratch;
end;
Передайте данной функции любую десятичную величину (1…3999), и она возвратит строку, содержащую точное значение в римской транскрипции.
function DecToRoman(Decimal: Longint ): String;
const Romans: Array[1..13] of String = ('I', 'IV', 'V', 'IX', 'X', 'XL', 'L', 'XC', 'C', 'CD', 'D', 'CM', 'M');
Arabics: Array[1..13] of integer = (1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000);
var
i: Integer;
scratch: String;
begin
scratch:= '';
for i := 13 downto 1 do
while (decimal >= arabics[i]) do begin
Decimal:= Decimal – Arabics[i];
scratch:= scratch + Romans[i];
end;
Result:= scratch;
end;
Преобразование ICO в BMP
Решение 1
Попробуйте:
var
Icon: TIcon;
Bitmap: TBitmap;
begin
Icon:= TIcon.Create;
Bitmap:= TBitmap.Create;
Icon.LoadFromFile('c:\picture.ico');
Bitmap.Width:= Icon.Width;
Bitmap.Height:= Icon.Height;
Bitmap.Canvas.Draw(0, 0, Icon);
Bitmap.SaveToFile('c:\picture.bmp');
Icon.Free;
Bitmap.Free;
end;
Решение 2
Способ преобразования изображения размером 32×32 в иконку.
unit main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,Dialogs,ExtCtrls, StdCtrls;
type TForm1 = class(TForm)
Button1: TButton;
Image1: TImage;
Image2: TImage;
procedure Button1Click(Sender: Tobject);
procedure FormCreate(Sender: Tobject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
Procedure Tform1.Button1Click(Sender: Tobject);
var winDC, srcdc, destdc : HDC;
oldBitmap : HBitmap;
...
Все права на текст принадлежат автору: Валентин Озеров.
Это короткий фрагмент для ознакомления с книгой.