Рейтинговые книги
Читем онлайн Советы по Delphi. Версия 1.4.3 от 1.1.2001 - Валентин Озеров

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 11 12 13 14 15 16 17 18 19 ... 123

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.

1 ... 11 12 13 14 15 16 17 18 19 ... 123
На этой странице вы можете бесплатно читать книгу Советы по Delphi. Версия 1.4.3 от 1.1.2001 - Валентин Озеров бесплатно.

Оставить комментарий