img
00:00
imgDRKB online - Функция, возвращающая тип
imgimgimg
  Общие вопросы
  Delphi IDE, компиллятор, отладчик, редактор
  Язык программирования Дельфи
  Общие вопросы
  Объектное ориентирование
  Работа со строками
  Работа с датами и временем
  Работа с числами
  Работа с битами
  Работа с массивами
  Работа с указателями, память
  Множества, записи и перечисляемые типы
  RTTI и другие трюки с информацией о классах, модулях и т.п.
  Взаимодействие с другими языками
  Threads
  Работа с коллекциями
  RTL Delphi (краткий справочник)
  Базовые классы
  Скрипты, компилляторы и связанные с ними вопросы
  Лекции по построению компилятора на Pascal
  Расчет введенной формулы
  Использование Microsoft ScriptControl (статья)
  Вокруг и около Паскаля или другие компилляторы Дельфи/Паскаль
  VCL
  Системные функции и WinAPI
  Базы данных
  Работа с файловой системой
  Репортинг, работа с принтером
  Работа с сетью, интернетом, протоколами
  Работа с графикой и мультимедиа
  Математика, алгоритмы
  Форматы файлов, данных. Конвертация форматов
  ActiveX, COM, DCOM, MIDAS, CORBA, интерфейсы, OLE, DDE
  Разработка приложений
  Kylix
  Delphi.Net
  Развлечения
  
  [drkb=74] Комментариев: 0 
Функция, возвращающая тип


delphi
// функция 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;
  except
    on 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: следующий код

delphi
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?).

delphi
{моя форма имеет 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.





@Drkb::00082

Взято с http://delphiworld.narod.ru
Количество статей: 4366
 
Вход
Имя:
Пароль:
Запомнить
Регистрация Забыли пароль?
Мини-чат :)
Необходима регистрация
Архив мини-чата
18-07-2019 11:26
kuzyara
drkb online должен жить!
долгих лет автору сайта!
03-07-2019 16:00
Programmer
Привет
19-06-2019 23:35
Eri
Всем привет!!
16-06-2019 20:14
Programmer
спустя 10 дней
06-06-2019 20:41
Programmer
Летоооо
23-04-2019 18:44
Programmer
уже конец апреля. Через март, карл!
19-03-2019 08:21
antonn
Быстро время летит smiley
18-03-2019 09:43
Programmer
ыы уже март
14-01-2019 19:13
Programmer
Аахахаха общаемся через время
14-01-2019 19:13
Programmer
Нет
Статистика
 СегодняВсего
Посетителей3022070257
Запросов22667319838208
Online
Пользователей0
Гостей17
imgimgimgimg
 
img
     00:00