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