Советы по Delphi. Версия 1.4.3 от 1.1.2001 - страница 22

стр.

>{ 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оде бы) указанием типа 

>const Wko: double = 0.9;

правда, теперь это уже не совсем константа… 

Значение вычисляемого поля Paradox вместо 25.55 становится 24.5499999…