nyuuzyou/wikis huggingface dataset:
Работа с портами микропроцессора

=== Работа с портами микропроцессора ===
Модуль для работы с портами микропроцессора с сохранением синтаксиса.
Работает под Win9x.
НЕ работает под WinNT.
// Copyright(c) 1998 Zolotarenko P.V pvz@mail.univ.kiev.ua
unit Ports;
interface
type
 TPort = class
 private
 procedure Set_(index_: word; value: byte); register;
 function Get_(index_: word): byte; register;
 public
 property Element[index_: word]: byte read Get_ write Set_; default;
 end;
 TPortW = class
 private
 procedure Set_(index_: word; value: Word); register;
 function Get_(index_: word): word; register;
 public
 property Element[index_: word]: word read Get_ write Set_; default;
 end;
var
 Port: TPort;
 PortW: TportW;
implementation
procedure TPort.Set_(index_: word; value: byte);
begin
 asm
 mov dx,index_
 mov al,value
 out dx,al
 end;
end;
function TPort.Get_(index_: word): byte;
begin
 asm
 mov dx,index_
 in al,dx
 mov @Result,al
 end;
end;
procedure TPortW.Set_(index_: word; value: word);
begin
 asm
 mov dx,index_
 mov ax,value
 out dx,ax
 end;
end;
function TPortW.Get_(index_: word): word;
begin
 asm
 mov dx,index_
 in ax,dx
 mov @Result,ax
 end;
end;
initialization
 Port := TPort.Create;
 PortW := TPortW.Create;
finalization
 Port.free;
 PortW.free;
end.
Source: Взято с http://delphiworld.narod.ru
ID: 01435
Работа с ресурсами

=== Работа с ресурсами ===
Сохранить файл в ресурсе программы на этапе компиляции можно выполнив следующие шаги:
# Поставить себе RxLib
# Появится в меню "Project" дополнительный пункт меню "Resources"
# Открой его , создай новый ресурс "User Data", в него загрузи нужный файл, измени имя ресурса на что-нибудь типа 'MyResName'.
Теперь при компиляции проекта в exe файл будет прикомпилирован ваш файл в виде ресурса. Извлечь его на этапе выполнения можно следующим образом:
 with TResourceStream.Create(hInstance, 'MyResName', RT_RCDATA) do
 try
 Seek(0, soFromBeginning);
 SaveToFile('MyFileName.exe');
 finally
 Free;
 end;
Author: Vit (www.delphist.com, www.drkb.ru, www.unihighlighter.com, www.nevzorov.org)
Source: Vingrad.ru http://forum.vingrad.ru
ID: 02162
----
А вот целый проект, сделанный показывающий различные приёмы работы с ресурсами: LENIN INC
* http://vingrad.ru/download/delphi/reswork.zip
Author: LENIN INC
Source: Взято с Vingrad.ru http://forum.vingrad.ru
ID: 02163
----
Исходники программы для чтения и изменения ресурсов готовой программы
* http://forum.vingrad.ru/index.php?s=2e1a44e8fd0d842dc2781c6bd964f18a&act=Attach&type=post&id=21633
Большое спасибо Song нашедшему эту программу ResEdit.zip
Author: Song
Source: Взято с Vingrad.ru http://forum.vingrad.ru
ID: 02164
Работа с транзакциями

=== Работа с транзакциями ===
dbMain.StartTransaction;
try
 spAddOrder.ParamByName('ORDER_NO').AsInteger := OrderNo;
 spAddOrder.ExecProc;
 for i := 0 to PartList.Count - 1 do
 begin
 spReduceParts.ParamByName('PART_NO').AsInteger := PartRec(PartList.Objects[i]).PartNo;
 spReduceParts.ParamByName('NUM_SOLD').AsInteger := PartRec(PartList.Objects[i]).NumSold;
 end;
 dbMain.Commit;
except
 dbMain.RollBack;
 raise;
end;
Source: http://delphiworld.narod.ru/
ID: 02427
Работа с удалёнными записями

=== Работа с удалёнными записями ===
procedure TForm1.Table1AfterOpen(DataSet: TDataset);
begin
 SetDelete(Table1, TRUE);
end;
procedure SetDelete(oTable: TTable; Value: Boolean);
var
 rslt: DBIResult;
 szErrMsg: DBIMSG;
begin
 try
 oTable.DisableControls;
 try
 rslt := DbiSetProp(hDBIObj(oTable.Handle), curSOFTDELETEON, LongInt(Value));
 if rslt <> DBIERR_NONE then
 begin
 DbiGetErrorString(rslt, szErrMsg);
 raise Exception.Create(StrPas(szErrMsg));
 end;
 except
 on E: EDBEngineError do
 ShowMessage(E.Message);
 on E: Exception do
 ShowMessage(E.Message);
 end;
 finally
 oTable.Refresh;
 oTable.EnableControls;
 end;
end;
Source: Взято с Delphi Knowledge Base: http://www.baltsoft.com/
ID: 02694
----
В таблицах dBASE записи не удаляются до тех пор, пока таблица не будет упакована. Пока же это не произойдет, удаленные записи остаются в таблице, только имеют при этом флажок "к удалению". Для того, чтобы показать эти существующие, но не отображаемые записи, существует функция ShowDeleted(), которая использует функцию BDE API DbiSetProp(), показывающая записи, помеченные к удалению. При использовании этой функции нет необходимости закрывать и вновь открывать таблицу. ShowDeleted() в качестве параметров передается TTable и логическое значение. Логический параметр указывает на необходимость показа удаленных записей.
Демонстрационный проект:
unit Unit1;
interface
uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ExtCtrls, DBCtrls, Grids, DBGrids, DB, DBTables;
type
 TForm1 = class(TForm)
 Table1: TTable;
 DataSource1: TDataSource;
 DBGrid1: TDBGrid;
 DBNavigator1: TDBNavigator;
 CheckBox1: TCheckBox;
 procedure CheckBox1Click(Sender: TObject);
 public
 procedure ShowDeleted(Table: TTable; ShowDeleted: Boolean);
 end;
var
 Form1: TForm1;
implementation
uses DBITYPES, DBIERRS, DBIPROCS;
{$R *.DFM}
procedure TForm1.ShowDeleted(Table: TTable; ShowDeleted: Boolean);
var
 rslt: DBIResult;
 szErrMsg: DBIMSG;
begin
 Table.DisableControls;
 try
 Check(DbiSetProp(hDBIObj(Table.Handle), curSOFTDELETEON, LongInt(ShowDeleted)));
 finally
 Table.EnableControls;
 end;
 Table.Refresh;
end;
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
 ShowDeleted(Table1, CheckBox1.Checked);
end;
end.
Source: Взято с http://delphiworld.narod.ru
ID: 02695
----
=== Показ меток удаленных записей в dBASE-файлах ===
* Показ меток удаленных записей в dBASE-файлах
ID: 02696
----
Пакование таблиц
with Table1 do
 StrPCopy(TName, TableName);
Result := DBIPackTable(DbHandle, Handle, TName, szDBASE, TRUE);
Задание видимости удаленных записей - вкл/выкл (например, dBase SET DELETED ON/OFF)
DbiSetProp(hDBIObj(Table1.Handle), curSOFTDELETEON, LongInt(bValue));
Source: Взято из "Dtopics Database 1.10 from 3K computer Consultancy": 
ID: 02697
Работа с ячейкой листа Microsoft Excel

{ **** UBPFD *********** by kladovka.net.ru ****
>> Работа с ячейкой листа Microsoft Excel
Получает и заносит число типа double в ячейку листа Microsoft Excel
Зависимости: ComObj
Author: Автор: lookin, lookin@mail.ru, Екатеринбург
Copyright: lookin
Дата: 30 апреля 2002 г.
********************************************** }
// ВНИМАНИЕ: ОБЯЗАТЕЛЬНОЕ условие работы - наличие запущенного Excel
// получение double из заданной ячейки первого листа в заданной рабочей книге
function DoubleValueFromExcelCell(ExcelWorkBook, ExcelCell: string): Double;
var
 i: Integer;
 Excel, v: Variant;
begin
 Excel := GetActiveOleObject('Excel.Application');
 for i := 1 to Excel.Application.Workbooks.Count do
 begin
 if Excel.Application.Workbooks[i].FullName = ExcelWorkBook then
 begin
 v := Excel.Application.Workbooks[i].Sheets[1].Range[ExcelCell];
 DoubleValueFromExcelCell := VarAsType(v, varDouble);
 v := 0;
 end;
 end;
 Excel := 0;
end;
// занесение double в заданную ячейку первого листа в заданной рабочей книге
procedure DoubleValueToExcelCell(Value: Double; ExcelWorkBook, ExcelCell: string);
var
 i: Integer;
 Excel, v: Variant;
begin
 Excel := GetActiveOleObject('Excel.Application');
 for i := 1 to Excel.Application.Workbooks.Count do
 begin
 if Excel.Application.Workbooks[i].FullName = ExcelWorkBook then
 begin
 Excel.Application.EditDirectlyInCell := False;
 v := Value;
 Excel.Application.Workbooks[i].Sheets[1].Range[ExcelCell] := v;
 end;
 end;
end;
Author: lookin
ID: 04404
Category:COM
Category:MS Office
Работа со временем или как реализовать 1.20+1.50=3.10 ?

=== Работа со временем или как реализовать 1.20+1.50=3.10 ? ===
Если Вы создаёте приложение, в котором пользователь вводит значения времени, то стандартные вычисления не подойдут. Проблема в том, что нужно сделать так, чтобы выражение 1.20 + 1.70 было равно НЕ 2.90 а 3.10.
Здесь представлены три функции, которые решают эту проблему. Они работают только с часами и минутами, потому что пользователь очень редко используют секунды, но если Вам потребуются секунды, то Вы без труда сможете доработать эти функции по своему желанию. Вторая и третья функции позволяют преобразовать реальное значение времени в десятичный эквивалент и обратно. Все поля на форме будут в формате hh.mm.
function sumhhmm(a, b: double): double;
var
 h1: double;
begin
 h1 := (INT(A) + INT(B)) * 60 + (frac(a) + frac(b)) * 100;
 result := int(h1 / 60) + (h1 - int(h1 / 60) * 60) / 100;
end;
function hhmm2hhdd(const hhmm: double): double;
begin
 result := int(hhmm) + (frac(hhmm) / 0.6);
end;
function hhdd2hhmm(const hhdd: double): double;
begin
 result := int(hhdd) + (frac(hhdd) * 0.6);
end;
Использование:
 
 // sumtime(1.20,1.50) => 3.10 
 // sumtime(1.20,- 0.50) => 0.30 
 // hhmm2hhdd(1.30) => 1.5 (1h.30m = 1.5h) 
 // hhdd2hhmm(1.50) => 1.30 (1.5h = 1h30m) 
Author: Hans Pieters
Source: Взято из http://forum.sources.ru
ID: 00190
Разбиение шестнадцатиричной величины

function LoNibble(X: Byte): Byte;
begin
 Result := X and $F;
end;
function HiNibble(X: Byte): Byte;
begin
 Result := X shr 4;
end;
Приведенные функции разделят ваше число на две половинки, нижнюю и верхнюю. Если вам необходимо отображать их с ведущим нулем, то используйте IntToHex подобным образом:
Label1.Caption := 'Верхняя часть - ' + IntToHex(HiNibble($2E), 2);
Label2.Caption := 'Нижняя часть - ' + IntToHex(LoNibble($2E), 2);
Source: http://delphiworld.narod.ru/
ID: 04062
Category:Алгоритмы
Category:Математика
Разбор адреса FTP

{ **** UBPFD *********** by kladovka.net.ru ****
>> Разбор адреса FTP
Функция анализирует строку aSrc и если в стоке дан корректный адрес FTP, возвращает имя пользователя, пароль, хост, порт и каталог. Если дан некорректный адрес, функция возвращает false, иначе - true.
Учтена возможность, когда в адресе не указываются некоторые параметры. В этом случае, если нотация соблюдена, опущенные параметры возвращаются пустыми строками.
Минимально подробный адрес: ftp://myftp.ru - В этом случае будет возвращён адрес, порт по умолчанию (21) и true.
Максимально подробный адрес: ftp://MyLogin:MyPassword@MyFtp.ru:6000/MyDirectory/ - Будут возвращены все параметры и true.
Зависимости: Classes, SysUtils
Copyright: Роман Василенко
Дата: 13 июня 2004 г.
********************************************** }
function ParseFTP(aSrc: string; out oUserName, oPassword, oHost: string;
 out oPort: word; out oDir: string): boolean;
const
 ssPrefix = 0;
 ssUserName = 1;
 ssPassword = 2;
 ssHost = 3;
 ssPort = 4;
 ssDir = 5;
var
 f, StrState: Integer;
 sPort, pfx: string;
begin
 oUserName := ;
 oPassword := ;
 oHost := ;
 sPort := ;
 oPort := 21;
 oDir:=;
 StrState := ssPrefix;
 Result := False;
 f := 1;
 repeat
 case StrState of
 ssPrefix: // Разбор префикса ftp:// и определение анонимности адреса
 if aSrc[f] <> ':' then
 pfx := pfx + aSrc[f]
 else
 begin
 if (AnsiSameText(Trim(pfx), 'ftp'))
 and (aSrc[f] + aSrc[f + 1] + aSrc[f + 2] = '://') then
 begin
 if Pos('@', aSrc) < 1 then
 StrState := ssHost // Anonymous
 else
 StrState := ssUserName; // UserName[:Password]
 Inc(f, 2);
 end
 else break;
 end;
 ssUserName: // Извлечение имени пользователя
 if aSrc[f] = '@' then // Пароль не указан
 StrState := ssHost
 else
 if aSrc[f] = ':' then // Пароль указан
 StrState := ssPassword
 else
 oUserName := oUserName + aSrc[f];
 ssPassword: // Извлечение пароля
 if aSrc[f] = '@' then
 StrState := ssHost
 else
 oPassword := oPassword + aSrc[f];
 ssHost: // Извлечение хоста
 if aSrc[f] = ':' then // Порт указан
 StrState := ssPort
 else
 if aSrc[f] = '/' then // Порт не указан, возможно указан каталог
 StrState := ssDir
 else
 oHost := oHost + aSrc[f];
 ssPort: // Извлечение порта
 if aSrc[f] = '/' then
 StrState := ssDir
 else
 sPort := sPort + aSrc[f];
 ssDir:
 oDir := oDir + aSrc[f];
 end;
 Inc(f);
 until f > Length(aSrc);
 if (StrState > ssPassword) and (Trim(oHost) <> ) then
 Result := True;
 try
 if Trim(sPort) <> then
 oPort := StrToInt(sPort);
 except
 Result := False;
 end;
end;
Пример использования:
procedure TForm1.Button1Click(Sender: TObject);
const
 yn: array[false..true] of string=('INVALID', 'VALID');
var
 xValid: boolean;
 xUser, xPassword, xHost, xDir: string;
 xPort: word;
begin
 xValid := ParseFTP(Edit1.Text, xUser, xPassword, xHost, xPort, xDir);
 ShowMessage(Format('Address is %s'#13#13'Host: %s'#13'Port: %d'#13+
 'Dir: %s'#13'User: %s'#13'Password: %s',
 [yn[xValid], xHost, xPort, xDir, xUser, xPassword]));
end;
Author: Роман Василенко
ID: 03379
Category:Связь
Разбудить компьютер по сети, Использование Bios Wake-on-Lan

=== Разбудить компьютер по сети, Использование Bios Wake-on-Lan ===
{$APPTYPE CONSOLE}
uses
 SysUtils,
 Classes,
 IdBaseComponent,
 IdComponent,
 IdUDPBase,
 IdUDPClient;
function HexStringToBinString(const HexStr: string): string;
var
 i, l: integer;
begin
 Result := ;
 l := length(HexStr);
 l := l div 2;
 SetLength(Result, l);
 for i := 1 to l do
 if HexToBin(PChar(Copy(HexStr, (i - 1) * 2 + 1, 2)),
 PChar(@Result[i]), 1) = 0 then
 raise Exception.Create('Invalid hex value');
end;
procedure SendMagicPacket(MACAddress: string);
var
 s, packet: string;
 i: integer;
begin
 if Length(MACAddress) <> 12 then
 raise Exception.CreateFmt('Invalid MAC Address: %s', [MACAddress]);
 packet := HexStringToBinString('FFFFFFFFFFFF');
 s := HexStringToBinString(MACAddress);
 for i := 1 to 16 do
 packet := packet + s;
 with TIdUDPClient.Create(nil) do
 try
 Active := true;
 BroadcastEnabled := true;
 Broadcast(packet, 9);
 finally
 Free;
 end;
end;
begin
 if ParamCount <> 1 then
 WriteLn('usage: WakeOnLan MACAddress' + #10 + #13 + 'exmple: WakeOnLan 000102030405')
 else
 SendMagicPacket(ParamStr(1));
end.
Author: Song
Source: Взято из http://forum.sources.ru
ID: 01364
Разделитель дробной части по-умолчанию

=== Разделитель дробной части по-умолчанию ===
Чтобы выставить в качестве разделителя точку вместо запятой, которая используется для русской локали по-умолчанию, нужно при инициализации программы прописать
DefaultFormatSettings.DecimalSeparator := '.';
Но как оказалось, если при работающей программе Windows уйдет в режим ожидания (смены пользователя) и вернется, то разделитель опять становится запятой и программа начинает работать некорректно.
Для того, чтобы не изменялись переменные с разделителями надо в коде старта программы после Initialize добавить Application.UpdateFormatSettings := False;
 Application.Initialize;
 DefaultFormatSettings.DecimalSeparator := '.';
 Application.UpdateFormatSettings := False;
Source: http://www.freepascal.ru/forum/viewtopic.php?t=43123
Разделяемые элементы управления для Tabbednotebook

=== Разделяемые элементы управления для Tabbednotebook ===
Вы могли бы получить тот же эффект, устанавливая элементы управления на панели или в другом контейнере, который не является дочерним по отношению к Notebook, но находится наверху. Поскольку элементы не являются дочерними по отношению к страницам, то их никак не затронет изменение страниц, и вы можете управлять ими из кода. Видимость же такова, что кажется, что каждая страница компонента содержит тот же самый набор компонентов. 
Что делаю я -- располагаю разделяемые элементы управления на форме, а не на конкретной странице TTabbedNotebook. Для того, чтобы сделать это, вам необходимо установить свойство TTabbedNotebook Align на что-то другое, отличное от alClient -- например, если разделяемые элементы управления расположены в нижней части формы, используйте для TTabbedNotebook значение alTop, и отодвиньте нижнюю границу чуть повыше, чтобы в образовавшейся области без труда разместились бы разделяемые элементы управления. 
Если вы хотите сделать так, чтобы "разделяемые" элементы управления имитировали свое нахождение на каждой странице TTabbedNotebook, оставьте их на форме, но поместите их на передний план, и передвиньте TTabbedNotebook снова в нижнюю часть формы. 
У меня это работает. Я еще не испытывал нужду в разделяемых элементах управления для _набора_ страниц, но первая идея, которая приходит мне в голову, заключается в установке свойства Visible для каждого компонента в true/false в обработчике события TTabbedNotebook OnChange. 
Source: http://delphiworld.narod.ru/
ID: 01184
----
Вероятно, самым лучшим решением будет размещение разделяемых компонентов непосредственно на форме, и дальнейшее их перемещение в коде на TabbedNotebook, тем самым делая их видимыми на нескольких страницах компонента. 
Для любых закладок, где разделяемые компоненты НЕ должны появляться, установите их свойство Visible в False, сделать это лучше всего в обработчике события TabbedNotebook OnChange. 
Source: http://delphiworld.narod.ru/
ID: 01185
----
Компоненты, которые вы хотите показывать на всех страницах, должны принадлежать родителю TTabbedNotebook (в общем случае TForm, на которой расположен компонент), и, очевидно, они должны быть размещены ПОЗАДИ TTabbedNotebook. Самым простым способом сделать это, как я выяснил, является следующий способ: разместите на форме TTabbedNotebook, но оставьте возможность задать ему родителя (например, пока не устанавливайте ему свойство .Align), затем разместите кнопки (или что там у вас) в области родителя, затем установите свойство .Align у TTabbedNotebook, после чего элементы управления, которые вы разместили, окажутся позади TTabbedNotebook, и будут видны на всех его страницах (действительно, они будут располагаться "наверху" TTabbedNotebook. Если вы уже разместили компоненты, то лучшим решением будет использование для TTabbedNotebook команды меню "Edit/Send to Back", при котором нижние компоненты "всплывут" наверх. Также, возможно непосредственно отредактировать файл .DFM и убедиться в том, что родительский порядок компонентов соблюден в полной мере. 
Source: http://delphiworld.narod.ru/
ID: 01186
----
Различные разрешения - различные размеры шрифтов

=== Различные разрешения - различные размеры шрифтов ===
Я также долго мучился над проблемой решения этого вопроса, и ниже я излагаю свои выводы на основании моих многочисленных экспериментов. 
Свойство, отвечающее за размер шрифта важно, но не менее важны в этом вопросе и другие характеристики. 
Я получал безобразные результаты при изменении резолюции, пока я не начал задавать размер шрифта в пикселях (pixels) вместо точек (points). Вы можете установить font.height, и вы можете установить font.size. Я обнаружил, что установка значения font.height дает значительно лучшие результаты, поскольку данное свойство определяет количество пикселей, и размер шрифта меняется пропорционально изменению размера пикселя.
 
Также, вы можете обнаружить, что шрифт по-умолчанию не может быть ниже определенной высоты. Будет гораздо лучше, если вместо SYSTEM вы выберите шрифт MS sans-serif. 
У формы имеется свойство, названное "scaling" (взял из памяти, надеюсь верно). Я обнаружил, что лучше его иметь выключенным. Если свойство включено, Delphi или Windows пытаются при изменении размера формы все соответственно смаштабировать. Все это хорошо только для сохранения относительных позиций элементов, так что я выключил свойство, и больше о нем не вспоминал. 
Если свойство выключено, а форма ваша максимизирована, вы обнаружите, что все ваши компоненты устремились вслед за левым верхним углом формы. Где не желателен этот эффект, я получал разрешение экрана (Screen.Height и Screen.Width) и прислаивал свойствам компонентов Left и Тор скорректированные свойства прежде, чем форма успевала появиться (в методе OnCreate, во время выполнения приложения). 
В целом же, завершая рассказ, следует подчеркнуть, что выключенное свойство scaling и использование пикселей вместо точек для изменения размеров шрифта, дает вполне приемлемый результат.
Source: Взято с http://delphiworld.narod.ru
ID: 01929
Различные стили подчеркивания для TRichEdit

=== Различные стили подчеркивания для TRichEdit ===
uses
 RichEdit;
// Underline styles 
const
 CFU_UNDERLINETHICK = 9;
 CFU_UNDERLINEWAVE = 8;
 CFU_UNDERLINEDASHDOTDOT = 7;
 CFU_UNDERLINEDASHDOT = 6;
 CFU_UNDERLINEDASH = 5;
 CFU_UNDERLINEDOTTED = 4;
 CFU_UNDERLINE = 1;
 CFU_UNDERLINENONE = 0;
procedure RE_SetCharFormat(ARichEdit: TRichEdit; AUnderlineType: Byte; AColor: Word);
var
 // The CHARFORMAT2 structure contains information about 
 // character formatting in a rich edit control. 
 Format: CHARFORMAT2;
begin
 FillChar(Format, SizeOf(Format), 0);
 with Format do
 begin
 cbSize := SizeOf(Format);
 dwMask := CFM_UNDERLINETYPE;
 bUnderlineType := AUnderlineType or AColor;
 ARichEdit.Perform(EM_SETCHARFORMAT, SCF_SELECTION, Longint(@Format));
 end;
end;
// Underline the current selection with a CFU_UNDERLINEWAVE line style (color red); 
procedure TForm1.Button1Click(Sender: TObject);
 begin
 RE_SetCharFormat(RichEdit1, CFU_UNDERLINEWAVE, $50);
 end;
Language: en
Source: Взято с сайта: http://www.swissdelphicenter.ch
ID: 01028
Размер Bitmap

function PictureSize: TSize;
var
 ResHandle: HWND;
 ResData: HWND;
 BMI: PBitmapInfo;
begin
 Result.cx := 0;
 Result.cy := 0;
 ResHandle := FindResource(HInstance, MAKEINTRESOURCE(200), RT_BITMAP);
 if ResHandle <> 0 then
 begin
 ResData := LoadResource(HInstance, ResHandle);
 if ResData <> 0 then
 try
 BMI := LockResource(ResData);
 if Assigned(BMI) then
 try
 Result.cx := BMI.bmiHeader.biWidth;
 Result.cy := BMI.bmiHeader.biHeight;
 // размер картинки вот тут: BMI.bmiHeader.biSizeImage
 finally
 UnlockResource(ResData);
 end;
 finally
 FreeResource(ResData);
 end;
 end;
end;
Author: Rouse_
Source: http://forum.sources.ru
ID: 03827
Category:Графика
Category:Bitmap
Размеры полей таблицы Paradox

=== Размеры полей таблицы Paradox ===
Данная общая информация могла бы быть полезной при вычислении максимального размера записи для установки размера каждого блока.
Требования к предельным размерам типов полей таблицы Paradox
Данный список указывает количество байт каждого типа поля таблицы Paradox, занимаемое в структуре записи. Имейте в виду, что указанный размер занимает каждое поля в самом файле .DB, не во вспомогательных файлах типа .MB.
Тип данных 	Байт
Alphanumeric 	1 байт на символ, до 255
AutoIncrement 	4 байта
Binary (BLOB) 	10 байт + 1 на символ. В пределе (0 - 240) [1]
Bytes 	1 на символ, максимально до 255.
BCD 	17
Currency (Денежный)	8
Date 	4
Formatted Memo 	10 байт + 1 на символ. В пределе (0 - 240)
Graphic 	10 байт + 1 на символ. В пределе (0 - 240)
Memo 	10 байт + 1 на символ. В пределе (1 - 240) [2]
Logical 	1
LongInt 	4
Numeric (Числовой) 	8
OLE 	10 байт + 1 на символ. В пределе (0 - 240)
SmallInt 	2
Time 	4
TimeStamp 	8
 Пределы
Maximum Field Count
(максимальное количество полей)	255 полей
Maximum Blocks per table
(максимальное количество блоков в таблице)	64К
Maximum Block Size
(максимальный размер блока)	32К символов
Max Record Size, unkeyed
(максимальный размер записи, неключевой)	Текущий размер блока - 6 байта [3]
Max Record Size, keyed
(максимальный размер записи, ключевой)	(BlockSize - 6) / 3, округляется в меньшую сторону
до ближайшего размера блока. [4]
Сноски:
[1] Все blob-поля содержат 10-байтовые указатели на .MB-файл, которые указывают где могут быть найдены "остальные" значения поля.
[2] В отличие от данных "blob"-типа, Memo-поле требует по крайней мере один "Memo"-символ, сохраненный в .DB-файле, для обеспечения совместимости с Paradox for DOS.
[3] Размер блока по умолчанию хранится в IDAPI.CFG. Для изменения значения по умолчанию, запустите Configuration Utility и измените установку Tables, Paradox, Block Size. Значение по умолчанию 2048 и может изменяться в диапазоне от 1024 до 32К. 6 байтов в данном значении резервируются для внутренних указателей.
[4] Это следствие наличия значений ключа записей Paradox, которые передаются в .PX файл, очень похожий на табличный файл. Размер ключа не может превышать 1/3 размера блока таблицы; в противном случае Paradox будет пытаться увеличить размер блока. При выполнении вычислений не забывайте брать в расчет 6-байтные указатели.
Author: John B Moore
Source: Взято из Советов по Delphi от Валентина Озерова
ID: 02950
Category:Базы данных
Category:Paradox