Выбрать главу

type

 TForm1 = class(TForm)

  Button1: TButton;

  Memo1: TMemo;

  Button2: TButton;

  procedure Button1Click(Sender: TObject);

  procedure Button2Click(Sender: TObject);

  private { Private declarations }

  public { Public declarations }

 end;

type

 TMyRec = record

  MyArray: array [1..1000] of char;

  mystr: string;

 end;

var

 Form1: TForm1;

 MyRec : TMyRec;

 mylist : TStringlist;

 PMyChar : PChar;

 myfile : file;

 mb : TStream;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);

begin

 assignfile(myfile, 'c:\testblob.txt');

 rewrite(myfile,1);

 fillchar(MyRec.MyArray,sizeof(MyRec.MyArray),#0);

 pmychar:=@MyRec.MyArray;

 StrPCopy(pmychar,memo1.text);

 Blockwrite(MyFile,MyRec,SizeOf(MyRec));

 closefile(MyFile);

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

 assignfile(myfile, 'c:\testblob.txt');

 reset(myfile,1);

 fillchar(MyRec.MyArray, sizeof(MyRec.MyArray),#0);

 Blockread(MyFile, MyRec, SizeOf(MyRec));

 pmychar:=@MyRec.MyArray;

 Memo1.SetTextBuf(pmychar);

end;

end.

Освобождение записей

Delphi 1

Для начала необходимо привести объект к нужному типу, например, так:

var

  i: integer;

begin

 …

for

 i := 0 to MyList.Count - 1 do dispose(PMyRecord(MyList[i]));

 MyList.Free;

end;

или

begin

 for i := 0 to MyList.Count - 1 do dispose(PMyRecord(MyList.items[i]));

 MyList.Free;

end;

Items — свойство по умолчанию, поэтому вам нет необходимости определять это, хотя обратное не помешает.

Теперь можно заняться созданием работоспособной и полезной функцией. В форме:

var p : ^mystruct;

begin

 new(p);

 …

 dispose(p);

end;

операторы new() и dispose() в точности соответствуют процедурам getmem() и freemem(), за исключением того, что компилитор распределяет количество байт под размер структуры, на которую ссылается переменная-указатель. По этой причине указатель должен быть типизированным указателем, и следущий код неверен:

var

 p: pointer;

begin

 new(p);

end;

поскольку невозможно установить размер памяти, на которую должен ссылаться указатель. С другой стороны, если вы используете getmem() и freemem(), вы можете распределять байты для нетепизированного указателя, например:

var p : pointer;

begin

 getmem(p, 32767);

 …

 freemem(p, 32767);

end;

Строки 

StrTok для Delphi 2

Delphi 2

Я передалал это для работы в Delphi 2.0, код приведен ниже (эта функция первоначально была написана John Cooper 76356,3601 и модифицирована мной для адаптации под Delphi 2.0).

…вот этот код:

function StrTok(Phrase: Pchar; Delimeter: PChar): Pchar;

const

tokenPtr: PChar = nil;

 workPtr: PChar = nil;

var

delimPtr: Pchar;

begin

 if (Phrase <> nil) then workPtr := Phrase

 else workPtr := tokenPtr;

 if workPtr = nil then begin

 Result := nil;

  Exit;

 end;

 delimPtr := StrPos(workPtr, Delimeter);

 if (delimPtr <> nil) then

 begin

  delimPtr^ := Chr(0);

  tokenPtr := delimPtr + 1

 end else tokenPtr  := nil;

 Result := workPtr;

end;

– Ralph Friedman 

Как мне перекодировать строки из Win-кодировки в Dos-кодировку и наоборот?

Одной строкой

Как мне перекодировать строки из Win-кодировки в Dos-кодировку и наоборот?

Nomadic отвечает:

A: CharToOEM, OEMToChar, CharToOEMBuff, OEMToCharBuff. Заметьте однако, что эти функции не умеют делать таких, например, вещей, как koi8-r в DOS и т. п. 

Типы 

У меня константы могут иметь значение, отличное от заданного. Как лечить?

Nomadic советует:

DX.Bug: Const из другого unit'а дает неверное значение.

Симптоматика – 

Unit Main;

Interface

Uses VData;

Const Wko=0.9;

Unit VData;

…Implementation

Uses Main;

Procedure ...;

Begin

{ вот здесь Wko=...E+230 - наверное, бесконечность }

End;

Похоже, это действительно bug, причем ОСОБО ОПАСНЫЙ, т.к. может исказить результаты расчетов, не вызвав заметных нарушений работы программы.

В общем так. Эксперимент показал, что любая вещественная константа, определенная в интерфейсе модуля, может быть неверно (и не обязательно очень неверно – например, вместо 0.7 может появиться 0.115) прочитана в другом модуле. Баг особенно опасен тем, что он неустойчив и может пропадать и возникать без видимых причин (например, возникнуть, если предыдущая компиляция была неудачной и исчезнуть после использования константы в модуле, где она определена).

Лечится (вpоде бы) указанием типа