nyuuzyou/wikis huggingface dataset:
Überflurwaage

== Überflurwaage ==
Überflurwaagen gehören zu der Gruppe Bodenwaagen und werden wie auch die Niederflurwaagen direkt auf den Boden gestellt.
Eine alternative zu einer Überflurwaage wäre eine Unterflurwaage.
== Bauweise von Überflurwaagen ==
Es gibt keine besondere bauliche Voraussetzungen, die Überflurwaagen erfüllen müssen.
== Montage von Überflurwaagen ==
Die Monate einer Überflurwaage ähnelt die der Niederflur- Durchfahrwaage.
Die Montage von Überflurwaagen ist recht einfach. Sie werden an einem beliebigen Aufstellort aufgestellt und benötigen nur einen festen und geraden Boden. 
Um die Waage gegen das Verrutschen zu sichern, können bei einigen Waagenmodelle die Waage mit dem Boden Dübel fixiert werden. Eine andere Möglichkeit wäre, rutschfeste mit Gummiteller bestückte Stellfüße zu verwenden. Die letztere Methode wird gerne angewandt, wenn Dübeln oder wenn die Waage öfters den Standort wechseln muss.
== Vor und Nachteile von Überflurwaagen ==
Natürlich gibt es bei Überflurwaagen Vor und Nachteile, die jeder Betreiber gegeneinander abschätzen muss. 
*Vorteile sind 
**keine Waagengrube nötig
**fast oder keine Montage
**flexibel und mobil (Mobile Waage) 
*Nachteile sind
**schwere Lasten lassen sich nur über eine Gabelstapler aufbringen.
**durch die teilweise geringe Bodenfreiheit können Gegenstände das Messergebnis verfälschen, was aber durch regelmäßiger Kontrolle beheben lässt
**Stolpergefahr
== Zubehör von Überflurwaagen ==
Als Zubehör für Überflurwaagen wäre zb ein Rammschutz. Dieser Rammschutz schützt die Waage gegen das Gegenfahren mit einem Stapler, wodurch Beschädigungen entstehen können. Eventuell wäre auch ein Panzerrohr für das Messkabel zwischen Waagen und Wägeelektronik sehr sinnvoll, da das Messkabel von der Waage zur Wägeelektronik ungeschützt auf dem Boden liegt. Dadurch verhindert man Quetschungen oder Abscherung des Messkabels.
== weitere Bilder von Überflurwaagen ==
 
Bild:Ueberflurwaage_in_einer_wagengrube.jpg|Überflurwaage in einer auf dem Boden aufgesetzten Waagengrube, auch als Rammschutz sehr Sinnvoll
Bild:ueberflurwaage_mit_rammschutz.jpg|Überflurwaage mit Rammschutz
== Siehe auch: ==
* Niederflurwaage
* Unterflurwaage
* Durchfahrwaage
Kategorie:Arten_von_Waagen
Kategorie:Zubehör
Kategorie:Bilder
"Некорректные" вещественные значения

=== "Некорректные" вещественные значения ===
При использовании функции StrToFloat() для значения 1234.5544 я получаю что-то типа 1234.55440000000003, но ведь это неправильно! Ничего здесь неправильного нет. Это просто погрешность чисел с плавающей точкой. Фактически источником ошибки является ошибка округления. Данная ошибка является следствием дефекта арифметики плавающей точки и того факта, что чаще всего десятичные дроби являются повторяющимися долями в двоичной системе счисления. Такие числа не могут представляться в конечном количестве битов. В связи с этим текстовое округление получается не всегда точным, т.к. большинство компьютеров подбирает последние цифры дробной части, исходя из ближайшего (с наименьшей разницей) эквивалента. Некоторые компьютеры не производят округления, а просто обрезают (выключают) последние биты, получая результирующую ошибку, правильно называемую ошибкой округления (в противоположность ошибке усечения, когда усекается расширение ряда). Для получения дополнительной информации обратитесь к Introduction to Numerical Methods (введение в числовые методы) авторов Peter A. Stark, Macmillian Company, 1970. Из-за наличия ошибки сравнение двух чисел с плавающей точкой сводится к учету абсолютной или относительной погрешности. Для сравнения двух чисел с учетом абсолютной погрешности используйте следующий код: 
if ABS(CalculatedValue - TrueValue) < FuzzValue then ... 
где FuzzValue определяет величину абсолютной погрешности.
Для сравнения двух чисел с учетом относительной погрешности используйте следующий код:
if ABS( (CalculatedValue - TrueValue) / TrueValue ) < AcceptableRelativeError then ...
где AcceptableRelativeError определяет величину относительной погрешности (ну, и конечно, TrueValue <> 0.0).
Математический модуль Delphi вычисляет относительную погрешность следующим образом (но оно не вынесено в секцию interface): 
function RelSmall(X, Y: Extended): Boolean;
{ Возвращаем Истину, если разница между X и Y незначительна }
const
 C1: Double = 1E-15;
 C2: Double = 1E-12;
begin
 Result := Abs(X) < (C1 + C2 * Abs(Y))
end;
Source: DelphiWorld
ID: 00223
10 способов взлома пароля

1) Попытайся залогиниться без пароля. Просто нажми <enter>. Если это не работает, залогинься с паролем <пробел> <пробел>.
2) 5% компьютеров используют пароль такой же, как и логин. Например, если логин domain, значит и пароль тоже domain. Идиотизм, да? Попытайся залогиниться, используя логин такой же, как и пароль.
3) Примерно 35% компьютеров используют пароль, вторичный от логина. Обычно ты переберешь около 1000 комбинаций, чтобы найти правильный. Например, если логин JQPublic, попытайся Public, John, JohnQPub, и т.д.
4) В 3-ем варианте ты использовал грубый метод подбора пароля. Достань лучше академический словарь слов и имен. Там приблизительно около 30.000 возможных. Быстрая атака заложена в этом методе (приблизительно 800 слов/мин).
5) Сейчас попытайся использовать лист с английскими словами. Там где-то 150.000 слов таких, как оригинальные или известные имена стандартных слов, научные термины, другие языки и т.д.
6) Если это не сработает, время найти специалиста по этим делам. Используй национальный словарь и лист c образцами. Там около 2.500.000 комбинаций. Там есть все, даже игры! Но перебор займет очень много времени. Будь уверен, что ты используешь это не на перегруженном сервере. Если он будет медленным или перегруженным, ты будешь в глубокой жопе.
7) О боже, еще не заработало? Попытайся использовать тот же словарь, только с фильтром. Я имею ввиду, допустим, слово Secret может быть, как SeCrEt, Secr3t, и т.д. Тут больше 1.000.000.000 комбинаций.
8) Используй английский словарь с фильтрами. Похоже, как и в 7-ом методе, но со всеми английскими словами.
9) Еще не заработало??? Если ты проделал все выше описанные действия безрезультатно, то возможно ты имеешь дело с чем-то серьезным. Наверняка, система содержит чрезвычайно секретную информацию. Ты действительно хочешь продолжить? Возможно, ты уже в глубокой жопе, если не можешь получить доступа. Используй национальный словарь с фильтрами. Там более 250.000.000 комбинаций. Тебе потребуется около 18 часов, чтобы закончить этот метод. Работай, дружок, работай.
10) Используй специальную программку (такую, как Claymore). Она тупо подбирает всевозможные буквы, цифры и другие символы. Никто еще не заканчивал это удачно (обламывало подбирать). Там более 205.000.000.000 возможных комбинаций. Если ты не хочешь заниматься этим, выбери другую мишень.
Source: http://delphiworld.narod.ru/
ID: 04030
Category:Алгоритмы
Category:Безопасность
12 AM - это полдень или полночь?

=== 12 AM - это полдень или полночь? ===
Очень-очень странные эти англоязычные люди... И счёт времени у них странный!
Вот так у них наступает полдень:
 11:00 AM (11 утра)
 12:00 PM <- полдень
 1:00 PM (13 часов)
Итак,
* 12 PM - это полдень
* 12 AM - это полночь
Author: Vit (www.delphist.com, www.drkb.ru, www.unihighlighter.com, www.nevzorov.org)
ID: 01651
256-цветное изображение из res-файла

=== 256-цветное изображение из res-файла ===
function LoadBitmap256(hInstance: HWND; lpBitmapName: PChar): HBITMAP;
var
 hPal, hRes, hResInfo: THandle;
 pBitmap: PBitmapInfo;
 nColorData: Integer;
 pPalette: PLogPalette;
 X: Integer;
 hPalette: THandle;
begin
 hResInfo := FindResource(hInstance, lpBitmapName, RT_BITMAP);
 hRes := LoadResource(hInstance, hResInfo);
 pBitmap := Lockresource(hRes);
 nColorData := pBitmap^.bmiHeader.biClrUsed;
 hPal := GlobalAlloc(GMEM_MOVEABLE, (16 * nColorData));
 { hPal := GlobalAlloc(GMEM_MOVEABLE, (SizeOf(LOGPALETTE) + (nColorData * SizeOf(PALETTEENTRY)));}
 pPalette := GlobalLock(hPal);
 pPalette^.palVersion := $300;
 pPalette^.palNumEntries := nColorData;
 for x := 0 to nColorData do
 begin
 pPalette^.palPalentry[X].peRed := pBitmap^.bmiColors[X].rgbRed;
 pPalette^.palPalentry[X].peGreen := pBitmap^.bmiColors[X].rgbGreen;
 pPalette^.palPalentry[X].peBlue := pBitmap^.bmiColors[X].rgbBlue;
 end;
 hPalette := CreatePalette(pPalette^);
 GlobalUnlock(hRes);
 GlobalUnlock(hPal);
 GlobalFree(hPal);
end;
end.
Source: Взято с http://delphiworld.narod.ru
ID: 02167
ADO+Delphi5: постоянные ошибки BOF... или EOF...

=== ADO+Delphi5: постоянные ошибки BOF... или EOF... ===
Обновлённый MDAC конфликтует с старыми компонентами VCL.
Путь разрешения проблемы:
Идём на сайт Борланда, скачиваем SP1 для Delphi5 + специальный ADO Patch.
Сам ADO Patch здесь:
* ftp://ftpc.inprise.com/pub/delphi/devsupport/updates/adoexpress/d5adoupdate2.exe
Service Pack здесь: 
* Enterprise: ftp://ftpc.borland.com/pub/delphi/devsupport/updates/delphi5/D5EntUpdate.exe
* Professional: ftp://ftpc.borland.com/pub/delphi/devsupport/updates/delphi5/D5ProUpdate.exe
* Standard: ftp://ftpc.borland.com/pub/delphi/devsupport/updates/delphi5/D5StdUpdate.exe
Author: Автор: Vit (www.delphist.com, www.drkb.ru, www.unihighlighter.com, www.nevzorov.org)
ID: 02661
ANSI в ASCII

{ преобразование ANSI to ASCII }
function AnToAs(s: string): string;
var
 i, kod: Integer;
begin
 Result := s;
 for i := 1 to Length(s) do
 begin
 kod := Ord(s[i]);
 if kod = 13 then Result[i] := ' ';
 if (kod >= 192) and (kod < 239) then
 Result[i] := Chr(kod - 64);
 if (kod >= 240) and (kod < 255) then
 Result[i] := Chr(kod - 16);
 if kod = 168 then
 Result[i] := Chr(240);
 if kod = 184 then
 Result[i] := Chr(241);
 end;
end;
Source: http://delphiworld.narod.ru
ID: 04263
Category:Конвертация
ASCII-файл с использованием полей

=== ASCII-файл с использованием полей ===
В том случае, когда вы собираетесь использовать содержимое текстового файла таким образом, как будто он имеет поля, вам необходим файл схемы, содержащий описание формата текстового файла и который необходим для осуществления вызовов при работе с полями (Fields / FieldByName / Post / и др.). Ниже приводится код, который вы можете использовать при создании своей программы:
{ Подразумеваем, что Table1 - файл, который мы хотим скопировать в ASCII-файл. Используем TBatchMove, поскольку быстро работает. Также это автоматически создаст файл схемы }
procedure TForm1.Button1Click(Sender: TObject);
var
 oDest: TTable;
 oBMove: TBatchMove;
begin
 try
 oDest := nil;
 oBMove := nil;
 Table1.Close;
 oDest := TTable.Create(nil);
 with oDest do
 begin
 DatabaseName := 'c:\delphi\files';
 TableName := 'Test.Txt';
 TableType := ttASCII;
 end; { Обратите внимание на то, что нет необходимости вызывать CreateTable }
 oBMove := TBatchMove.Create(nil);
 with oBMove do
 begin
 Source := Table1;
 Destination := oDest;
 Mode := batCopy;
 Execute;
 end;
 finally
 if Assigned(oDest) then oDest.Free;
 if Assigned(oBMove) then oBMove.Free;
 end;
end;
{ Теперь, допустим, файл схемы существует; сам текстовый файл может как быть, так его может и не быть. С помощью файла схемы мы уже можем работать с полями }
procedure TForm1.Button2Click(Sender: TObject);
var
 oTxt: TTable;
 i: Integer;
 f: System.Text;
begin
 try
 oTxt := nil;
 if not FileExists('c:\delphi\files\Test.Txt') then
 begin
 AssignFile(f, 'c:\delphi\files\Test.Txt');
 Rewrite(f);
 CloseFile(f);
 end;
 oTxt := TTable.Create(nil);
 with oTxt do
 begin
 DatabaseName := 'c:\delphi\files';
 TableName := 'Test.Txt';
 TableType := ttASCII;
 Open;
 end;
 with Table1 do
 begin
 DisableControls;
 if not Active then Open;
 First;
 while not EOF do
 begin
 oTxt.Insert;
 { В данном случае файл схемы описывает формат текстового файла; в этом
 примере фактически один к одному воспроизводятся поля таблицы
 в логическое определение полей в .sch-файле }
 for i := 0 to FieldCount - 1 do
 oTxt.Fields[i].AsString := Fields[i].AsString;
 oTxt.Post;
 Next;
 end;
 end;
 finally
 Table1.EnableControls;
 if Assigned(oTxt) then oTxt.Free;
 end;
end;
Author: OAmiry/Borland
Source: Взято из Советов по Delphi от Валентина Озерова
ID: 02964
Category:Базы данных
Category:CSV
ASCII код для PrintScreen

=== ASCII код для PrintScreen ===
unit Unit1;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs;
type
 TForm1 = class(TForm)
 procedure FormCreate(Sender: TObject);
 private
 { Private declarations }
 procedure AppIdle(Sender: TObject; var Done: Boolean);
 public
 { Public declarations }
 end;
var
 Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.AppIdle(Sender: TObject; var Done: Boolean);
begin
if GetAsyncKeyState(VK_SNAPSHOT) <> 0 then
 Form1.Caption := 'PrintScreen pressed!';
 Done := True;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
 Application.OnIdle := AppIdle;
end;
end.
ID: 01528
----
type
 TForm1 = class(TForm)
 procedure FormCreate(Sender: TObject);
 procedure FormDestroy(Sender: TObject);
 private
 { Private declarations }
 procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY;
 public
 { Public declarations }
 end;
var
 Form1: TForm1;
implementation
{$R *.DFM}
const id_SnapShot = 101;
procedure TForm1.WMHotKey(var Msg: TWMHotKey);
begin
 if Msg.HotKey = id_SnapShot then
 ShowMessage('GotIt');
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
 RegisterHotKey(Form1.Handle,
 id_SnapShot,
 0,
 VK_SNAPSHOT);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
 UnRegisterHotKey(Form1.Handle, id_SnapShot);
end;
Source: Взято из http://forum.sources.ru
ID: 01529
AVI файл проигрывается снова и снова

=== AVI файл проигрывается снова и снова ===
В примере AVI файл проигрывается снова и снова - используем событие MediaPlayer'а Notify
procedure TForm1.MediaPlayer1Notify(Sender: TObject);
begin
 with MediaPlayer1 do
 if NotifyValue = nvSuccessful then
 begin
 Notify := True;
 Play;
 end;
end;
Source: Взято с сайта http://blackman.wp-club.net/myfaq/default.php 
ID: 01313
Access to table disabled because of previous error. Read failure

=== Access to table disabled because of previous error. Read failure. ===
При добавлении новых записей с помощью метода TTable.AppendRecord в индексированную таблицу FoxPro через какое-то время (то есть при одновременном добавлении большого количества записей) возникает ошибка:
 Access to table disabled because of previous error. Read failure. File <имя_файла.cdx>
Возможно, причина заключается в том, что операции чтения-записи в файл, содержащий таблицу FoxPro, особенно при использовании кэширования, предоставляемого операционной системой, конфликтуют с содержимым индексного файла (это часто происходит при многопользовательской работе). Дело в том, что ранние версии dBase, FoxPro, Clipper работали с неподдерживаемыми индексами, то есть индексные файлы не обновлялись одновременно с таблицей, и для их синхронизации требовалось выполнять специальные операции. Но соответствующие средства разработки, применявшиеся в то время, обычно не поддерживали никаких аналогов транзакций - записи чаще всего вставлялись по одной.
В случае применения старых версий формата FoxPro следует избегать кэширования при выполнении дисковых операций с файловым сервером, содержащим базу данных FoxPro. Кроме того, следует проверить и, если необходимо, изменить в настройках BDE параметры MINBUFSIZE, MAXBUFSIZE, LOCAL SHARE - возможно, проблема заключается в недостаточной величине буферов BDE для кэширования данных или в одновременном доступе к данным приложений, использующих и не использующих BDE.
Еще одним из способов решения этой проблемы (самым радикальным) является замена FoxPro на какую-нибудь из серверных СУБД. Например, InterBase неплохо справляется с одновременным вводом большого количества записей благодаря некоторым специфическим особенностям архитектуры этого сервера.
Author: Наталия Елманова
Source: Взято из http://forum.sources.ru
ID: 02572
Category:Базы данных
Category:FoxPro
Access to table disabled because of previous error. Read failure.

=== Access to table disabled because of previous error. Read failure. ===
При добавлении новых записей с помощью метода TTable.AppendRecord в индексированную таблицу FoxPro через какое-то время (то есть при одновременном добавлении большого количества записей) возникает ошибка:
"Access to table disabled because of previous error. Read failure. File <имя_файла.cdx>".
Возможно, причина заключается в том, что операции чтения-записи в файл, содержащий таблицу FoxPro, особенно при использовании кэширования, предоставляемого операционной системой, конфликтуют с содержимым индексного файла (это часто происходит при многопользовательской работе). Дело в том, что ранние версии dBase, FoxPro, Clipper работали с неподдерживаемыми индексами, то есть индексные файлы не обновлялись одновременно с таблицей, и для их синхронизации требовалось выполнять специальные операции. Но соответствующие средства разработки, применявшиеся в то время, обычно не поддерживали никаких аналогов транзакций - записи чаще всего вставлялись по одной.
В случае применения старых версий формата FoxPro следует избегать кэширования при выполнении дисковых операций с файловым сервером, содержащим базу данных FoxPro. Кроме того, следует проверить и, если необходимо, изменить в настройках BDE параметры MINBUFSIZE, MAXBUFSIZE, LOCAL SHARE - возможно, проблема заключается в недостаточной величине буферов BDE для кэширования данных или в одновременном доступе к данным приложений, использующих и не использующих BDE.
Еще одним из способов решения этой проблемы (самым радикальным) является замена FoxPro на какую-нибудь из серверных СУБД. Например, InterBase неплохо справляется с одновременным вводом большого количества записей благодаря некоторым специфическим особенностям архитектуры этого сервера.
Author: Наталия Елманова
Source: Взято из http://forum.sources.ru
ID: 02572
Category:Базы данных
Category:FoxPro
ActiveControl имеет DataSet

=== ActiveControl имеет DataSet ===
Для успешного кодирования необходимо включить typinfo в список используемых модулей. Код данного примера инвертирует логическое свойство Active набора данных, связанного с активным элементом управления при каждом нажатии пользователем клавиши ESC.
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
var
 PropInfo: PPropInfo;
 PropValue: TObject;
 ds: TDataSource;
begin
 if Key = VK_ESCAPE then
 { Основной код ниже }
 try
 ds := nil;
 { Проверяем, имеет ли компонент свойство DataSource }
 PropInfo := GetPropInfo(ActiveControl.ClassInfo, 'DataSource');
 if PropInfo <> nil then
 { Свойство компонента datasource типа class (например, TDataSource) }
 if PropInfo^.PropType^.Kind = tkClass then
 begin
 PropValue := TObject(GetOrdProp(ActiveControl, PropInfo));
 { Создаем слепок найденного TDataSource }
 ds := (PropValue as DB.TDataSource);
 { Используем dataset, связанный с datasource }
 if not (ds.DataSet.State in dsEditModes) then
 ds.DataSet.Active := not ds.DataSet.Active;
 end;
 except
 on E: EInvalidCast do
 ShowMessage('Ошибка. Ожидался DataSource');
 end;
end;
Author: OAmiry (Borland)
Source: http://delphiworld.narod.ru/
ID: 03092
Category:Базы данных
Advanced Draw

Кручу-верчу, обмануть хочу, или как использовать продвинутые методы вывода спрайтов. В классе TSprite есть три метода: DoDraw, DoCollision и DoMove Чтобы заставить спрайт созданный таким образом:
TPlayer = class(TImageSprite)
end;
выводится через продвинутые методы (DrawRotate, DrawAplha, DrawSub, DrawWave, StretchDraw), нужно "заглушить" стандартный вывод при создании объекта. Вот так:
type
 THero = class(TImageSprite)
 protected
 procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
 procedure DoMove(MoveCount: Integer); override;
 procedure DoDraw; override; // вот здесь
 public
 Angle: Integer;
 end;
Теперь в процедуре DoDraw выводим спрайт нужным нам способом. Вот так:
procedure THero.DoDraw;
begin
 Image.DrawRotate(Form1.DXDraw.Surface,
 Round(x)+16, Round(y)+16,
 Image.Width, Image.Height,
 Round(animpos), 0.5, 0.5, Angle);
end;
Посмотрите этот dodraw.zip примерчик, для более ясного понимания. А теперь недокументированная фишка! Забываем то, что написано выше и читаем дальше. Cоздадим спрайт таким образом:
TPlayer = class(TImageSpriteEx)
protected
 procedure DoMove(MoveCount: Integer); override;
end;
И теперь в процедуре DoMove можно задать Angle (угол поворота спрайта) и Alpha (прозрачность спрайта). Примерно так:
type
 THero = class(TImageSpriteEx)
 protected
 procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
 procedure DoMove(MoveCount: Integer); override;
 public
 Angle: Integer;
 end;
procedure TPlayer.DoMove(MoveCount: Integer);
begin
 X := 100;
 Y := 100;
 Angle := 60;
 Alpha := 150;
end;
Author: Daddy
Source: http://daddy.mirgames.ru
ID: 03923
Category:Графика
Category:DirectX
Alexa Rank, Google PR, Yandex тИЦ.

Данный программный класс, в результате своей работы, получает текущие индексы страницы с трех самых популярных ресурсов.
Это, прежде всего, Текущий Индекс Цитирования, т.н. Yandex тИЦ, Alexa Rank и соответственно Google Page Rank.
По поводу первых двух ничего сложного нет, выполняется обычный запрос с указанием страницы и разбор вернувшегося XML документа. А вот с Google Page Rank пришлось повозиться.
Google Toolbar при запросе использует контрольную сумму, которая рассчитывается на основании имени ресурса. Сделано это естественно с целью, чтобы вот такие компоненты, как FWPageRank не появилялись в сети и получать значение Google PR можно было только при помощи Google Toolbar.
Но... как говориться, на каждую хитрую... ну вы и сами дальше знаете :)
Польуйтесь :) 
Скачать демонстрационный пример
Author: Александр (Rouse_) Багель
Source: http://rouse.drkb.ru
ID: 03590
Category:Связь
Category:Web
Array of Byte → TMemoryStream

=== Array of Byte --> TMemoryStream ===
procedure TForm1.Button2Click(Sender: TObject);
const
 Start = 49;
 AnEnd = 57;
 ArLen = AnEnd - Start + 1;
var
 M: TMemoryStream;
 Buff: array of Byte;
 I: Integer;
begin
 SetLength(Buff, ArLen);
 for I := 0 to ArLen - 1 do
 Buff[I] := Start + I;
 M := TMemoryStream.Create;
 try
 M.Write(Buff[0], ArLen);
 M.SaveToFile('c:\test.txt'); 
 finally
 M.Free;
 end;
end;
123456789
Author: s-mike 
ID: 00252
Array → String

=== Array --> String ===
function ArrayToStr(str: TStrings; r: string): string;
var
 i: integer;
begin
 Result:=;
 if str = nil then
 Exit;
 for i := 0 to Str.Count-1 do
 Result := Result + Str.Strings[i] + r;
end;
Source: http://delphiworld.narod.ru
ID: 00797
Ascii → String

=== Ascii --> String ===
{ **** UBPFD *********** by delphibase.endimus.com ****
>> Преобразование набора чисел, предопределённых символом "#" в строку
Функция преобразует набор чисел, предопределённых символом "#" в
соответствующую строку. Каждое число в наборе чисел должно представлять из
себя код символа по ASCII таблице.
Например, если AsciiString '#72#101#108#108#111', то Result = 'Hello';
Зависимости: sysutils, system
Copyright: VID
Дата: 26 апреля 2002 г.
***************************************************** }
function ASCIIToStr(AsciiString: string): string;
var
 I, X, L, Lastpos: Integer;
 CurDIGChar, CurrAddChar, RS: string;
begin
 RESULT := ;
 L := Length(AsciiString);
 if L = 0 then
 Exit;
 X := 0;
 LASTPOS := 1;
 repeat
 I := X;
 CurDIGChar := ;
 repeat
 I := I + 1;
 if AsciiString[I] <> '#' then
 CurDIGChar := CurDIGChar + AsciiString[I];
 until (AsciiString[I] = '#') or (i = l);
 X := I;
 if CurDIGChar <> then
 begin
 try
 CurrAddChar := Chr(StrToInt(CurDIGChar));
 except
 CurrAddChar := ;
 end;
 Insert(CurrAddChar, RS, lastpos);
 LastPos := LastPos + Length(CurrAddChar);
 end;
 until (X >= L) or (I >= L);
 Result := RS;
end;
Author: VID
Source: delphibase.endimus.com
ID: 00918