nyuuzyou/wikis huggingface dataset:
Получение информации о таблице

=== Получение информации о таблице ===
Вам нужно воспользоваться свойством FieldDefs. В следующем примере список полей и их соответствующий размер передается компоненту TMemo (расположенному на форме) с именем Memo1:
procedure TForm1.ShowFields;
var
 i: Word;
begin
 Memo1.Lines.Clear;
 Table1.FieldDefs.Update;
 { должно быть вызвано, если Table1 не активна }
 for i := 0 to Table1.FieldDefs.Count - 1 do
 with Table1.FieldDefs.Items[i] do
 Memo1.Lines.Add(Name + ' - ' + IntToStr(Size));
end;
Если вам просто нужны имена полей (FieldNames), то используйте метода TTable.GetFieldNames:
GetIndexNames для получения имен индексов:
var
 FldNames, IdxNames: TStringList;
begin
 FldNames := TStringList.Create;
 IdxNames := TStringList.Create;
 try
 if Table1.State = dsInactive then
 Table1.Open;
 Table1.GetFieldNames(FldNames);
 Table1.GetIndexNames(IdxNames);
 {...... используем полученную информацию ......}
 finally
 FldNames.Free; { освобождаем stringlist }
 IdxNames.Free;
 end;
end;
Для получения информации об определенном поле вы должны использовать FieldDef.
Source: Взято с http://delphiworld.narod.ru
ID: 02601
Получение количества тактов процессора с момента перезагрузки

=== Получение количества тактов процессора с момента перезагрузки ===
{ **** UBPFD *********** by delphibase.endimus.com ****
>> Получение количества тактов процессора с момента перезагрузки
Получение количества тактов процессора с момента перезагрузки.
Производится вызов команды RDTSC x86 процессора.
Имеются во всех процах начиная с Pentium/586.
Подходит для всех версий Дельфи, где есть тип Int64.
Для остальных можно переписать слегка -
результат перекладывать в две переменные Integer.
Я ее использую для определения кол-ва
процессорного времени на выполнение куска кода.
Зависимости: можно использовать на всех процах, начиная с Pentium
Copyright: справочник по командам процессора Pentium
Дата: 17 декабря 2003 г.
***************************************************** }
function RDTSC: int64; assembler;
asm
 db $0F,$31 // RDTSC
end;
Пример использования: 
var
 TimePeriod: int64;
begin
 TimePeriod := RDTSC;
 { кусок анализируемого кода }
 TimePeriod := RDTSC - TimePeriod;
 { полученное значение TimePeriod можно анализировать }
end;
Source: http://delphibase.endimus.com
ID: 02062
Получение количества установленных процессоров

=== Получение количества установленных процессоров ===
function GettingProcNum: string; // Win95 or later and NT3.1 or later
var
 Struc: _SYSTEM_INFO;
begin
 GetSystemInfo(Struc);
 Result := IntToStr(Struc.dwNumberOfProcessors);
end;
ID: 01433
Получение параметра из строки по его индексу

=== Получение параметра из строки по его индексу ===
{ **** UBPFD *********** by kladovka.net.ru ****
>> Получение параметра из строки по его индексу, а также получение общего числа параметров в строке
В юните представлены две функции, одна из которых, GetParamFromString, позволяет получить параметр из строки, по индексу этого параметра (индексация начинается с 1). Параметров в строке, я называю части строк, разделённые каким-нибудь оговорённым разделителем, например символом ";".
К пример строка "fex;9x-1;code" имеет три параметра: 
fex
9x-1
code.
Описание аргументов функции GetParamFromString:
SourceStr - строка, содержащая в себе параметры;
Delimiter - разделитель параметров в строке;
Ind - индекс запрашиваемого параметра.
Функция GetParamsCount просто возвращает количество параметров в строке.
Описание аргументов функции GetParamsCount:
SourceStr - строка, содержащая в себе параметры;
Delimiter - разделитель параметров в строке;
Зависимости: Windows
Автор: VID, ICQ:132234868, Махачкала
Copyright: (c) не моё
Дата: 26 апреля 2004 г.
********************************************** }
unit getstrparam;
interface
 uses Windows;
 function GetParamsCount (const SourceStr, Delimiter:String): integer;
 function GetParamFromString(const SourceStr,Delimiter:String; Ind:integer):string;
implementation
function GetDTextItem(DText, delimeter: PChar; var idx: Integer): PChar;
var
 nextpos: PChar;
 i, len, p: Integer;
begin
 Result := DText;
 len := Length(delimeter);
 if (len = 0) or (DText = ) then Exit;
 i := 1;
 while True do
 begin
 p := Pos(delimeter, Result);
 if (p <> 0) then
 nextpos := Pointer(Integer(Result) + p - 1)
 else
 nextpos := Pointer(Integer(Result) + Length(Result));
 if (i = idx) or (p = 0) then Break;
 Result := Pointer(Integer(Nextpos) + len);
 Inc(i);
 end;
 if i = idx then
 Byte(nextpos^) := 0
 else
 Byte(Result^) := 0;
end;
function GetDTextCount(DText, delimeter: PChar): Integer;
var
 subpos: PChar;
 i, len: Integer;
begin
 result := 0;
 len := Length(delimeter);
 if (len = 0) or (DText = ) then Exit;
 subpos := DText;
 i := Pos(delimeter, subpos);
 while i <> 0 do
 begin
 Inc(Result);
 subpos := Pointer(Integer(subpos) + i + len - 1);
 i := Pos(delimeter, subpos);
 end;
 if (Byte(subpos^)) <> 0 then Inc(Result);
end;
function GetParamsCount(const SourceStr, Delimiter: string): Integer;
begin
 Result := GetDTextCount(PChar(SourceStr), PChar(Delimiter));
end;
function GetParamFromString(const SourceStr, Delimiter: string; Ind: Integer): string;
var
 TmpS, TmpRes: PChar;
 LRes: Integer;
begin
 GetMem(Tmps, Length(SourceStr)+1);
 try
 CopyMemory(Tmps, PChar(SourceStr), Length(SourceStr));
 Byte(Pointer(Integer(Tmps) + Length(SourceStr))^) := 0;
 TmpRes := GetDTextItem(TmpS, PChar(Delimiter), Ind);
 LRes := Length(TmpRes);
 SetLength(Result, LRes);
 CopyMemory(@Result[1], TmpRes, LRes);
 finally
 FreeMem(TmpS);
 end;
end;
end. 
Пример использования:
ShowMessage(GetParamFromString('1;2a;3;4', ';',2));
ShowMessage(IntToStr(GetParamsCount('1;2;3;4', ';'))); 
Source: kladovka.net.ru
ID: 00172
Получение пользователя и домена под которым работает текущий процесс

=== Получение пользователя и домена под которым работает текущий процесс ===
// Пример получения имени пользователя и домена под которым работает
// текущий поток или процесс
type
 PTOKEN_USER = ^TOKEN_USER;
 _TOKEN_USER = record
 User : TSidAndAttributes;
 end;
 TOKEN_USER = _TOKEN_USER;
function GetCurrentUserAndDomain(szUser: PChar; var chUser: DWORD; szDomain: PChar; var chDomain: DWORD): Boolean;
var
 hToken: THandle;
 cbBuf: Cardinal;
 ptiUser: PTOKEN_USER;
 snu: SID_NAME_USE;
begin
 Result := False;
 // Получаем маркер доступа текущего потока нашего процесса
 if not OpenThreadToken(GetCurrentThread(), TOKEN_QUERY, True, hToken) then
 begin
 if GetLastError()< > ERROR_NO_TOKEN then exit;
 // В случее ошибки - получаем маркер доступа нашего процесса.
 if not OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, hToken) then exit;
 end;
 // Вывываем GetTokenInformation для получения размера буфера
 if not GetTokenInformation(hToken, TokenUser, nil, 0, cbBuf) then
 if GetLastError() <> ERROR_INSUFFICIENT_BUFFER then
 begin
 CloseHandle(hToken);
 exit;
 end;
 if cbBuf = 0 then exit;
 // Выделяем память под буфер
 GetMem(ptiUser, cbBuf);
 // В случае удачного вызова получим указатель на TOKEN_USER
 if GetTokenInformation(hToken, TokenUser, ptiUser, cbBuf, cbBuf) then
 begin
 // Ищем имя пользователя и его домен по его SID
 if LookupAccountSid(nil, ptiUser.User.Sid, szUser, chUser, szDomain, chDomain, snu) then
 Result := True;
 end;
 // Освобождаем ресурсы
 CloseHandle(hToken);
 FreeMem(ptiUser);
end;
// Использовать функцию можно так:
var
 Domain, User: array [0..50] of Char;
 chDomain,chUser: Cardinal;
begin
 chDomain := 50;
 chUser := 50;
 if GetCurrentUserAndDomain(User, chuser, Domain, chDomain) then
 //...
end;
// Если вам необходимо получить только имя пользователя - используйте GetUserName
// Данный пример можно использовать и для определения - запущен ли процесс
// системой или пользователем. Учетной записи Localsystem соответствует
// имя пользователя - SYSTEM и домен NT AUTORITY (лучше проверить на практике)
Source: http://delphiworld.narod.ru/
ID: 01734
Получение размера памяти выделенный под Pointer

=== Получение размера памяти выделенный под Pointer ===
{ **** UBPFD *********** by delphibase.endimus.com ****
>> Получение размера памяти выделенный под Pointer
Функция возврящает количество байт выделенных под Pointer.
Размер округляется в большую сторону до DWORD (4 байт).
Зависимости: Windows
Автор: Мироводин Дмитрий, mirovodin@mail.ru
Copyright: Мироводин Дмитрий
Дата: 16 октября 2003 г.
***************************************************** }
function GetPointerSize(const P: Pointer): Integer;
begin
 if P = nil then
 Result := -1
 else
 Result := Integer(Pointer((Integer(p) - 4))^) and $7FFFFFFC - 4;
end;
// Пример использования: 
var
 P: pointer;
 PSize: integer;
begin
 GetMem(P, 1024); // Размер кратен 4
 PSize := GetPointerSize(P);
 ShowMessage(inttostr(PSize)); // Результат 1024 байта
 FreeMem(P);
end;
// ...
var
 P: pointer;
 PSize: integer;
begin
 // Размер НЕ КРАТЕН 4
 GetMem(P, 6);
 PSize := GetPointerSize(P);
 // Результат 8 байта т.к. идет округление
 ShowMessage(inttostr(PSize));
 FreeMem(P);
end;
Source: http://delphibase.endimus.com
ID: 00826
Получение списка DLL загруженных приложением

=== Получение списка DLL загруженных приложением ===
Иногда бывает полезно знать какими DLL-ками пользуется Ваше приложение. Давайте посмотрим как это можно сделать в Win NT/2000.
Пример функции
unit ModuleProcs; 
interface 
uses Windows, Classes; 
type 
 TModuleArray = array[0..400] of HMODULE; 
 TModuleOption = (moRemovePath, moIncludeHandle); 
 TModuleOptions = set of TModuleOption; 
function GetLoadedDLLList(sl: TStrings; Options: TModuleOptions = [moRemovePath]): Boolean; 
implementation 
uses SysUtils; 
function GetLoadedDLLList(sl: TStrings; Options: TModuleOptions = [moRemovePath]): Boolean; 
type 
 EnumModType = function (hProcess: Longint; lphModule: TModuleArray; 
 cb: DWord; var lpcbNeeded: Longint): Boolean; stdcall; 
var 
 psapilib: HModule; 
 EnumProc: Pointer; 
 ma: TModuleArray; 
 I: Longint; 
 FileName: array[0..MAX_PATH] of Char; 
 S: string; 
begin 
 Result := False; 
 (* Данная функция запускается только для Widnows NT *) 
 if Win32Platform <> VER_PLATFORM_WIN32_NT then 
 Exit; 
 psapilib := LoadLibrary('psapi.dll'); 
 if psapilib = 0 then 
 Exit; 
 try 
 EnumProc := GetProcAddress(psapilib, 'EnumProcessModules'); 
 if not Assigned(EnumProc) then 
 Exit; 
 sl.Clear; 
 FillChar(ma, SizeOF(TModuleArray), 0); 
 if EnumModType(EnumProc)(GetCurrentProcess, ma, 400, I) then 
 begin 
 for I := 0 to 400 do 
 if ma[i] <> 0 then 
 begin 
 FillChar(FileName, MAX_PATH, 0); 
 GetModuleFileName(ma[i], FileName, MAX_PATH); 
 if CompareText(ExtractFileExt(FileName), '.dll') = 0 then 
 begin 
 S := FileName; 
 if moRemovePath in Options then 
 S := ExtractFileName(S); 
 if moIncludeHandle in Options then 
 sl.AddObject(S, TObject(ma[I])) 
 else 
 sl.Add(S); 
 end; 
 end; 
 end; 
 Result := True; 
 finally 
 FreeLibrary(psapilib); 
 end; 
end; 
end. 
Для вызова приведённой функции надо сделать следующее: 
* Добавить listbox на форму (Listbox1) 
* Добавить кнопку на форму (Button1) 
Обработчик события OnClick для кнопки будет выглядеть следующим образом
procedure TForm1.Button1Click(Sender: TObject); 
begin 
 GetLoadedDLLList(ListBox1.Items, [moIncludeHandle, moRemovePath]); 
end; 
Source: Взято из http://forum.sources.ru
ID: 01984
Получение ссылки на экземпляр класса

=== Получение ссылки на экземпляр класса ===
...мне также понадобилось в подпрограмме получить ссылку на дочернее MDI-окно без сообщения подпрограмме с каким конкретно классом MDI необходимо работать. Что я сделал: я передавал в виде параметров тип дочернего MDI-окна и ссылку как нетипизированную переменную и затем обрабатывал это в подпрограмме.
Вот пример. Эта подпрограмма работает с дочерним окном, которое может иметь только один экземпляр. Если оно не открыто, подпрограмма создаст его, если оно открыто, оно переместит его на передний план.
procedure FormLoader(FormClassType: TFormClass; var FormName);
begin
 if TForm(FormName) = nil then
 begin
 Application.CreateForm(FormClassType, FormName);
 end
 else
 begin
 TForm(FormName).BringToFront;
 TForm(FormName).WindowState := wsNormal;
 end;
end;
// Вот как это вызывать:
procedure TfrmTest.sbOpenClick(Sender: TObject);
begin
 FormLoader(TfrmTest, frmTest);
end;
Сборник Kuliba
Source: Взято из Советов по Delphi от Валентина Озерова
ID: 00257
Получение текста из буфера обмена без использования модуля Clipbrd

=== Получение текста из буфера обмена без использования модуля Clipbrd ===
{ **** UBPFD *********** by kladovka.net.ru ****
>> Получение текста из буфера обмена без использования модуля Clipbrd
Wnd - Handle окна, получающего доступ к буферу обмена;
Str - строка, в которую будет скопирован текст;
Зависимости: Windows
Copyright: Dimka Maslov
Дата: 22 августа 2002 г.
********************************************** }
function GetClipboardText(Wnd: HWND; var Str: string): Boolean;
var
 hData: HGlobal;
begin
 Result := True;
 if OpenClipboard(Wnd) then
 begin
 try
 hData := GetClipboardData(CF_TEXT);
 if hData <> 0 then
 begin
 try
 SetString(Str, PChar(GlobalLock(hData)), GlobalSize(hData));
 finally
 GlobalUnlock(hData);
 end;
 end
 else
 Result := False;
 Str:=PChar(@Str[1]);
 finally
 CloseClipboard;
 end;
 end
 else
 Result := False;
end; 
Пример использования:
function TForm1.Button2Click(Sender: TObject)
var
 Str: string;
begin 
 GetClipboardText(Handle, Str);
 ShowMessage(Str);
end; 
ID: 01906
Получение текущего чертежа из AutoCAD в формате DXF

{ **** UBPFD *********** by kladovka.net.ru ****
>> Получение текущего чертежа из AutoCAD в формате DXF
Функция импортирует активного чертёж из AutoCAD в формате DXF и записывает полученные данные в список List. В случае успешного завершения функция возвращает True. В случае ошибки (AutoCAD не загружен, cбой OLE и проч.) функция возвращает False не внося изменений в список строк
Зависимости: Windows, SysUtils, ComObj, ActiveX
Dimka Maslov, mainbox@endimus.ru, ICQ:148442121, Санкт-Петербург
Copyright: Dimka Maslov
Дата: 22 ноября 2002 г.
********************************************** }
function GetAcadDXFText(List: TStrings): Boolean;
var
 TempDir, FileName: string;
 ClassID: TGUID;
 Unknown: IUnknown;
 Dispatch: IDispatch;
 App, Doc, Sel: Variant;
 TempList: TStringList;
const
 Ext = 'dxf';
 DotExt = '.'+Ext;
begin
 SetLength(TempDir, MAX_PATH);
 GetTempPath(MAX_PATH, PChar(TempDir));
 SetLength(TempDir, StrLen(@TempDir[1]));
 TempDir := IncludeTrailingBackslash(TempDir);
 repeat
 FileName := TempDir+IntToHex(LoWord(GetTickCount), 4) + DotExt;
 until not FileExists(FileName);
 SetLength(FileName, Length(FileName) - Length(DotExt));
 Result := True;
 try
 ClassID := ProgIDToClassID('AutoCAD.Application');
 if not Succeeded(GetActiveObject(ClassID, nil, Unknown)) then Abort;
 Unknown.QueryInterface(IDispatch, Dispatch);
 App := Dispatch;
 try
 Doc := App.ActiveDocument;
 try
 Sel := Doc.SelectionSets.Add('TEMP');
 try
 Doc.Export(FileName, Ext, Sel);
 finally
 Sel := Unassigned;
 end;
 finally
 Doc := Unassigned;
 end;
 finally
 App := Unassigned;
 end;
 FileName := FileName+DotExt;
 TempList := TStringList.Create;
 try
 TempList.LoadFromFile(FileName);
 List.Assign(TempList);
 finally
 TempList.Free;
 end;
 except
 Result := False;
 end;
 if FileExists(FileName) then DeleteFile(FileName);
end;
Пример использования:
if not GetAcadDXFText(Memo1.Lines) then
 ShowMessage('Невозможно получить данные от AutoCAD');
Author: Dimka Maslov
ID: 04479
Получение типа клавиатуры

=== Получение типа клавиатуры ===
function GettingKeybType: string; // Win95 or later and NT3.1 or later
var
 Flag: Integer;
begin
 Flag := 0;
 case GetKeyboardType(Flag) of
 1: Result := 'IBM PC/XT or compatible (83-key) keyboard';
 2: Result := 'Olivetti "ICO" (102-key) keyboard';
 3: Result := 'IBM PC/AT (84-key) or similar keyboard';
 4: Result := 'IBM enhanced (101- or 102-key) keyboard';
 5: Result := 'Nokia 1050 and similar keyboards';
 6: Result := 'Nokia 9140 and similar keyboards';
 7: Result := 'Japanese keyboard';
 end;
end;
ID: 01520
----
// The GetKeyboardType function retrieves information about the current keyboard. 
function KeyBoardType: string;
begin
 case GetKeyboardType(0) of
 1: Result := 'IBM PC/XT or compatible (83-key) keyboard';
 2: Result := 'Olivetti "ICO" (102-key) keyboard';
 3: Result := 'IBM PC/AT (84-key) or similar keyboard';
 4: Result := 'IBM enhanced or compatible';
 5: Result := 'Nokia 1050 and similar keyboards';
 6: Result := 'Nokia 9140 and similar keyboards';
 7: Result := 'Japanese keyboard'
 else
 Result := 'Unrecognized keyboard type';
 end;
end;
function KeyBoardSubype: Integer;
begin
 Result := GetKeyboardType(1);
end;
function NumberOfFunctionKeys: string;
begin
 case GetKeyboardType(3) of
 1: Result := '20';
 2: Result := '12/18';
 3: Result := '10';
 4: Result := '12';
 5: Result := '10';
 6: Result := '24';
 7: Result := 'Hardware dependent'
 else
 Result := 'N/A';
 end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
 label1.Caption := Format('Keyboard Type: %s', [KeyBoardType]);
 Label2.Caption := Format('Keyboard Subtype: %d', [KeyBoardSubype]);
 Label3.Caption := Format('Keyboard Subtype: %s', [NumberOfFunctionKeys]);
end;
Source: Взято с сайта: http://www.swissdelphicenter.ch
ID: 01521
Получение узла в TTreeView по пути заголовков

=== Получение узла в TTreeView по пути заголовков ===
{ **** UBPFD *********** by delphibase.endimus.com ****
>> Получение узла в TreeView по пути заголовков
Функция выдает узел TTreeNode из дерева TreeView, находящийся по пути,
указанному в Path, в котором разделителем уровней является символ Separator.
Если узел не найден - выдается nil.
Ограничение - заголовки узлов дерева не должны содержать символа Separator.
Зависимости: ComCtrls, Classes, SysUtils
Copyright: Собственное написание (lipskiy)
Дата: 26 июня 2002 г.
***************************************************** }
function GetNodeInPath(Path: string; Separator: char; TreeView: TTreeView): TTreeNode;
var
 List: TStringList;
 Node: TTreeNode;
 i: integer;
 s: string;
begin
 Result := nil;
 if (TreeView = nil) or (TreeView.Items.Count = 0) or (Path = ) or (Separator = ) then
 exit;
 List := TStringList.Create;
 // Меняем сепаратор на первод строки
 s := StringReplace(Path, Separator, #13#10, [rfReplaceAll]);
 // Получаем список уровней
 List.Text := s;
 // Начинаем с нулевой ноды дерева
 Node := TreeView.Items[0];
 // Проходим по всему списку уровней пути
 for i := 0 to List.Count - 1 do
 begin
 // Ищем имя ноды на текущем уровне
 while (Node <> nil) and (Node.Text <> List[i]) do
 Node := Node.getNextSibling;
 // Нода не найдена
 if Node = nil then
 break;
 // Переходим на уровень ниже
 if i < List.Count - 1 then
 Node := Node.getFirstChild;
 end;
 List.Free;
 Result := Node;
end;
// Пример использования:
procedure TForm1.Button1Click(Sender: TObject);
begin
 TreeView1.Selected := GetNodeInPath('Каталог\Подкаталог', '\', TreeView1);
end;
Source: http://delphibase.endimus.com
ID: 01120
Получение уровня процессора

=== Получение уровня процессора ===
function GettingProcLevel: string; // Win95 or later and NT3.1 or later
var
 Struc: _SYSTEM_INFO;
begin
 GetSystemInfo(Struc);
 case Struc.wProcessorLevel of
 3: Result := 'Intel 80386';
 4: Result := 'Intel 80486';
 5: Result := 'Intel Pentium';
 6: Result := 'Intel Pentium II or better';
 end;
end;
ID: 01434
Получение файла из сети

Перевод одноимённой статьи с сайта delphi.about.com )
Обычно при разработке приложений, которые планируется в дальнейшем обновлять и усовершенствовать, основные модули хранятся в виде пакетов (Package) или библиотек DLL. В настоящее время Internet предоставляет возможность без особых усилий осуществлять обновление этих модулей. Поэтому добавление к Вашему приложению функции авто-обновления, является наилучшим способом для обновления приложения.
Давайте посмотрим, как реализовывается данный механизм в любом FTP приложении.
Delphi предоставляет нам полный доступ к WinInet API (wininet.pas), который можно использовать для соединения и получения файлов с веб-сайта, который использует либо Hypertext Transfer Protocol (HTTP) либо File Transfer Protocol (FTP). Например, мы можем использовать функции из WinInet API для: добавления FTP браузера в любое приложение, создания приложения, которое автоматически скачивает файлы с общедоступных FTP серверов или поиска Internet сайтов, ссылающихся на графику и скачивать только графику.
Функция GetInetFile
uses Wininet;
function GetInetFile(const fileURL, FileName: String): boolean;
const
 BufferSize = 1024;
var
 hSession, hURL: HInternet;
 Buffer: array[1..BufferSize] of Byte;
 BufferLen: DWORD;
 f: File;
 sAppName: string;
begin
 Result := False;
 sAppName := ExtractFileName(Application.ExeName);
 hSession := InternetOpen(PChar(sAppName),
 INTERNET_OPEN_TYPE_PRECONFIG,
 nil, nil, 0);
 try
 hURL := InternetOpenURL(hSession,
 PChar(fileURL),
 nil, 0, 0, 0);
 try
 AssignFile(f, FileName);
 Rewrite(f,1);
 repeat
 InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen);
 BlockWrite(f, Buffer, BufferLen);
 until BufferLen = 0;
 CloseFile(f);
 Result := True;
 finally
 InternetCloseHandle(hURL);
 end;
 finally
 InternetCloseHandle(hSession);
 end;
end;
Обратите внимание: Чтобы обеспечить некоторую визуальную обратную связь для пользователя, Вы можете добавить строчку наподобие FlashWindow(Application.Handle, True) в тело блока "повторить/до тех пор" (repeat/until). Вызов FlashWindow API высвечивает заголовок Вашего имени приложений в панели задач.
== Использование ==
Для вызова функции GetInetFile можно использовать следующий код:
var
 FileOnNet, LocalFileName: string
begin
 FileOnNet := 'http://delphi.about.com/library/forminbpl.zip';
 LocalFileName := 'File Downloaded From the Net.zip'
 if GetInetFile(FileOnNet, LocalFileName) then
 ShowMessage('Download successful')
 else
 ShowMessage('Error in file download')
end;
Данный код запрашивает файл 'forminbpl.zip' с сайта, скачивает его, и сохраняет его как 'File Downloaded From the Net.zip'.
Обратите внимание: В зависимости от версии Delphi, Вы можете использовать различные компоненты, которые можно найти на Интернет страницах, посвящённых VCL и, которые можно использовать для упрощения создания приложений (например FTP компонент, необходимый для TNMFTP, находящийся на странице FastNet VCL).
Source: Взято из http://forum.sources.ru
ID: 03295
Category:Связь
Получение целого числа часов от начала суток

=== Получение целого числа часов от начала суток ===
{ **** UBPFD *********** by delphibase.endimus.com ****
>> Получение целого числа часов от начала суток
Возвращает целое число часов от начала суток.
Пример: для "11:25:00" будет возвращено значение "11"
Зависимости: System, SysUtils
Автор: savva, savva@nm.ru, ICQ:126578975, Орел
Copyright: Сапронов Алексей (Savva)
Дата: 6 июня 2002 г.
***************************************************** }
function GetСurrentHour: integer;
begin
 result := Round(Time * 24);
end;
Source: http://delphibase.endimus.com
ID: 00768