Советы по 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…