KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Программирование » Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001

Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Валентин Озеров, "Советы по Delphi. Версия 1.4.3 от 1.1.2001" бесплатно, без регистрации.
Перейти на страницу:

end;

out^ := #0;

Если вместо этого вы хотите заменить каждую пару CR-LF или отдельный CR или LF единичным пробелом, попробуйте это:

out, inn: PChar;

out := ваш буфер;

inn := out;

while in^ <> #0 do begin

 if (in^ = #10) then begin

 end

 else if (in^ = #13) then begin

  if (in+1)^

Если вместо этого вы хотите заменить каждую пару CR-LF или отдельный CR или LF единичным пробелом, попробуйте это:

out, inn: PChar;

out := buf;

inn := out;

while inn^ <> #0 do begin

 if (inn^ = #10) or ((inn^ = #13) and ((inn+1)^ <> #10)) then begin

  out^ := ' ';

  Inc(out);

 end

 else if (inn^ = #13) then

 { только CR, игнорируем }

 else begin

  out^ := inn^;

  Inc(out);

 end;

 Inc(inn);

end;

out^ := #0;

{ буфер теперь закрыт }

Непроверенное: эффект уменьшения размера (путем установки терминатора #0) этого PChar позволит уменьшить время компиляции массивов и буферов GetMem, что же будет при использовании StrAlloc/StrDispose?

Вот конечный код после учета всех мелочей! Например, нам, в конечном счете, нужно сообщить указателю о необходимости возвратиться к началу своей новой строки.

procedure TForm1.RemoveSpaces(var InBuf: PChar; Size: Word);

var

 Input, OutPut, Orig: PChar;

begin

 GetMem(Output, Size);

 input := Inbuf;

 Orig := Output;

 while input^ <> #0 do begin

  if (input^ <> #10) and (input^ <> #13) then begin

output^ := input^;

   inc(output);

  end;

  inc(input);

 end;

 Output^ := #0;

 Output := Orig;

 InBuf := Output;

end;

Я все еще немало удивлен тому как работает GetData! Я все еще не хочу использовать TMemo! Если кто-то может решить эту проблему, я буду очень рад! Пока же я готовлю для вас материал, включающий новые процедуры печати! Наведем порядок в беспорядке! Я уже имею реализацию вывода текста с любым шрифтом и в любой позиции, выраженной в дюймах, и это только начало! Но что я думаю действительно классно вышло, так это диманическая сетка! Вы можете создавать сетку с любым количеством строк и колонок. Назначьте текст и ячейку, установите горизонтальное и вертикальное выравнивание, выберите стиль границы для каждой ячейки и изучите множество других способов манипулирования и печати сетки!

Функция, возвращающая тип

Delphi 1

Вы можете сделать это в C++. В ObjectPascal это также можно сделать, смотрите пример:

// функция Chameleon, возвращающая тип сгенерированного исключения

unit Unit1;


interface


uses

 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,StdCtrls;


type

 MyBoolean = class

 public

  Value : boolean;

 end;


 MyInteger = class

 public

  Value : integer;

 end;


 MyClass = class

 public

  Value : TStrings;

 end;


 TForm1 = class(TForm)

  Button1: TButton;

  procedure Button1Click(Sender: TObject);

 private { Private declarations }

 public { Public declarations }

  procedure MyProc;

  function Chameleon : boolean;

 end;


var

 Form1: TForm1;


implementation


{$R *.DFM}


function TForm1.Chameleon : boolean;

var

 b : MyBoolean;

 i : MyInteger;

 c : MyClass;

 r : integer;

begin

 r := Random(3);

 case r of

 0 : begin

  b := MyBoolean.Create;

  raise b;

 end;

 1 : begin

  i := MyInteger.Create;

  raise i;

 end;

 2 : begin

  c := MyClass.Create;

  raise c;

 end;

 end;

end;


procedure TForm1.MyProc;

begin


 try

  Chameleon;

 excepton MyBoolean do ShowMessage('Функция возвратила класс MyBoolean');

 on MyInteger do ShowMessage('Функция возвратила класс MyInteger');

 on MyClass do ShowMessage('Функция возвратила класс MyClass');

 end;

end;


procedure TForm1.Button1Click(Sender: TObject);

begin

 Chameleon;

end;


end.

Взгляните на тип данных Variant в D2: следующий код

function AnyType(const TypeParm: integer): Variant;

begin


 case TypeParm of

1: Result := 1;

 2: Result := 2.0;

 3: Result := 'Три';

 4: Result := StrToDate('4/4/1944');

 end;

end;

абсолютно бестолковый, но полностью корректный!

Следующий код содержит объявление трех функций, принимающих на входе один и тот же параметр, но выдающих результаты различных типов (результат физичиски один и тот же, и занимает он 4 байта). Я не думаю, что можно одурачить delphi, чтобы с помощью этого метода возвратить строку. Это может привести к разрушению менеджера кучи. Вместо этого вызывайте необходимую вам функцию. Каждый вызов передается MyFuncRetAnything, а P1 определяет возвращаемый тип. Если хотите, можете написать другую обертку, делающую для вас еще и приведение типов.

3 вызова, 1 код.

Я понимаю, что это в действительности не то, что нужно, по я просто хотел продемонстрировать другой способ. (вы можете возвращать строки как тип PChar, который также занимает 4 байта). Вы должны использовать некоторую память, распределяемую вызовом процедуры (может быть передавать результаты как P2?).

{моя форма имеет 3 метки, одну кнопку и этот код}


var

 MyFuncRetInt : Function(P1, P2 : Integer) : Integer;

 MyFuncRetBool : Function (P1, P2 : Integer) : LongBool;

 MyFuncRetPointer : Function (P1, P2 : Integer) : Pointer;

 function MyFuncRetAnything (P1, P2 : Integer) : Integer;

var

 RetPointer : Pointer;

 RetBool : LongBool;

 RetInteger : Integer;

begin

 RetPointer := nil;

 RetBool := False;

 RetInteger := 4711;

 case P1 of

1 : Result := Integer (RetPointer);

 2 : Result := Integer (RetBool);

 3 : Result := RetInteger;

 end;

end;


procedure TForm1.Button1Click(Sender: TObject);

begin

 if MyFuncRetBool (2, 1900) then Label1.Caption := 'True'

 else Label1.Caption := 'False';

 Label2.Caption := IntToStr(MyFuncRetInt(3, 1900));

 Label3.Caption := IntToHex(Integer(MyFuncRetPointer(1, 1900)), 16);

end;


initialization

 MyFuncRetInt := @MyFuncRetAnything;

 MyFuncRetBool := @MyFuncRetAnything;

 MyFuncRetPointer := @MyFuncRetAnything;

end

Преобразование формата MS BINARY в IEEE

Delphi 1

«Использование, независимое от машинного уровня» не так просто в реализации с процессорами, выпущенными до Intel-го математического сопроцессора 80x87. Я не уверен в том, что процессоры 80x86 имели какие-либо родные инструкции для выполнения операций с плавающей точкой. По-видимости, поэтому Microsoft создал свой собственный формат для чисел с плавающей точкой; он сам осуществлял всю арифметику с помощью библиотеки времени выполнения. Сегодня 80x87 осуществляет такую арифметику автоматически, и IEEE теперь стандарт.

Delphi хранит следующие типы чисел с плавающей точкой в формате IEEE:

Single 4 байт Double 8 байт Extended 10 байт

Обратите внимание на то, что тип Real (6 байт) отсутствует в данном списке. Я могу ошибаться, но мне кажется что тип Real – синтезированный в Pascal тип; он может без особых проблем существовать на процессорах ниже 80x87.

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*