nyuuzyou/wikis huggingface dataset:
S-регистры модема

=== S-регистры модема ===
 S0 Звонок, на который необходимо ответить (Ring After Which To Answer) 
 S1 Количество звонков (Ring Count) 
 S2 Символ отмены (Hayes Escape Character) 
 S3 Символ перевода строки (Carriage Return Character) 
 S4 Символ пропуска строки (Line Feed Character) 
 S5 Символ пробела (Backspace Character) 
 S6 Ожидание перед вызывом (Wait Before Blind Dialing) 
 S7 Ожидание ответа (Wait For Carrier) 
 S8 Время паузы для запятой (Pause Time For Comma) 
 S9 Время восстановления (Carrier Recovery Time) 
 S10 Время задержки для поднятия трубки после потери соединения (Lost Carrier Hang Up Delay) 
 S11 Время DTMF соединения (DTMF Dialing Speed) 
 S12 Время защиты отмены (Hayes Escape Guard Time) 
 S16 Выполнение теста (Test in Progress) 
 S18 Тест таймера модема (Modem Test Timer) 
 S19 Настройки автосинхронизации (AutoSync Options) 
 S25 Обнаружено изменение DTD (Detect DTD Change) 
 S26 Интервал задержки RTS для CTS (RTS To CTS Delay Interval) 
 S30 Неактивное время ожидания (Inactivity Timeout) 
 S31 Символ XON (XON Character) 
 S32 Символ XOFF (XON Character) 
 S36 Ошибка согласования TDeatment (Negotiation Failure TDeatment) 
 S37 Ускорение DCE линии (Desired DCE Line Speed) 
 S38 Время ожидания снятия трубки (Hang-up Timeout) 
 S43 Текущая скорость линии (Current Line Speed) 
 S44 Техническая конструкция (Framing Technique) 
 S46 Выбор протокола/компрессии (Protocol/Compression Selection) 
 S48 Действие характеристики согласования (Feature Negotiation Action) 
 S49 Низкий предел буфера (Buffer Low Limit) 
 S50 Высокий предел буфера (Buffer High Limit) 
 S70 Максимальное число ReTDansmissions (Maximum Number of ReTDansmissions) 
 S73 Неактивное время ожидания (No Activity Timeout) 
 S82 Выбор прерывания (Break Selection) 
 S86 Код причины неудачной связи (Connection Failure Cause Code) 
 S91 Выбор уровня TDansmit коммутируемой линии (Select Dial-up Line TDansmit Level) 
 S95 Расширенный результат кода битовой карты (Extended Result Code Bit Map) 
 S97 Позднее время соединения - снятия трубки (V.32 Late Connecting Handshake Timing) 
 S105 Размер кадра (Frame Size) 
 S108 Селектор качества сигнала (Signal Quality Selector) 
 S109 Селектор скорости соединения (Carrier Speed Selector) 
 S110 Селектор V.32/V.32 bis (V.32/V.32 bis Selector) 
 S113 Тональный вызов ConTDol (Calling Tone ConTDol) 
 S121 Использование DTD (Use of DTD) 
 S141 Таймер фазы обнаружения (Detection Phase Timer) 
 S142 Онлайновый формат символов (Online Character Format) 
 S144 Выбор скорости автобода (Autobaud Speed Group Selection) 
Сборник Kuliba
Source: Взято из Советов по Delphi от Валентина Озерова
ID: 01468
Save all TWebbrowser Frame Sources?

uses
 ActiveX;
function TForm1.GetFrame(FrameNo: Integer): IWebbrowser2;
var
 OleContainer: IOleContainer;
 enum: IEnumUnknown;
 unk: IUnknown;
 Fetched: PLongint;
begin
 while Webbrowser1.ReadyState <> READYSTATE_COMPLETE do
 Application.ProcessMessages;
 if Assigned(Webbrowser1.document) then
 begin
 Fetched := nil;
 OleContainer := Webbrowser1.Document as IOleContainer;
 OleContainer.EnumObjects(OLECONTF_EMBEDDINGS, Enum);
 Enum.Skip(FrameNo);
 Enum.Next(1, Unk, Fetched);
 Result := Unk as IWebbrowser2;
 end
 else
 Result := nil;
end;
// Load sample page
// Testseite laden
procedure TForm1.Button1Click(Sender: TObject);
begin
 Webbrowser1.Navigate('http://www.warebizprogramming.com/tutorials/html/framesEx1.htm');
end;
// Save all frames in single files
// Alle Frameseiten in einzelne Dateien speichern
procedure TForm1.Button2Click(Sender: TObject);
var
 IpStream: IPersistStreamInit;
 AStream: TMemoryStream;
 iw: IWebbrowser2;
 i: Integer;
 sl: TStringList;
begin
 for i := 0 to Webbrowser1.OleObject.Document.frames.Length - 1 do
 begin
 iw := GetFrame(i);
 AStream := TMemoryStream.Create;
 try
 IpStream := iw.document as IPersistStreamInit;
 if Succeeded(IpStream.save(TStreamadapter.Create(AStream), True)) then
 begin
 AStream.Seek(0, 0);
 sl := TStringList.Create;
 sl.LoadFromStream(AStream);
 sl.SaveToFile('c:\frame' + IntToStr(i) + '.txt');
 // memo1.Lines.LoadFromStream(AStream);
 sl.Free;
 end;
 except
 end;
 AStream.Free;
 end;
end;
end.
Source: http://www.swissdelphicenter.ch/en/tipsindex.php
ID: 03463
Category:Связь
Category:WebBrowser
SetFocus в Edit на OnExit

=== SetFocus в Edit на OnExit ===
Я пробую выполнить editbox.SetFocus и/или editbox.Clear, но но это не дает никакого эффекта (по крайней мере видимого). Что я делаю неправильно? 
Вы посылаете команду на изменение фокуса внутри обработчика, который сам устанавливает фокус, этим вы получаете банальную рекурсию. 
Я избегаю этого путем отправления собственного сообщения в обработчике OnExit, после чего в обработчике моего сообщения выставляю логический флажок, предохраняющий код от рекурсии, поскольку данный флажок контролируется в обработчике OnExit. 
Следующие строки содержат необходимый код:
interface
const
 WM_MyExitRtn = WM_USER + 1001;
type
 TForm1 = class(TForm)
 private
 bExitInProgress: Boolean; { предохраняемся от рекурсий сообщений }
 public
 procedure WMMyExitRtn(var msg: TMessage); message WM_MyExitRtn;
 end;
implementation
procedure TForm1.DBEdit1Exit(Sender: TObject);
begin
 if not bExitInProgress then
 PostMessage(Handle, WM_MyExitRtn, 0, LongInt(Sender));
end;
procedure TForm1.WMMyExitRtn(var msg: TMessage);
begin
 bExitInProgress := True; { предохраняемся от рекурсивного вызова }
 { здесь содержится необходимый код }
 bExitInProgress := False; { сбрасываем флаг }
end;
Source: http://delphiworld.narod.ru/
ID: 00985
Sharpen a Bitmap

Добавление резкости это смешивание текущего пикселя со средним значением окружающих пикселей, но с отрицательным влиянием на среднее значение.
// to sharpen, alpha must be >1.
// pixelformat pf24bit
// sharpens sbm to tbm
procedure Sharpen(sbm, tbm: TBitmap; alpha: Single);
var
 i, j, k: Integer;
 sr: array[0..2] of PByte;
 st: array[0..4] of PRGBTriple;
 tr: PByte;
 tt, p: PRGBTriple;
 beta: Single;
 inta, intb: Integer;
 bmh, bmw: Integer;
 re, gr, bl: Integer;
 BytesPerScanline: Integer;
begin
 // sharpening is blending of the current pixel
 // with the average of the surrounding ones,
 // but with a negative weight for the average
 Assert((sbm.Width > 2) and (sbm.Height > 2), 'Bitmap must be at least 3x3');
 Assert((alpha > 1) and (alpha < 6), 'Alpha must be >1 and <6');
 beta := (alpha - 1) / 5; // we assume alpha>1 and beta<1
 intb := Round(beta * $10000);
 inta := Round(alpha * $10000); // integer scaled alpha and beta
 sbm.PixelFormat := pf24bit;
 tbm.PixelFormat := pf24bit;
 tbm.Width := sbm.Width;
 tbm.Height := sbm.Height;
 bmw := sbm.Width - 2;
 bmh := sbm.Height - 2;
 BytesPerScanline := (((bmw + 2) * 24 + 31) and not 31) div 8;
 tr := tbm.Scanline[0];
 tt := PRGBTriple(tr);
 sr[0] := sbm.Scanline[0];
 st[0] := PRGBTriple(sr[0]);
 for j := 0 to bmw + 1 do
 begin
 tt^ := st[0]^;
 Inc(tt);
 Inc(st[0]); // first row unchanged
 end;
 sr[1] := PByte(Integer(sr[0]) - BytesPerScanline);
 sr[2] := PByte(Integer(sr[1]) - BytesPerScanline);
 for i := 1 to bmh do
 begin
 Dec(tr, BytesPerScanline);
 tt := PRGBTriple(tr);
 st[0] := PRGBTriple(Integer(sr[0]) + 3); // top
 st[1] := PRGBTriple(sr[1]); //left
 st[2] := PRGBTriple(Integer(sr[1]) + 3); // center
 st[3] := PRGBTriple(Integer(sr[1]) + 6); // right
 st[4] := PRGBTriple(Integer(sr[2]) + 3); // bottom
 tt^ := st[1]^; // 1st col unchanged
 for j := 1 to bmw do
 begin
 // calculate average weighted by -beta
 re := 0;
 gr := 0;
 bl := 0;
 for k := 0 to 4 do
 begin
 re := re + st[k]^.rgbtRed;
 gr := gr + st[k]^.rgbtGreen;
 bl := bl + st[k]^.rgbtBlue;
 Inc(st[k]);
 end;
 re := (intb * re + $7FFF) shr 16;
 gr := (intb * gr + $7FFF) shr 16;
 bl := (intb * bl + $7FFF) shr 16;
 // add center pixel weighted by alpha
 p := PRGBTriple(st[1]); // after inc, st[1] is at center
 re := (inta * p^.rgbtRed + $7FFF) shr 16 - re;
 gr := (inta * p^.rgbtGreen + $7FFF) shr 16 - gr;
 bl := (inta * p^.rgbtBlue + $7FFF) shr 16 - bl;
 // clamp and move into target pixel
 Inc(tt);
 if re < 0 then
 re := 0
 else if re > 255 then
 re := 255;
 if gr < 0 then
 gr := 0
 else if gr > 255 then
 gr := 255;
 if bl < 0 then
 bl := 0
 else if bl > 255 then
 bl := 255;
 // this looks stupid, but avoids function calls
 tt^.rgbtRed := re;
 tt^.rgbtGreen := gr;
 tt^.rgbtBlue := bl;
 end;
 Inc(tt);
 Inc(st[1]);
 tt^ := st[1]^; // Last col unchanged
 sr[0] := sr[1];
 sr[1] := sr[2];
 Dec(sr[2], BytesPerScanline);
 end;
 // copy last row
 Dec(tr, BytesPerScanline);
 tt := PRGBTriple(tr);
 st[1] := PRGBTriple(sr[1]);
 for j := 0 to bmw + 1 do
 begin
 tt^ := st[1]^;
 Inc(tt);
 Inc(st[1]);
 end;
end;
Source: http://www.swissdelphicenter.ch/en/tipsindex.php
ID: 03863
Category:Графика
Category:Bitmap
Split/merge files?

{
 Parameters:
 FileToSplit: Specify a file to split.
 SizeofFiles: Specify the size of the files you want to split to (in bytes)
 Progressbar: Specify a TProgressBar to show the splitting progress
 Result:
 SplitFile() will create files FileName.001, FileName.002, FileName.003 and so on
 that are SizeofFiles bytes in size.
 }
function SplitFile(FileName: TFileName; SizeofFiles: Integer; ProgressBar: TProgressBar): Boolean;
var
 i: Word;
 fs, sStream: TFileStream;
 SplitFileName: String;
begin
 ProgressBar.Position := 0;
 fs := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
 try
 for i := 1 to Trunc(fs.Size / SizeofFiles) + 1 do
 begin
 SplitFileName := ChangeFileExt(FileName, '.'+ FormatFloat('000', i));
 sStream := TFileStream.Create(SplitFileName, fmCreate or fmShareExclusive);
 try
 if fs.Size - fs.Position < SizeofFiles then
 SizeofFiles := fs.Size - fs.Position;
 sStream.CopyFrom(fs, SizeofFiles);
 ProgressBar.Position := Round((fs.Position / fs.Size) * 100);
 finally
 sStream.Free;
 end;
 end;
 finally
 fs.Free;
 end;
end;
// Combine files / Dateien zusammenfuhren
{
 Parameters:
 FileName: Specify the first piece of the splitted files
 CombinedFileName: Specify the combined file name. (the output file)
 Result:
 CombineFiles() will create one large file from the pieces
 }
function CombineFiles(FileName, CombinedFileName: TFileName): Boolean;
var
 i: integer;
 fs, sStream: TFileStream;
 filenameOrg: String;
begin
 i := 1;
 fs := TFileStream.Create(CombinedFileName, fmCreate or fmShareExclusive);
 try
 while FileExists(FileName) do
 begin
 sStream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
 try
 fs.CopyFrom(sStream, 0);
 finally
 sStream.Free;
 end;
 Inc(i);
 FileName := ChangeFileExt(FileName, '.'+ FormatFloat('000', i));
 end;
 finally
 fs.Free;
 end;
end;
// Examples:
procedure TForm1.Button1Click(Sender: TObject);
begin
 SplitFile('C:\temp\FileToSplit.chm', 1000000, ProgressBar1);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
 CombineFiles('C:\temp\FileToSplit.001', 'H:\temp\FileToSplit.chm');
end;
Source: Взято с сайта http://www.swissdelphicenter.ch/en/tipsindex.php
ID: 03177
Category:Файловая система
Spray effect

procedure Spray(Canvas: TCanvas; x, y, r: Integer; Color: TColor);
var
 rad, a: Single;
 i: Integer;
begin
 for i := 0 to 100 do
 begin
 a := Random * 2 * pi;
 rad := Random * r;
 Canvas.Pixels[x + Round(rad * Cos(a)), y + Round(rad * Sin(a))] := Color;
 end;
end;
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
 if ssLeft in Shift then Spray(Image1.Canvas, x, y, 40, clRed);
end;
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
 if ssLeft in Shift then Spray(Image1.Canvas, x, y, 40, clRed);
end;
Source: http://www.swissdelphicenter.ch/en/tipsindex.php
ID: 03895
Category:Графика
Category:Bitmap
StatusBar с другими контролами

=== StatusBar с другими контролами ===
Этот StatusBar позволит размещать на себе любые другие контролы.
Создаем новый компонент от StatusBar и правим код как внизу. Потом инсталлируем и все.
unit StatusBarExt;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls;
type
 TStatusBarExt = class(TStatusBar)
 public
 constructor Create(AOwner: TComponent); override; // добавить конструктор
 end;
procedure Register;
implementation
uses Consts; // не забыть
constructor TStatusBarExt.Create( AOwner : TComponent );
begin
 inherited Create(AOwner);
 ControlStyle := ControlStyle + [csAcceptsControls]; // собственно все!
end;
procedure Register;
begin
 RegisterComponents('Samples', [TStatusBarExt]);
end;
end.
Source: Взято с Vingrad.ru http://forum.vingrad.ru
ID: 00516
StrAlloc и GetMem

=== StrAlloc и GetMem ===
StrAlloc непосредственно использует GetMem, поэтому обе функции живут за счет Кучи. StrAlloc имеет преимущество: он распределяет на два байта больше, чем вы просите и там хранит размер размещенного блока. Поэтому StrDispose знает сколько памяти освободить и вы можете этого не помнить (в отличие от GetMem/FreeMem). Не смешивайте при работе эти две функциональные пары, иначе вы будете потрясены количеством возникающих ошибок! 
Source: http://delphiworld.narod.ru
ID: 00814
Stream Read Error

=== Stream Read Error ===
В моем автономном приложении при чтении/записи из моей базы данных с помощью BDE проблем не возникает. Когда я выгружаю .EXE на наш сетевой том NetWare 3.11, я получаю случайные сообщения об ошибке "Stream Read Error" (ошибка чтения потока). В сети у меня имеется BDE, но пользователи имеют на своих жестких дисках собственные файлы IDAPI.CFG. Может мне кто-нибудь прояснит ситуацию?
В программе конфигурирования Database Engine Configuration, на закладке 'system', попробуйте изменить значение по умолчанию для MAXFILEHANDLES с 48 на 12. Не знаю почему, но это решило мои проблемы, у меня исчезли ошибки 'Stream read error' и различные GPF-ы.
Author: Roger Huffman
Вопреки логики, как мне УМЕНЬШИТЬ количество дескрипторов файлов? Повышать мне их не удалось.
BDE берет дескриптор файла из доступного пула, поэтому, уменьшая его, вы эффективно теряете дескрипторы файла для его нормального открытия и закрытия. Также, уменьшая количество дескрипторов файла BDE, вы ничего этим не сделаете, поскольку BDE начинает их виртуализировать.
Author: Roy Woll
Source: Взято с http://delphiworld.narod.ru
ID: 02586
StringGrid, Печать в ячейку

=== StringGrid, Печать в ячейку ===
unit Unit1;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, Grids;
type
 TForm1 = class(TForm)
 StringGrid: TStringGrid;
 procedure FormCreate(Sender: TObject);
 procedure StringGridDrawCell(Sender: TObject; ACol, ARow: Integer;
 Rect: TRect; State: TGridDrawState);
 end;
var
 Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
 C, R: Integer;
begin
 for C := 0 to StringGrid.ColCount - 1 do
 for R := 0 to StringGrid.RowCount - 1 do
 StringGrid.Cells[C, R] := 'A very very very long string';
end;
procedure TForm1.StringGridDrawCell(Sender: TObject; ACol, ARow: Integer;
 Rect: TRect; State: TGridDrawState);
begin
 if not (Sender is TStringGrid) then Exit;
 with TStringGrid(Sender) do
 begin
 Canvas.FillRect(Rect);
 DrawText(Canvas.Handle, PChar(Cells[ACol, ARow]), -1, Rect, DT_WORDBREAK);
 end;
end;
end.
Author: Smike
Source: Взято из http://forum.sources.ru
ID: 00616
StringGrid, выделить фиксированные строки

=== StringGrid, выделить фиксированные строки ===
unit Unit1;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, Grids;
type
 TForm1 = class(TForm)
 StringGrid1: TStringGrid;
 procedure FormCreate(Sender: TObject);
 procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
 Rect: TRect; State: TGridDrawState);
 end;
var
 Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
 C, R: Integer;
begin
 for C := 0 to StringGrid1.ColCount - 1 do
 begin
 for R := 0 to StringGrid1.RowCount - 1 do
 begin
 if (C < StringGrid1.FixedCols) or
 (R < StringGrid1.FixedRows) then
 StringGrid1.Cells[C, R] := Format('Fixed Cell (%dx%xd)', [C, R])
 else
 StringGrid1.Cells[C, R] := Format('Cell (%dx%d)', [C, R]);
 end;
 end;
end;
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
 Rect: TRect; State: TGridDrawState);
var
 I: Integer;
begin
 with StringGrid1 do
 if gdFixed in State then
 begin
 Canvas.FillRect(Rect);
 InflateRect(Rect, -2, 0);
 if (ACol = Col) or (ARow = Row) then
 Canvas.Font.Style := [fsBold]
 else
 Canvas.Font.Style := [];
 DrawText(Canvas.Handle,
 PChar(Cells[ACol, ARow]), -1, Rect,
 DT_SINGLELINE or DT_VCENTER);
 end else begin
 Rect := CellRect(ACol, 0);
 for I := 1 to FixedRows - 1 do
 with CellRect(ACol, I) do
 Inc(Rect.Bottom, Bottom - Top);
 InvalidateRect(Handle, @Rect, True);
 Rect := CellRect(0, ARow);
 for I := 1 to FixedCols - 1 do
 with CellRect(I, ARow) do
 Inc(Rect.Right, Right - Left);
 InvalidateRect(Handle, @Rect, True);
 end;
end;
end.
Author: Smike
Source: Взято из http://forum.sources.ru
ID: 00615
StringGrid без выделенной ячейки

=== StringGrid без выделенной ячейки ===
Я пытаюсь показать StringGrid без выделенной ячейки. Первая нефиксированная ячейка всегда имеет состояние "инвертированного" цвета. Я не хочу позволить пользователю редактировать сетку, но эта выделенная ячейка производит впечатление того, что сетка имеет возможность редактирования... 
Вам необходимо создать обработчик события OnDrawCell. Это легче чем вы думаете. Вот образец кода, который сделает вас счастливым:
procedure TForm.sgrDrawCells(Sender: TObject; Col, Row: Longint; Rect: TRect;
 State: TGridDrawState);
var
 ACol: longint absolute Col;
 ARow: longint absolute Row;
 Buf: array[byte] of char;
begin
 if State = gdFixed then
 Exit;
 with sgrGrid do
 begin
 Canvas.Font := Font;
 Canvas.Font.Color := clWindowText;
 Canvas.Brush.Color := clWindow;
 Canvas.FillRect(Rect);
 StrPCopy(Buf, Cells[ACol, ARow]);
 DrawText(Canvas.Handle, Buf, -1, Rect,
 DT_SINGLELINE or DT_VCENTER or DT_NOCLIP or DT_LEFT);
 end;
end;
Source: http://delphiworld.narod.ru/
ID: 01051
StringGrid как DBGrid

=== StringGrid как DBGrid ===
Ну это может выглядеть приблизительно так (возможно нужна некоторая доработка, написал от руки, не проверяя):
Table.First;
Row := 0;
Grid.RowCount := Table.RecordCount;
while not Table.Eof do 
begin
 for i := 0 to table.FieldCount-1 do
 Grid.Cells[i, Row] := Table.Fields[i].AsString;
 Inc(Row);
 Table.Next;
end;
У меня тоже имееются свои причины использования TStringGrid. Вот мой код, который загружает данные из отфильтрованной таблицы. Он не очень изящен, т.к. реально является лишь черновиком. У меня это работает, а большего мне и не нужно. Работает очень быстро, даже в случае сотни загруженных колонок. Есть много ссылок на внешние переменные. Надеюсь что они не слишком заумные.
procedure TformLookupDB.FillCells;
var
 Row, i: INTEGER;
 w: INTEGER;
 grid: TStringGrid;
begin
 doGrid.RowCount := 0;
 if not ASSIGNED(fDB) then
 EXIT;
 Row := 0;
 for i := LOW(fColWidths) to HIGH(fColWidths) do
 fColWidths[i] := 100;
 // Данный временный объект-сетка используется для предохранения от огромного
 // количества подразумеваемых событий Application.ProcessMessages,
 // инициируемых базой данных, и вызывающих противное моргание объекта
 // doGrid. Итак, мы загружаем данные в объект-сетку
 // и затем копируем их в стобцы, начиная с верхней части.
 grid := TStringGrid.Create(Self);
 grid.Visible := FALSE;
 with fDB do
 try
 grid.ColCount := fFields.Count;
 DisableControls;
 // Фильтр был установлен с помощью свойства Self.Filter
 First;
 while not EOF do
 try
 grid.RowCount := Row + 1;
 for i := 0 to grid.ColCount - 1 do
 begin
 grid.Cells[i, Row] :=
 FieldByName(fFields.Strings[i]).AsString
 w := doGrid.Canvas.TEXTWIDTH(grid.Cells[i,
 Row]);
 if fColWidths[i] < w then
 fColWidths[i] := w;
 end
 INC(Row);
 finally
 Next;
 end
 finally
 doGrid.RowCount := grid.RowCount;
 doGrid.ColCount := grid.ColCount;
 for i := 0 to grid.ColCount - 1 do
 begin
 doGrid.Cols[i] := grid.Cols[i];
 doGrid.ColWidths[i] := fColWidths[i] + 4
 end
 grid.Free;
 EnableControls
 end
end;
Source: http://delphiworld.narod.ru/
ID: 01092
String → Array

=== String --> Array ===
procedure AssignFixedString(var FixedStr: array of Char; const S: String);
var
 maxlen: Integer;
begin
 maxlen := Succ(High(FixedStr) - Low(FixedStr));
 FillChar(FixedStr, maxlen, ' '); { blank fixed string }
 if Length(S) > maxlen then
 Move(S[1], FixedStr, maxlen)
 else
 Move(S[1], FixedStr, Length(S));
end;
ID: 00253
----
function StrToArrays(str, r: string; out Temp: TStrings): Boolean;
var
 j: integer;
begin
 if temp <> nil then
 begin
 temp.Clear;
 while str <> do
 begin
 j := Pos(r,str);
 if j = 0 then
 j := Length(str) + 1;
 temp.Add(Copy(Str,1,j-1));
 Delete(Str,1,j+length(r)-1);
 end;
 Result := True;
 end
 else
 Result := False;
end;
Source: http://delphiworld.narod.ru
ID: 00796
String → Ascii

=== String --> Ascii ===
{ **** UBPFD *********** by delphibase.endimus.com ****
>> Преобразование строки S в набор её чисел,
где каждое число представляет каждый символ строки
Получив строку S функция преобразует её в набор чисел, каждое из которых
обозначает код текущего символа, а перед каждым числом располагается символ "#".
Пусть, например, S = 'Hello';
Тогда Result = '#72#101#108#108#111';
Зависимости: system
Copyright: VID
Дата: 25 апреля 2002 г.
***************************************************** }
function StrToAscii(S: string): string;
var
 I, X: Integer;
 RS: string;
 CurChar: string;
begin
 Result := ;
 if Length(S) = 0 then
 Exit;
 X := 1;
 for I := 1 to Length(S) do
 begin
 CurChar := '#' + Inttostr(Ord(S[I]));
 Insert(CurChar, RS, X);
 X := X + Length(CurChar);
 end;
 Result := RS;
end;
Author: VID
Source: http://delphibase.endimus.com
ID: 00917
String → BCD

=== String --> BCD ===
function NumStringToBCD(const inStr: string): string;
 function Pack(ch1, ch2: Char): Char;
 begin
 Assert((ch1 >= '0') and (ch1 <= '9'));
 Assert((ch2 >= '0') and (ch2 <= '9'));
 {Ord('0') is $30, so we can just use the low nybble of the character
 as value.}
 Result := Chr((Ord(ch1) and $F) or ((Ord(ch2) and $F) shl 4))
 end;
var
 i: Integer;
begin
 if Odd(Length(inStr)) then
 Result := NumStringToBCD('0' + instr)
 else begin
 SetLength(Result, Length(inStr) div 2);
 for i := 1 to Length(Result) do
 Result[i] := Pack(inStr[2 * i - 1], inStr[2 * i]);
 end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
 S1, S2: string;
begin
 S1 := '15151515151515151515';
 S2 := NumStringToBCD(S1);
 memo1.lines.add('S1: ' + S1);
 memo1.lines.add('Length(S2): ' + IntToStr(Length(S2)));
 memo1.lines.add('S2 unpacked again: ' + BCDToNumString(S2));
end;
Source: Взято с сайта http://www.swissdelphicenter.ch/en/tipsindex.php
ID: 00162
String → HKEY

=== String --> HKEY ===
const
 HKEYNames: array[0..6] of string =
 ('HKEY_CLASSES_ROOT', 
 'HKEY_CURRENT_USER', 
 'HKEY_LOCAL_MACHINE', 
 'HKEY_USERS',
 'HKEY_PERFORMANCE_DATA', 
 'HKEY_CURRENT_CONFIG', 
 'HKEY_DYN_DATA');
function StrToHKEY(const KEY: string): HKEY;
var
 i: Byte;
begin
 Result := $0;
 for i := Low(HKEYNames) to High(HKEYNames) do
 begin
 if SameText(HKEYNames[i], KEY) then
 Result := HKEY_CLASSES_ROOT + i;
 end;
end;
Source: Взято с сайта http://www.swissdelphicenter.ch/en/tipsindex.php
ID: 00165
String → PChar

=== String --> PChar ===
var
 S: String;
 P: PChar;
begin
 P := PChar(S);
Source: Взято из http://forum.sources.ru
ID: 00149
----
Все функции API для работы с текстом используют неудобный тип String, а PChar – быстрее. Преобразовать строку String в PChar очень просто: PChar('It is my string'). Можно использовать то, что PChar – это адрес первого символа строки, заканчивающейся символом #0. И, наконец, еще одно удобство. Delphi воспринимает массив типа Char и как обычную строку, и как строку PChar. Полная совместимость. Эта программа демонстрирует демонстрирует все это. 
procedure TForm1.Button1Click(Sender: TObject);
var
 s: array [0..99] of Char;
 p: Integer;
begin
 s := 'Delphi World';
 FindWindow(nil, s);
 p := Pos('lp', s);
 Form1.Caption := Copy(s, p, Length(s) - p);
end;
Source: DelphiWorld 6.0 http://delphiworld.narod.ru/
ID: 00947