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

стр.

>

> 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 :