nyuuzyou/wikis huggingface dataset:
Функция для быстрого копирования таблиц вместе со всеми дополнительными файлами

=== Функция для быстрого копирования таблиц вместе со всеми дополнительными файлами ===
// Только для не SQL-ых, т.е не промышленных БД (dBase, Paradox ..)
// Путь нужно задавать только АНГЛИЙСКИМИ буквами
procedure QuickCopyTable(T: TTable; DestTblName: string; Overwrite: boolean);
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://delphiworld.narod.ru
ID: 02546
Функция для работы с палитрами и RGB

У меня трудности с пониманием операций, производимых в Delphi над палитрой. По существу, я имею 4 открытых формы, которые должны использовать цвета, которые не входят в стандартный набор из 20 именованных цветов. Ячейки таблицы также должны использовать мои нестандартные цвета. Есть какой-либо способ обновления системной палитры для того, чтобы все формы использовали один и тот же цвет?
При работе с палитрами рекомендуется пользоваться функцией RGB. Если вы используете ее для изменения свойства "Color", Windows довольно хорошо справляется с задачей подбора цветов для низкого разрешения, а в системах с высоким разрешением вы получите точный цвет RGB. Это могло бы послужить выходом из создавшейся у вас ситуации. Вот пример формы, которая "линяет" от красного до синего:
procedure TForm1.FormClick(Sender: TObject);
var
 blue: Byte;
begin
 for blue := 0 to 255 do
 begin
 Color := RGB(255 - blue, 0, blue);
 Update;
 end;
end;
Source: http://delphiworld.narod.ru
ID: 03707
Category:Графика
Category:Цвета и палитры
Функция для разворачивания строк

=== Функция для разворачивания строк ===
{ **** UBPFD *********** by delphibase.endimus.com ****
>> Функция для "разворачивания" строк
Входные параметры:
Input - входная строка, которую необходимо представить в "развернутом виде"
на входе: 1,3,5-10,15
на выходе: 1,3,5,6,7,8,9,10,15 
Зависимости: стандартный набор включаемых модулей
Автор: Ru, DiVo_Ru@rambler.ru, Одесса
Copyright: DiVo 2002, creator Ru
Дата: 12 ноября 2002 г.
***************************************************** }
function DecStr(Input: string): string;
var
 i, j, t: integer;
 s: string;
begin
 if Pos('-', Input) <> 0 then
 begin
 while Length(Input) <> 0 do
 begin
 if Input[1] = ',' then
 begin
 i := StrToInt(s);
 Delete(Input, 1, 1);
 Result := Result + s + ',';
 s := ;
 end
 else
 begin
 if Input[1] = '-' then
 begin
 i := StrToInt(s);
 Delete(Input, 1, 1);
 t := Pos(',', Input);
 Result := Result + s + ',';
 s := ;
 if t = 0 then
 begin
 j := StrToInt(Input);
 Input := ;
 end
 else
 begin
 j := StrToInt(Copy(Input, 1, t - 1));
 Delete(Input, 1, t);
 end;
 Inc(i);
 while i < j + 1 do
 begin
 Result := Result + IntToStr(i) + ',';
 Inc(i);
 end;
 end
 else
 begin
 s := s + Input[1];
 Delete(Input, 1, 1);
 end;
 end;
 end;
 end
 else
 Result := Input;
 if s <> then
 Result := Result + s;
end;
Source: http://delphibase.endimus.com
ID: 00893
Функция для удаления из строки лишних символов

=== Функция для удаления из строки лишних символов ===
{ **** UBPFD *********** by delphibase.endimus.com ****
>> Функция для удаления из строки "лишних" символов.
Функция для удаления из строки "лишних" символов.
Входные параметры:
Input - входная строка, которую необходимо очистить от лишних символов
EArray - строка, содержащая набор разрешенных или запрещеных символов
в зависимости от Action
Action - указывает на то, что из себя представляет массив EArray.
Action может принимать следующие значения:
1 - массив EArray представляет собой строку разрешенных символов
2 - EArray - массив запрещенных символов.
Зависимости: делал в Д5, 6 под Win9x
Автор: Ru, DiVo_Ru@rambler.ru, Одесса
Copyright: DiVo 2002, creator Ru
Дата: 11 ноября 2002 г.
***************************************************** }
function strtst(var Input: string; EArray: string; Action: integer): string;
begin
 case Action of
 1:
 begin
 while Length(Input) <> 0 do
 begin
 if Pos(Input[1], EArray) = 0 then
 Delete(Input, 1, 1)
 else
 begin
 Result := Result + Input[1];
 Delete(Input, 1, 1);
 end;
 end;
 end;
 2:
 begin
 while Length(Input) <> 0 do
 begin
 if Pos(Input[1], EArray) <> 0 then
 Delete(Input, 1, 1)
 else
 begin
 Result := Result + Input[1];
 Delete(Input, 1, 1);
 end;
 end;
 end;
 else
 MessageBox(0, 'Не корректный вызов функции.', , MB_OK);
 end;
end;
// Пример использования: 
// 1.
s := Edit1.Text;
s := strtst(s, '0123456789.', 1);
Edit1.Text := s;
// например на входе: 0.16+
// на выходе будет: 0.16
// 2.
s := Edit1.Text;
s := strtst(s, '/*-+,', 2);
Edit1.Text := s;
// на входе: 0.16+
// на выходе будет: 0.16
Source: http://delphibase.endimus.com
ID: 00895
Функция замены в строке всех вхождений одной подстроки на другую

=== Функция замены в строке всех вхождений одной подстроки на другую ===
{ **** UBPFD *********** by delphibase.endimus.com ****
>> Функция замены в строке всех вхождений одной подстроки на другую
В отличие от других подобных функций, эта - не зависнет, если в строке нужно 
заменить не только одно слово совершенно другим,
но и допустим, слово "Штаны" на "-Штаны-"
(Т.е. начальное слово после замены остается, но к нему добавляется какой нибудь 
символ справа, или слева. В данном случае по краям слова добавлен знак минуса).
Я пересмотрел много примеров, и ни один из них не справился с этой задачей.
(Может я плохо искал?).
Зависимости: Windows, SysUtils
Автор: Матюшкин Сергей, seregam@ua.fm, ICQ:162733776, Днепропетровск
Copyright: Sergey_M
Дата: 26 мая 2003 г.
***************************************************** }
function Replace(Str, X, Y: string): string;
{Str - строка, в которой будет производиться замена.
 X - подстрока, которая должна быть заменена.
 Y - подстрока, на которую будет произведена заменена}
var
 buf1, buf2, buffer: string;
 i: Integer;
begin
 buf1 := ;
 buf2 := Str;
 Buffer := Str;
 while Pos(X, buf2) > 0 do
 begin
 buf2 := Copy(buf2, Pos(X, buf2), (Length(buf2) - Pos(X, buf2)) + 1);
 buf1 := Copy(Buffer, 1, Length(Buffer) - Length(buf2)) + Y;
 Delete(buf2, Pos(X, buf2), Length(X));
 Buffer := buf1 + buf2;
 end;
 Replace := Buffer;
end;
Пример использования: 
procedure TForm1.Button1Click(Sender: TObject);
var
 a: Integer;
begin
 for a := 0 to Memo1.Lines.Count do
 Memo1.Lines[a] := Replace(Memo1.Lines[a], 'Штаны', '-Штаны-');
end;
Source: http://delphibase.endimus.com
ID: 00896
----
Всё значительно проще! В Борланд уже всё сделали до нас:
// заменить первое вхождение подстроки с учётом регистра
S := StringReplace(ИсходнаяСтрока, ЧтоЗаменять, НаЧтоЗаменять, []) 
// заменить все вхождения подстроки с учётом регистра
S := StringReplace(ИсходнаяСтрока, ЧтоЗаменять, НаЧтоЗаменять, [rfReplaceAll]) 
// заменить первое вхождение подстроки без учёта регистра
S := StringReplace(ИсходнаяСтрока, ЧтоЗаменять, НаЧтоЗаменять, [rfIgnoreCase]) 
// заменить все вхождения подстроки без учёта регистра
S := StringReplace(ИсходнаяСтрока, ЧтоЗаменять, НаЧтоЗаменять, [rfReplaceAll, rfIgnoreCase]) 
Author: Vit (www.delphist.com, www.drkb.ru, www.unihighlighter.com, www.nevzorov.org)
ID: 00897
Функция конвертации текста HTML содержащего строки вида

function PreDecode(s: string): string;
 function AddNumericChar(I: Integer): string;
 var
 W: WideChar;
 Buffer: array[0..10] of char;
 begin
 if I = 9 then
 Result := ' '
 else if I < ord(' ') then
 Result := '?' { control char }
 else if (I < 256) then
 Result := Chr(I)
 else
 begin
 W := WideChar(I);
 SetString(Result, Buffer, WideCharToMultiByte(CP_ACP, 0,
 @W, 1, @Buffer, SizeOf(Buffer), nil, nil))
 end;
 end;
var
 val, i, ik: integer;
 sq: string;
begin
 for i := 1 to Length(s) do
 begin
 if ( (s[i]='&') and (s[i+1] ='#') ) then
 begin
 sq := Copy(s, i+2, Length(s));
 for ik := 1 to Length(sq) do
 begin
 if not (sq[ik] in ['0'..'9']) then
 break;
 end;
 if Copy(sq, 1, ik-1) <> then
 val := StrToInt(Copy(sq, 1, ik-1))
 else
 val := -1;
 if ((val <> -1) and (sq[ik] = ';')) then
 begin
 Result := Result + AddNumericChar(val);
 Delete(s, i, ik+1);
 end;
 end
 else
 Result := Result + s[i];
 end;
end;
Author: RAdmin
Source: Vingrad.ru http://forum.vingrad.ru
ID: 03543
Category:Связь
Category:Web
Функция набора номера модемом

=== Функция набора номера модемом ===
var
 hCommFile: THandle;
procedure TForm1.Button1Click(Sender: TObject);
var
 PhoneNumber: string;
 CommPort: string;
 NumberWritten: LongInt;
begin
 PhoneNumber := 'ATDT 1-555-555-1212' + #13 + #10;
 CommPort := 'COM2';
 { Open the comm port }
 hCommFile := CreateFile(PChar(CommPort), GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
 if hCommFile = INVALID_HANDLE_VALUE then
 begin
 ShowMessage('Unable to open '+ CommPort);
 exit;
 end;
 NumberWritten := 0;
 if WriteFile(hCommFile, PChar(PhoneNumber)^, Length(PhoneNumber), NumberWritten, nil) = False then 
 begin
 ShowMessage('Unable to write to ' + CommPort);
 end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
 { Close the port }
 CloseHandle(hCommFile);
end;
Source: Взято с сайта http://blackman.wp-club.net/
ID: 01464
Функция наполнения строки

=== Функция наполнения строки ===
function Spcs(num: Byte) : string;
var
 tmp: string;
begin
 FillChar(tmp, num+1, ' '); { инициализация всей строки пробелами }
 tmp[0] := Chr(num); { устанавливаем длину строки с пробелами }
 Result := tmp;
end;
// Теперь достаточно написать 
Edit1.Text := SurName + Spcs(10) + FirstName
Source: http://delphiworld.narod.ru
ID: 00898
----
Решением является создание функции, функционально похожей на функцию Clipper:
PadL(string, width, character)
function TfrmFunc.PadL(cVal: string; nWide: integer; cChr: char): string;
var
 i1, nStart: integer;
begin
 if Length(cVal) < nWide then
 begin
 nStart := Length(cVal);
 for i1 := nStart to nWide-1 do
 cVal := cChar + cVal;
 end;
 PadL := cVal;
end;
Затем это может вызываться c любой строкой, которой вы хотите задать определенную длину. Пользуйтесь функцией также, как вы привыкли пользоваться прежней - PadL(A,length(B),'0'); Она имеет большую гибкость - возможно заполнение любым символом до необходимой длины (удобно для задания текстовых счетчиков с фиксированным количеством символов -- PadL(A,6,'0'). 
Source: http://delphiworld.narod.ru
ID: 00932
----
function LeftPad(S: string; Ch: Char; Len: Integer): string;
var
 RestLen: Integer;
begin
 Result := S;
 RestLen := Len - Length(s);
 if RestLen < 1 then Exit;
 Result := S + StringOfChar(Ch, RestLen);
end;
function RightPad(S: string; Ch: Char; Len: Integer): string;
var
 RestLen: Integer;
begin
 Result := S;
 RestLen := Len - Length(s);
 if RestLen < 1 then Exit;
 Result := StringOfChar(Ch, RestLen) + S;
end;
{Beispiel / Example}
procedure TForm1.Button1Click(Sender: TObject);
begin
 Edit1.Text := Rightpad(Edit2.Text, '-', 30);
end;
Source: Взято с сайта: http://www.swissdelphicenter.ch
ID: 00933
Функция передачи строк (а заодно и числа) между программами через SendMessage:

=== Функция передачи строк (а заодно и числа) между программами через SendMessage: ===
function SendString(TargetWnd, SourceWnd: THandle; N: Integer; const S: string): Integer;
var
 CD: TCopyDataStruct;
begin
 CD.dwData := N;
 CD.cbData := Length(S);
 if CD.cbData = 0 then
 CD.lpData := nil
 else
 CD.lpData := @S[1];
 Result := SendMessage(TargetWnd, WM_COPYDATA, SourceWnd, Integer(@CD));
end;
procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA;
procedure TForm1.WMCopyData(var Msg: TWMCopyData);
var
 { Строка }
 S: String;
 { Число }
 N: Integer;
begin
 if (Msg.CopyDataStruct^).lpData = NIL Then S := ;
 SetLength(S, Msg.CopyDataStruct^.cbData);
 S := string((Msg.CopyDataStruct^).lpData);
 N := (Msg.CopyDataStruct^).dwData;
end;
Author: Rrader
Source: Взято с Vingrad.ru http://forum.vingrad.ru
ID: 02136
Функция проверки корректности ввода

=== Функция проверки корректности ввода ===
{ **** UBPFD *********** by delphibase.endimus.com ****
>> Функция проверки корректности ввода
Результат истина в случае если во входной строке нет недопустимых
символов
Rej - флаг режима
если Rej := true, то Conf - строка недопустимых символов
если Rej := false, то Conf - строка допустимых символов
Input - входная строка
Зависимости: Стандартные модули
Автор: Ru, DiVo_Ru@rambler.ru, Одесса
Copyright: DiVo 2002, creator Ru
Дата: 28 декабря 2002 г.
***************************************************** }
function ConformStr(Input, Conf: string; Rej: boolean): boolean;
var
 i: integer;
begin
 Result := true;
 if Rej then
 begin
 for i := 1 to Length(Conf) do
 begin
 if Pos(Conf[i], Input) <> 0 then
 begin
 Result := False;
 Break;
 end
 end;
 end
 else
 begin
 for i := 1 to Length(Input) do
 begin
 if Pos(Input[i], Conf) = 0 then
 begin
 Result := False;
 Break;
 end;
 end;
 end;
end;
// Пример использования: 
s := 'Приве6т!';
if not ConformStr(s, '0123456789') then
 s := Strtst(s, '0123456789');
// после этого s='Привет!'
Source: http://delphibase.endimus.com
ID: 00924
Ханойская башня

"Ханойская башня" построена на очень простом алгоритме. Здесь я привожу этот алгоритм, который Вы сможете без труда воспроизвести.
type
 THanoiPin = 0..2;
 THanoiLevel = 0..9;
procedure MoveDisc(FromPin, ToPin: THanoiPin; Level: THanoiLevel);
// Это Вы должны сделать сами. Переместите один диск с одного штырька на другой.
// Диск окажется наверху (естественно, выше него дисков не будет)
Вы можете каким угодно образом перемещать диски 3-х пирамид. 3 пирамиды - наиболее простая разновидность алгоритма. Таким образом процедура переноса диска (MoveDisc) аналогична операции переноса диска на верхний уровень (MoveTopDisc): переместить диск наверх с одного штырька (FromPin) на другой штырек (ToPin) и передать указатель на штырек-приемник (MoveTower) вместе с уровнем расположения перемещенного диска. Другое решение заключается в использовании трех массивов [THanoiLevel] логического типа. В этом случае триггер "Истина (True)" означает наличие на пирамиде диска с размером, соответствующим порядковому номеру элемента массива THanoiLevel.
procedure MoveTower(FromPin, ToPin: THanoiPin; Level: THanoiLevel);
begin
 if HanoiLevel <= High(THanoiLevel) then
 begin
 MoveTower(FromPin, 3 - FromPin - ToPin, Level + 1);
 MoveDisc(FromPin, ToPin, Level);
 MoveTower(3 - FromPin - ToPin, ToPin, Level + 1);
 end;
end;
Чтобы переместить пирамиду целиком, вы должны вызвать процедуру MoveTower следующим образом:
MoveTower(0, 1, Low(THanoiLevel));
Source: http://delphiworld.narod.ru
ID: 04643
Category:Развлечения
Хелп с окошечком для поиска раздела.

procedure TForm1.HelpSearchFor;
var
 S : String;
begin
 S := ;
 Application.HelpFile := 'C:\MYAPPPATH\MYHELP.HLP';
 Application.HelpCommand(HELP_PARTIALKEY, LongInt(@S));
end;
Author: Konstantin Kipa (2:5061/19.17) kotya@extranet.ru
ID: 04551
Category:Разработка приложений
Category:Справочная система
Хинт любой формы

=== Хинт любой формы ===
Borland Delphi 4, Руководство разработчика", К. Пачеко и С. Тейксер
З.Ы. Пристегните (uses CoolHint) к любой форме с hint'ами и любуйтесь подсказками. 
unit CoolHint;
interface
uses
 Windows, Classes, Controls, Forms, Messages, Graphics;
type
 TddgHintWindow = class(THintWindow)
 private
 FRegion: THandle;
 procedure FreeCurrentRegion;
 public
 destructor Destroy; override;
 procedure ActivateHint(Rect: TRect; const AHint: string); override;
 procedure Paint; override;
 procedure CreateParams(var Params: TCreateParams); override;
end;
implementation
destructor TddgHintWindow.Destroy;
begin
 FreeCurrentRegion;
 inherited;
 Destroy;
end;
procedure TddgHintWindow.CreateParams(var Params: TCreateParams);
{ We need to remove the border created on the Windows API-level }
{ when the window is created. }
begin
 inherited; // ???
 CreateParams(Params);
 Params.Style := Params.Style and not ws_Border; // remove border
end;
procedure TddgHintWindow.FreeCurrentRegion;
{ Regions, like other API objects, should be freed when you are }
{ through using them. Note, however, that you cannot delete a }
{ region which is currently set in a window, so this method sets }
{ the window region to 0 before deleting the region object. }
begin
 if FRegion <> 0 then // if Region is alive...
 begin
 SetWindowRgn(Handle, 0, True); // set win region to 0
 DeleteObject(FRegion); // kill the region
 FRegion := 0; // zero out field
 end;
end;
procedure TddgHintWindow.ActivateHint(Rect: TRect; const AHint: string);
{ Called when the hint is activated by putting the mouse pointer }
{ above a control. }
begin
 with Rect do
 Right := Right + Canvas.TextWidth('WWWW'); // add some slop
 BoundsRect := Rect;
 FreeCurrentRegion;
 with BoundsRect do
 { Create a round rectangular region to display the hint window }
 FRegion := CreateRoundRectRgn(0, 0, Width, Height, Width, Height);
 if FRegion <> 0 then
 SetWindowRgn(Handle, FRegion, True); // set win region
 inherited;
 ActivateHint(Rect, AHint); // call inherited
end;
procedure TddgHintWindow.Paint;
{ This method gets called by the WM_PAINT handler. It is }
{ responsible for painting the hint window. }
var
 R: TRect;
begin
 R := ClientRect; // get bounding rectangle
 Inc(R.Left, 1); // move left side slightly
 Canvas.Font.Color := clInfoText; // set to proper color
 { paint string in the center of the round rect }
 DrawText(Canvas.Handle, PChar(Caption), Length(Caption), R, DT_NOPREFIX or DT_WORDBREAK or DT_CENTER or DT_VCENTER);
end;
var
 OldHintClass: THintWindowClass;
function SetNewHintClass(AClass: THintWindowClass): THintWindowClass;
var
 DoShowHint: Boolean;
begin
 Result := HintWindowClass; // return value is old hint window
 DoShowHint := Application.ShowHint;
 if DoShowHint then
 Application.ShowHint := False; // destroy old hint window
 HintWindowClass := AClass; // assign new hint window
 if DoShowHint then
 Application.ShowHint := True; // create new hint window
end;
initialization
 OldHintClass := SetNewHintClass(TddgHintWindow);
finalization
 SetNewHintClass(OldHintClass);
end.
Source: Взято с сайта http://blackman.wp-club.net/
ID: 01277
Хитрость вывода изображения

=== Хитрость вывода изображения ===
Попробуйте установить:
Image1.ControlStyle := Image1.ControlStyle + [csOpaque];
в обработчике события формы OnCreate (или, по крайней мере прежде, чем вы покажете форму). Компоненты TImage изначально прозрачные (за исключением области, занятой изображением), поэтому сообщая Delphi, что компонент непрозрачен, вы тем самым помешаете что-либо "рисовать" на области, не занятой собственно изображением (типа клиентской области формы).
Source: Взято с http://delphiworld.narod.ru
ID: 01258
Хранение данных в EXE-файле

=== Хранение данных в EXE-файле ===
Вы можете включить любой тип данных как RCDATA или пользовательских тип ресурса. Это очень просто. Данный совет покажет вам общую технику создания такого ресурса.
type
 TStrItem = string[39]; { 39 символов + байт длины -> 40 байтов }
 TDataArray = array [0..7, 0..24] of TStrItem;
const
 Data: TDataArray = (
 ('..', ...., '..' ), { 25 строк на строку }
 ... { 8 таких строк }
 ('..', ...., '..' )); { 25 строк на строку }
Данные размещаются в вашем сегменте данных и занимают в нем 8K. Если это слишком много для вашего приложения, поместите реальные данные в ресурс RCDATA. Следующие шаги демонстрируют данный подход. Создайте небольшую безоконную программку, объявляющую типизированную константу как показано выше, и запишите результат в файл на локальный диск:
program MakeData;
type
 TStrItem = string[39]; { 39 символов + байт длины -> 40 байтов }
 TDataArray = array[0..7, 0..24] of TStrItem;
const
 Data: TDataArray = (
 ('..', ...., '..'), { 25 строк на строку }
 ... { 8 таких строк }
 ('..', ...., '..')); { 25 строк на строку }
var
 F: file of TDataArray;
begin
 Assign(F, 'data.dat');
 Rewrite(F);
 Write(F, Data);
 Close(F);
end.
Теперь подготовьте файл ресурса и назовите его DATA.RC. Он должен содержать только следующую строчку:
 DATAARRAY RCDATA "data.dat"
Сохраните это, откройте сессию DOS, перейдите в каталог где вы сохранили data.rc (там же, где и data.dat!) и выполните следующую команду:
 brcc data.rc
Теперь вы имеете файл data.res, который можете подключить к своему Delphi-проекту. Во время выполнения приложения вы можете генерировать указатель на данные этого ресурса и иметь к ним доступ, что и требовалось.
{ в секции interface модуля }
type
 TStrItem = string[39]; { 39 символов + байт длины -> 40 байтов }
 TDataArray = array[0..7, 0..24] of TStrItem;
 PDataArray = ^TDataArray;
const
 pData: PDataArray = nil; { в Delphi 2.0 используем Var }
implementation
{$R DATA.RES}
procedure LoadDataResource;
var
 dHandle: THandle;
begin
 { pData := Nil; если pData - Var }
 dHandle := FindResource(hInstance, 'DATAARRAY', RT_RCDATA);
 if dHandle <> 0 then
 begin
 dhandle := LoadResource(hInstance, dHandle);
 if dHandle <> 0 then
 pData := LockResource(dHandle);
 end;
 if pData = nil then
 { неудача, получаем сообщение об ошибке с помощью
 WinProcs.MessageBox, без помощи VCL, поскольку здесь код
 выполняется как часть инициализации программы и VCL
 возможно еще не инициализирован! }
end;
initialization
 LoadDataResource;
end.
Теперь вы можете ссылаться на элементы массива с помощью синтаксиса pData^[i,j].
Author: Peter Below
Source: Взято с http://delphiworld.narod.ru
ID: 02169
Хранение стилей шрифта

=== Хранение стилей шрифта ===
Как мне сохранить свойство шрифта Style, ведь он же набор? 
Вы можете получать и устанавливать FontStyle через его преобразование к типу byte. 
Для примера,
var
 Style: TFontStyles;
begin
 { Сохраняем стиль шрифта в байте }
 Style := Canvas.Font.Style; { необходимо, поскольку Font.Style - свойство }
 ByteValue := Byte(Style);
 { Преобразуем значение byte в TFontStyles }
 Canvas.Font.Style := TFontStyles(ByteValue);
end;
Для восстановления шрифта, вам необходимо сохранить параметры Color, Name, Pitch, Style и Size в базе данных и назначить их соответствующим свойствам при загрузке.
Source: Взято с http://delphiworld.narod.ru
ID: 01951
Цвет неактивной ячейки StringGrid

=== Цвет неактивной ячейки StringGrid ===
...если я щелкаю на любой ячейке StringGrid2, последняя выбранная ячейка в StringGrid1 становится синей...
Создайте обработчик (если он отсутствует) события сетки OnDrawCell и включите в него следующий код:
procedure TForm1.StringGrid3DrawCell(Sender: TObject; vCol,
 vRow: Longint; Rect: TRect; State: TGridDrawState);
begin
 if Sender = ActiveControl then
 Exit;
 if not (gdSelected in State) then
 Exit;
 with Sender as TStringGrid do
 begin
 Canvas.Brush.Color := Color;
 Canvas.Font.Color := Font.Color;
 Canvas.TextRect(Rect, Rect.Left + 2, Rect.Top + 2,
 Cells[vCol, vRow]);
 end;
end;
Имейте в виду, что в обработчике события OnDrawCell я переименовал параметры Col и Row на vCol и vRow, чтобы избежать путаницы со свойствами StringGrid, имеющими те же имена. Данный метод выполняется немедленно после того, как сетка становится неактивной, и после того как запрошенная ячейка становится НЕвыбранной. В любом из этих случаев вы должны нарисовать невыбранную ячейку для НЕАКТИВНОЙ сетки - т.е. в тех случаях, когда у вас получается "неправильный" цвет. Вы просто берете работу Delphi по закрашиванию ячеек на себя, пропуская defaultDrawing (отрисовку по умолчанию), для таких ячеек, но в то же время разрешая Delphi поработать за вас во всех остальных случаях.
Author: Neil J. Rubenking
Source: http://delphiworld.narod.ru/
ID: 01084