nyuuzyou/wikis huggingface dataset:
Информация о сетевых интерфейсах

unit netinfo;
interface
uses Libc;
type
 INTERFACE_INFO = packed record
 Name: string;
 IPAddress: string;
 Broadcast: string;
 NetMask: string;
 IsUp: Boolean;
 IsRun: Boolean;
 IsBroadcast: Boolean;
 IsMulticast: Boolean;
 IsLoopBack: Boolean;
 IsPPP: Boolean;
 end;
 TAInfo = record
 INFO: array of INTERFACE_INFO;
 end;
function EnumInterfaces(var IInfo: TAInfo): Boolean;
implementation
function EnumInterfaces(var IInfo: TAInfo): Boolean;
var
 SHandle: Integer;
 len: LongInt;
 buf: PChar;
 ifc: ifconf;
 pifr: pifreq;
 ifr: ifreq;
 lastlen, i: Integer;
 pAddr: PChar;
begin
 Result := False;
 // создать UDP сокет
 SHandle := Socket(AF_INET, SOCK_DGRAM, 0);
 if SHandle = INVALID_SOCKET then exit;
{
При вызове SIOCGIFCONF некоторые реализации
не возвращают ошибок, если буфер слишком мал
для хранения результата вызова (результат просто обрезается)
Поэтому надо сделать вызов, запомнить возвращенную длину,
увеличить буфер и сделать еще один вызов
если после этого вызова длины будут равны - OK!
иначе надо циклично увеличивать буфер.
}
 lastlen := 0;
 len := 100 * SizeOf(ifreq);
 while True do
 begin
 buf := Malloc(len);
 ifc.ifc_len := len;
 PChar(ifc.ifc_ifcu) := buf;
 if ioctl(SHandle, SIOCGIFCONF, @ifc) < 0 then
 begin
 if (errno <> EINVAL) and (lastlen <> 0) then
 warn('ioctl error');
 end
 else
 begin
 if ifc.ifc_len = lastlen then break;
 lastlen := ifc.ifc_len;
 end;
 len := len + 10 * SizeOf(ifreq);
 Free(buf);
 end;
 Result := True;
 // здесь результат получен полностью
 // len - кол-во интерфейсов
 len := ifc.ifc_len div SizeOf(ifreq);
 SetLength(IInfo.Info, len);
 // указатель - на начало буфера
 pifr := ifc.ifc_ifcu.ifcu_req;
 for i := 0 to len - 1 do
 begin
 FillChar(ifr, SizeOf(ifreq), 0);
 // считать очередную порцию данных
 Move(pifr^, ifr, SizeOf(ifreq));
 // имя интерфейса
 IInfo.INFO[i].Name := ifr.ifrn_name;
 // адрес интерфейса
 pAddr := inet_ntoa(ifr.ifru_addr.sin_addr);
 IInfo.INFO[i].IPAddress := pAddr;
 // ШВ адрес
 ioctl(SHandle, SIOCGIFBRDADDR, @ifr);
 pAddr := inet_ntoa(ifr.ifru_netmask.sin_addr);
 IInfo.INFO[i].Broadcast := pAddr;
 // маска сети
 ioctl(SHandle, SIOCGIFNETMASK, @ifr);
 pAddr := inet_ntoa(ifr.ifru_netmask.sin_addr);
 IInfo.INFO[i].NetMask := pAddr;
 // флаги
 ioctl(SHandle, SIOCGIFFLAGS, @ifr);
 IInfo.INFO[i].IsUP := (ifr.ifru_flags and IFF_UP) = IFF_UP;
 IInfo.INFO[i].IsRun := (ifr.ifru_flags and IFF_RUNNING) = IFF_RUNNING;
 IInfo.INFO[i].IsBroadcast := (ifr.ifru_flags and IFF_BROADCAST) = IFF_BROADCAST;
 IInfo.INFO[i].IsLoopBack := (ifr.ifru_flags and IFF_LOOPBACK) = IFF_LOOPBACK;
 IInfo.INFO[i].IsPPP := (ifr.ifru_flags and IFF_POINTOPOINT) = IFF_POINTOPOINT;
 IInfo.INFO[i].IsMulticast := (ifr.ifru_flags and IFF_MULTICAST) = IFF_MULTICAST;
 inc(pifr);
 end;
end;
end.
Author: pve 
Source: Взято с Исходников.Ru
ID: 04621
Category:Kylix
Category:Linux
Использование AutoInc полей в приложениях Midas

{ **** UBPFD *********** by kladovka.net.ru ****
>> Использование AutoInc полей в приложениях Midas
При использовании полей AutoInc в клиентских приложениях
наблюдается следующая ситуация: при вставке новых записей
в таблицу происходит исключение EkeyViolation. Данное
исключение указывает на тот факт, что поле с типом данных
AutoInc автоматически в ClientDataSet не инкрементируется.
По этой причине необходимо постоянно применять и обновлять
данные, после каждой вставки. Т.е. использовать пару
CDS.ApplyUpdates()/CDS.Refresh. Этот прием вполне
приемлем при локальном использовании и клиента и сервера,
но в сети сводит на нет все преимущества использования
DataSnap. И в таком случае клиент не сможет вставлять данные,
если у него нет соединения с сервером или ему (клиенту)
необходимо иметь постоянный доступ к серверу.
Единственный выход из данной ситуации это самому генерировать
значения для полей с типом AutoInc в клиентском приложении.
А когда сервер будет обновлять данные, полеченные от клиента,
то он не будет учитывать значения поля AutoInc при вставке.
Да еще один важный момент касается уже существующих записей.
Когда CDS обновит данные, чтобы нам не конфликтовать с уже
существующими значениями, нужно генерировать отрицательные
значения. Теперь при вставке нам нужно сгенерировать нужное
значение.
Второй код - еще одна возможность: это использование агрегатов
Зависимости: DB, DBClient, MConnect, SysUtils, Classes
Автор: Бушин Сергей, sanbotech@yandex.ru, Братск
Copyright: 1)Бушин Сергей, 2)Borland Corparation
Дата: 14 января 2003 г.
********************************************** }
var
 MyAutoIncValue: LongInt;
procedure TmyModaule.ClientDSAfterInsert(DataSet: TDataSet);
begin
 ClientDS.MyAutoIncField.AsInteger := MyAutoIncValue;
 // генерируем новое значение
 Dec(MyAutoIncValue);
end;
procedure TMyModule.ClientDSAfterRefresh(DataSet: TDataSet);
begin
 // Сбрасываем значение счетчика
 MyAutoIncValue := -1;
end;
// вторая возможность - использование агрегатов
var
 NewID: Integer;
begin
 with ClientDataSet do
 begin
 // вначале отключаем и очищаем агрегаты
 AggregatesActive := False;
 Aggregates.Clear;
 // Теперь добавляем
 with Aggregates.Add do
 begin
 // задаем ему выражение
 Expression := 'Max(AField)';
 // имя
 AggregateName := 'Runtime';
 // активизируем его
 Active := True;
 end;
 // подключаем агрегаты
 AggregatesActive := True;
 try
 // Теперь генерируем наше новое значение
 NewID := Aggregates[0].Value;
 // ...или еще одна альтернатива
 // NewID := Aggregates.Find('Runtime').Value;
 Inc(NewID);
 except
 on E: Exception do SomeHandle;
 end;
 // вставляем и присваиваем
 Insert;
 FieldByName('AField').AsInteger := NewID;
 end;
end;
Author: Бушин Сергей
ID: 04332
Category:MIDAS
Category:Базы данных
Использование BDE в сети

=== Использование BDE в сети ===
; Может ли мое приложение иметь доступ к файлам, расположенным на сетевых дисках?
: Да.
; Когда я попытался это сделать, программа выдала сообщение об ошибке "Not initialized for accessing network files" (не инициализировано для доступа к сетевым файлам).
: Вероятно вам необходимо задать правильный путь к каталогу в поле 'NET DIR' файла IDAPI.CFG. Директория должна быть одна и быть доступна всем пользователям приложения с применением одинаковых подключенных сетевых дисков. (т.е.: если NET DIR указывает на F:\PUBLIC\NETDIR, пользователи с подключенным сетевым диском и имеющим путь G:\NETDIR доступа не получат).
; Возможно ли запустить приложение, относящееся к описываемой категории, с сетевого диска без установленного на локальной машине BDE (за исключением возможных ссылок в локальном файле WIN.INI на копии элементов программы BDE/IDAPI, расположенных на сетевом диске)?
: Да. Установите BDE в сети и затем добавьте следующие секции в файл WIN.INI каждой рабочей станции:
 [IDAPI]
 CONFIGFILE01=F:\IDAPI\IDAPI.CFG
 DLLPATH=F:\IDAPI
 
 [Borland Language Drivers]
 LDPath=F:\IDAPI\LANGDRV
...пути должны отражать текущее месторасположение каталога IDAPI.
; Для установки "NET DIR" мне нужно запустить BDECFG на каждой рабочей станции или просто сделать это на "сервере"?
: C помощью утилиты BDECFG отредактируйте файл IDAPI.CFG и сохраните его в сетевом каталоге IDAPI. Следовательно, вам необходимо проделать данную операцию всего-лишь один раз.
; Если мне нужно сделать это только на сервере, то как все рабочие станции узнают о месторасположении сетевых файлов ("NET DIR")?
: Рабочая станция открывает файл IDAPI.CFG из каталога, указанного в WIN.INI, и уже оттуда читает настройки NET DIR.
Сборник Kuliba
Author: Eryk
Source: Взято из Советов по Delphi от Валентина Озерова
ID: 02610
Использование Drag and Drop для заполнения полей в TWebBrowser?

This example shows how to fill out fields in your webbrowser by
 dragging the content of Label1 to a field of your webbrowser}
procedure TForm1.FormCreate(Sender: TObject);
begin
 label1.DragMode := dmAutomatic;
end;
procedure TForm1.WebBrowserDragOver(Sender, Source: TObject;
 X, Y: Integer; State: TDragState; var Accept: Boolean);
var
 item: Variant;
begin
 // check if document is interactive
 if (Webbrowser.ReadyState and READYSTATE_INTERACTIVE) = 3 then
 begin
 item := WebBrowser.OleObject.Document.elementFromPoint(x, y);
 if Source is TLabel then
 Accept := True;
 Accept := (item.tagname = 'INPUT') and ((item.type = 'text') or
 (item.type = 'password')) or (item.tagname = 'TEXTAREA');
 end;
end;
procedure TForm1.WebBrowserDragDrop(Sender, Source: TObject; X, Y: Integer);
var
 item: Variant;
begin
 // check if document is interactive
 if (Webbrowser.ReadyState and READYSTATE_INTERACTIVE) = 3 then
 begin
 item := WebBrowser.OleObject.Document.elementFromPoint(x, y);
 item.Value := label1.Caption;
 end;
end;
Source: http://www.swissdelphicenter.ch/en/tipsindex.php
ID: 03492
Category:Связь
Category:WebBrowser
Использование DynArrayFromVariant

=== Использование DynArrayFromVariant ===
procedure TForm1.Button1Click(Sender: TObject);
 type
 T2DIntArray = array of array of Integer;
 var
 DynArray: T2DIntArray;
 V: Variant;
 i, k: Integer;
 begin
 V := VarArrayCreate([0, 1, 0, 1], varInteger);
 V[0, 0] := 00;
 V[0, 1] := 01;
 V[1, 0] := 10;
 V[1, 1] := 11;
 DynArrayFromVariant(Pointer(Dynarray), V, TypeInfo(T2DIntArray));
 for i := 0 to High(Dynarray) do
 for k := 0 to High(Dynarray[i]) do
 memo1.Lines.add(IntToStr(DynArray[i, k]));
 end;
 { 
 The problem with DynArrayFromVariant is that you can only use it on 
 variant arrays with 0-based indexes, trying to use it on an array with 1 
 as lower bound blows up. Since the documentation is silent on that i 
 would consider it a bug. 
}
Source: Взято с сайта: http://www.swissdelphicenter.ch
ID: 00805
Использование Enter как Tab в TDBGrid

=== Использование Enter как Tab в TDBGrid ===
Приведу код, позволяющий использовать нажатие клавиши Enter как клавиши Tab пока управление находится в табличной сетке.
Данный код включает обработку клавиши Enter для всего приложения, включая поля и пр.. Код для работы с компонентом DBGrid заключен в блок ELSE. Приведенный код не имитирует поведение клавиши Tab, связанное с переходом на следующую запись когда курсор достигает последней колонки табличной сетки, в нашем случае он перемещается на первую колонку.
{ Это обработчик события OnKeyPress для ФОРМЫ! }
{ Вы должны также установить свойство формы KeyPreview в True }
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
 if Key = #13 then { если это клавиша Enter }
 if not (ActiveControl is TDBGrid) then
 begin { если не на TDBGrid }
 Key := #0; { гасим клавишу Enter }
 Perform(WM_NEXTDLGCTL, 0, 0);
 { перемещаемся на следующий элемент управления }
 end
 else if (ActiveControl is TDBGrid) then { если это TDBGrid }
 with TDBGrid(ActiveControl) do
 if SelectedIndex < (FieldCount - 1) then { увеличиваем поле }
 SelectedIndex := SelectedIndex + 1
 else
 SelectedIndex := 0;
end;
Source: Взято с http://delphiworld.narod.ru
ID: 03076
Category:Базы данных
Category:DBGrid
Использование InputBox и InputQuery

=== Использование InputBox и InputQuery ===
Данная функция демонстрирует 3 очень мощных и полезных процедуры, интегрированных в Delphi. 
Диалоговые окна InputBox и InputQuery позволяют пользователю вводить данные. 
Функция InputBox используется в том случае, когда не имеет значения что пользователь выбирает для закрытия диалогового окна - кнопку OK или кнопку Cancel (или нажатие клавиши Esc). Если вам необходимо знать какую кнопку нажал пользователь (OK или Cancel (или нажал клавишу Esc)), используйте функцию InputQuery. 
ShowMessage - другой простой путь отображения сообщения для пользователя.
procedure TForm1.Button1Click(Sender: TObject);
var
 s, s1: string;
 b: boolean;
begin
 s := Trim(InputBox('Новый пароль', 'Пароль', 'masterkey'));
 b := s <> ;
 s1 := s;
 if b then
 b := InputQuery('Повторите пароль', 'Пароль', s1);
 if not b or (s1 <> s) then
 ShowMessage('Пароль неверен');
end;
Source: Взято с http://delphiworld.narod.ru
ID: 01216
Использование PHP-like операций с массивами

=== Использование PHP-like операций с массивами ===
//Some Array-functions like in PHP.
type
 ArrOfStr = array of string;
implementation
function explode(sPart, sInput: string): ArrOfStr;
begin
 while Pos(sPart, sInput) <> 0 do 
 begin
 SetLength(Result, Length(Result) + 1);
 Result[Length(Result) - 1] := Copy(sInput, 0,Pos(sPart, sInput) - 1);
 Delete(sInput, 1,Pos(sPart, sInput));
 end;
 SetLength(Result, Length(Result) + 1);
 Result[Length(Result) - 1] := sInput;
end;
function implode(sPart: string; arrInp: ArrOfStr): string;
var 
 i: Integer;
begin
 if Length(arrInp) <= 1 then Result := arrInp[0]
 else 
 begin
 for i := 0 to Length(arrInp) - 2 do Result := Result + arrInp[i] + sPart;
 Result := Result + arrInp[Length(arrInp) - 1];
 end;
end;
procedure sort(arrInp: ArrOfStr);
var 
 slTmp: TStringList; 
 i: Integer;
begin
 slTmp := TStringList.Create;
 for i := 0 to Length(arrInp) - 1 do slTmp.Add(arrInp[i]);
 slTmp.Sort;
 for i := 0 to slTmp.Count - 1 do arrInp[i] := slTmp[i];
 slTmp.Free;
end;
procedure rsort(arrInp: ArrOfStr);
var 
 slTmp: TStringList; 
 i: Integer;
begin
 slTmp := TStringList.Create;
 for i := 0 to Length(arrInp) - 1 do slTmp.Add(arrInp[i]);
 slTmp.Sort;
 for i := 0 to slTmp.Count - 1 do arrInp[slTmp.Count - 1 - i] := slTmp[i];
 slTmp.Free;
end;
Source: Взято с сайта http://www.swissdelphicenter.ch/en/tipsindex.php
ID: 00249
Использование PosEx взамен Pos

=== Использование PosEx взамен Pos ===
В Delphi 7 в модуле StrUtils внесены некоторые изменения. 
Есть новая функция: PosEx.
Обьявление этих функций:
function Pos(Substr: string; S: string): Integer;
function PosEx(const SubStr, S: string; Offset: Cardinal = 1): Integer;
Новая функция PosEx, позволяет указать начальную позицию поиска внутри строки, что избавит вас от необходимости изменения исходной строки. Не забудьте указать модуль StrUtils.
Ниже приведена реализация функции в модуле StrUtils (если вы используете более старшую версию среди разработки вы сможете сами добавить этот код и использовать его вместо функции Pos):
function PosEx(const SubStr, S: string; Offset: Cardinal = 1): Integer;
var
 I, X: Integer;
 Len, LenSubStr: Integer;
begin
 if Offset = 1 then
 Result := Pos(SubStr, S)
 else
 begin
 I := Offset;
 LenSubStr := Length(SubStr);
 Len := Length(S) - LenSubStr + 1;
 while I <= Len do
 begin
 if S[I] = SubStr[1] then
 begin
 X := 1;
 while (X < LenSubStr) and (S[I + X] = SubStr[X + 1]) do
 Inc(X);
 if (X = LenSubStr) then
 begin
 Result := I;
 Exit;
 end;
 end;
 Inc(I);
 end;
 Result := 0;
 end;
end;
Source: http://forum.sources.ru
ID: 00085
Использование WSAAsyncSelect в DLL

Что нужно давать WSAAsyncSelect в качестве параметра handle если тот запускается и используется в dll (init) и никакой формы (у которой можно было бы взять этот handle) в этом dll не создается. Что бы такого сделать чтобы работало?
const
 WM_ASYNCSELECT = WM_USER+0;
type
 TNetConnectionsManager = class(TObject)
 protected
 FWndHandle: HWND;
 procedure WndProc(var MsgRec: TMessage);
 end;
constructor TNetConnectionsManager.Create
begin
 inherited Create;
 FWndHandle := AllocateHWnd(WndProc);
 //...
end;
destructor TNetConnectionsManager.Destroy;
begin
 //...
 if FWndHandle <> 0 then DeallocateHWnd(FWndHandle);
 inherited Destroy;
end;
procedure TNetConnectionsManeger.WndProc( var MsgRec : TMessage );
begin
 with MsgRec do
 if Msg = WM_ASYNCSELECT then
 WMAsyncSelect(MsgRec)
 else
 DefWindowProc(FWndHandle, Msg, wParam, lParam);
end;
Hо pекомендую посмотpеть WinSock2, в котоpом можно:
WSAEventSelect(FSocket, FEventHandle, FD_READ or FD_CLOSE);
WSAWaitForMultipleEvents();
WSAEnumNetworkEvents(FSocket, FEventHandle, lpNetWorkEvents);
То есть, обойтись без окон и без очеpеди сообщений windows, а заодно иметь возможность pаботать и с IPX/SPX, и с netbios.
Свой winsock2.pas я вчеpа кинул в RU.DELPHI.DB, если кто имеет такой из дpугих источников - свистните погpомче.
 Alex Konshin
 alexk@msmt.spb.su
 (2:5030/217)
Author: StayAtHome
Source: Vingrad.ru http://forum.vingrad.ru
ID: 03556
Category:Связь
Category:Сокеты
Использование ассоциативных массивов

=== Использование ассоциативных массивов ===
procedure TForm1.Button1Click(Sender: TObject);
var
 DataField: TStrings;
begin
 DataField := TStringList.Create; 
 DataField.Add(Format('%s=%s', ['Jonas', '15.03.1980'])); 
 ShowMessage(DataField.Values['Jonas']) 
 // will print the Birthday of Jonas 
 DataField.Free; 
end;
Source: http://delphiworld.narod.ru
ID: 00798
Использование записей для хранения информации полей

=== Использование записей для хранения информации полей ===
 { 
 You sometimes wish to store multiple information in a given class like 
 in the example: alltogether when it belongs together. 
 Thus accessing this information from out of the class can be achieved 
 using property declaration. Its a good way to "clean your code" and 
 make it as "logic" as possible. 
 You also may have to store or load information from your class using 
 file or stream technology. This can be done at once for the recorded 
 information from within the given class. 
}
 type
 TPersonRecord = Record
 FirstName: String;
 LastName: String;
 BirthDate: TDate;
 End;
 TForm4 = class(TForm)
 Button1: TButton;
 procedure Button1Click(Sender: TObject);
 private
 fActualUser: TPersonRecord;
 //...
 procedure SaveActualUser(S: TFileStream); // it's an example 
 procedure LoadActualUser(S: TFileStream);
 //...
 public
 property FirstName: string read fActualUser.FirstName
 write fActualUser.FirstName;
 property LastName : string read fActualUser.LastName
 write fActualUser.LastName;
 property BirthDate: TDate read fActualUser.BirthDate
 write fActualUser.BirthDate;
 end;
 procedure TForm4.SaveActualUser(S: TFileStream);
 begin
 // All that stuff at once in your Stream 
 S.Write(fActualUser, SizeOf(fActualUser))
 end;
 procedure TForm4.LoadActualUser(S: TFileStream);
 begin
 // All that stuff at once back in your class 
 S.Read(fActualUser, SizeOf(fActualUser));
 end;
Language: en
Source: DelphiWorld 6.0 http://delphiworld.narod.ru/
ID: 00779
Использование классовых методов для выявления утечек памяти

Классовые методы применимы прямо из класса, то есть нет необходимости создавать экземпляр при помощи конструктора.
Хотелось бы определить еще и классовые переменные, но их не существует в Object Pascal, поэтому определим переменную в секции implementation модуля программы. Эта переменная будет содержать количество экземпляров класса на данный момент времени.
Определим две классовые процедуры: AddInstance (увеличение счетчика экземпляров) и ReleaseInstance (уменьшение счетчика экземпляров). Они будут вызываться конструктором и деструктором соответственно. И еще одну классовую функцию NumOfInstances, которая вернет текущее количество экземпляров.
Добавим секции initilialization и finalization. В секции iinalization проверяем количество экземпляров, и если <> 0, значит не все созданные экземпляры были освобождены.
unit U_Foo;
interface
uses
 Classes, Windows, SysUtils;
type
 TFoo = class
 private
 class procedure AddInstance;
 class procedure ReleaseInstance;
 public
 constructor Create;
 destructor Destroy; override;
 class function NumOfInstances: Integer;
 end;
implementation
var
 TFoo_Instances: Integer = 0;
 { TFoo }
class procedure TFoo.AddInstance;
begin
 Inc(TFoo_Instances);
end;
constructor TFoo.Create;
begin
 AddInstance;
end;
destructor TFoo.Destroy;
begin
 ReleaseInstance;
 inherited;
end;
class function TFoo.NumOfInstances: Integer;
begin
 Result := TFoo_Instances;
end;
class procedure TFoo.ReleaseInstance;
begin
 Dec(TFoo_Instances);
end;
initialization
finalization
 if TFoo_Instances <> 0 then
 MessageBox(0, PChar(Format('%d экземпляров of TFoo активно', [TFoo_Instances])),
 'Предупреждение', MB_OK or MB_ICONWARNING);
end.
Source: Delphi Knowledge Base: http://www.baltsoft.com/
ID: 04529
Category:Разработка приложений
Category:Оптимизация и отладка
Использование команды RDTSC процессора Pentium для работы с малыми временными интервалам

=== Использование команды RDTSC процессора Pentium для работы с малыми временными интервалам ===
Приветствую Вас, жители королевства!
В одной толстой книге нашел интересное использование команды RDTSC процессора Pentium для работы с малыми временными интервалами. Я думаю, что эта функция может найти широкое применение (в таймерах, управлении внешними устройствами, научных исследованиях). 
Этот счетчик увеличивается на 1 на каждом такте CPU.
Он стартует при включении компьютера или при нажатии кнопки RESET.
Обычно функцию RDTSC используют при определении тактовой частоты процессора.
Применяя программные ухищрения можно добиться измерения очень малых временных величин в реальном масштабе времени или применять для калибровки таймеров (предварительно определив при помощи этой же функции тактовую частоту процессора). 
Готовые примеры определения тактовой частоты при помощи функции RDTSC есть в интернете, например, на сайте Мастера Delphi" : "Скорость работы процессора, точный таймер" 
function RDTSC: comp;
var
 TimeStamp: record
 case byte of
 1: (Whole: comp);
 2: (Lo, Hi: Longint);
 end;
begin
 asm
 db $0F; db $31;
 {$ifdef Cpu386}
 mov [TimeStamp.Lo], eax
 mov [TimeStamp.Hi], edx
 {$else}
 db D32
 mov word ptr TimeStamp.Lo, AX
 db D32
 mov word ptr TimeStamp.Hi, DX
 {$endif}
 end;
 Result := TimeStamp.Whole;
end;
Source: http://delphiworld.narod.ru
ID: 00686
Использование компонентов Decision Support System при генерации отчетов в QuickReport

; Возможно ли использование компонентов Decision Support System при генерации отчетов в QuickReport и, если да, то каким образом? Если QuickReport не подходит для этих целей, то какие другие варианты вы можете посоветовать?
Самый простой способ - использовать компоненты TQRLabel, текст в которых динамически меняется во время печати (то есть способ, которым можно напечатать все, что угодно, написав при этом немного кода). В принципе можно записать двухмерное сечение куба во временную таблицу или в компонент TClientDataSet, написав соответствующий цикл, и сделать отчет на ее основе.
Использование DecisionQuery в качестве источника данных для отчета также вполне возможно.
Другие возможные варианты - это использование автоматизации Word или Excel либо вычисление сумм внутри отчета. Можно также использовать другие генераторы отчетов - например, с помощью Crystal Reports можно создавать отчеты, содержащие кросс-таблицы.
Author: Наталия Елманова
Source: Взято из http://forum.sources.ru
ID: 03270
Category:Создание отчетов
Использование многомерного массива

=== Использование многомерного массива ===
type RecType = integer; { <-- здесь задается тип элементов массива }
const MaxRecItem = 65520 div sizeof(RecType);
type = MyArrayType = array[0..MaxRecItem] of RecType;
type = MyArrayTypePtr = ^MyArrayType;
var MyArray: MyArrayTypePtr;
begin
 ItemCnt := 10; { количество элементов массива, которые необходимо распределить }
 GetMem(MyArray, ItemCnt * SizeOf(MyArray[1])); { распределение массива }
 MyArray^[3] := 10; { доступ к массиву }
 FreeMem(MyArray, ItemCnt * SizeOf(MyArray[1])); { освобождаем массив после работы с ним }
end;
Сборник Kuliba
Author: Michael Day
Source: Взято из Советов по Delphi от Валентина Озерова
ID: 00243
----
type
 PRow = ^TRow;
 TRow = array[0..16379] of Single;
 PMat = ^TMat;
 TMat = array[0..16379] of PRow;
var
 Mat: PMat;
 X, Y, Xmax, Ymax: Integer;
begin
 Write('Задайте размер массива: ');
 ReadLn(Xmax, Ymax);
 if (Xmax <= 0) or (Xmax > 16380) or (Ymax <= 0) or (Ymax > 16380) then
 begin
 WriteLn('Неверный диапазон. Не могу продолжить.');
 Exit;
 end;
 GetMem(Mat, Xmax * SizeOf(PRow));
 for X := 0 to Xmax - 1 do
 begin
 GetMem(Mat[X], Ymax * SizeOf(Single));
 for Y := 0 to Ymax - 1 do
 Mat^[X]^[Y] := 0.0;
 end;
 WriteLn('Массив инициализирован и готов к работе.');
 WriteLn('Но эта программа закончила свою работу.');
end.
Source: http://delphiworld.narod.ru
ID: 00791