Процедуры

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
trexxet
новенький
Сообщения: 31
Зарегистрирован: 25.03.2013 22:58:00
Откуда: Смоленск

Процедуры

Сообщение trexxet »

Имеется 2 процедуры

Код: Выделить всё

procedure CheckTB( Button: PRectTextButton; Down: boolean = False ); 
procedure CheckIB( Button: PRectImgButton; Down: boolean = False );

Их содержимое абсолютно одинаковое, различаются только типом аргумента
Можно ли объединить их в одну?
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Можно если типы PRectTextButton и PRectImgButton имеют общего предка и функционал предостовляемый этим предком достаточен для выполнения процедуры. получится чтото типа

Код: Выделить всё

procedure CheckB( Button: PRectAbstractButton; Down: boolean = False );
trexxet
новенький
Сообщения: 31
Зарегистрирован: 25.03.2013 22:58:00
Откуда: Смоленск

Сообщение trexxet »

Забыл написать про типы

Код: Выделить всё

  PRectTextButton = ^TRectTextButton;
  TRectTextButton = record
    Rect: zglTRect;
    Alpha: byte;
    Color: longword;
    Text: UTF8String;
    TextScale: single;
    TextColor: longword;
    OnClick: TOnClick;
  end;

  PRectImgButton = ^TRectImgButton;
  TRectImgButton = record
    Rect: zglTRect;
    Img: zglPTexture;
    OnClick: TOnClick;
  end;

Записи вроде не наследуются, а в классы переделывать не хочется. Перегрузка процедуры не будет глючить?

Код: Выделить всё

procedure CheckB( Button: PRectTextButton; Down: boolean = False ); overload;
procedure CheckB( Button: PRectImgButton; Down: boolean = False ); overload;
Аватара пользователя
VirtUX
энтузиаст
Сообщения: 880
Зарегистрирован: 05.02.2008 09:52:19
Откуда: Крым, Алушта

Сообщение VirtUX »

overload не обязателен. Работать будет. Параметры процедуры являются таким же идентификатором как и само название. Т.ч. разные параметры - это разные процедуры.
Аватара пользователя
hinst
энтузиаст
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Сообщение hinst »

сделай object'ы
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

>>Записи вроде не наследуются, а в классы переделывать не хочется. Перегрузка процедуры не будет глючить?
Записи не наследутся, но возможен "хак" - третий тип записи имеющий минимальное важное общее начало записей первого и второго типа - т.е. "скопипастить" наследование - некрасиво, требует приведения типов, но сработает если возможно выделить это "общее" достаточное для выполнения процедуры. В данном случае общего только Rect: zglTRect и OnClick: TOnClick; этого хватит? OnClick придется перекинуть вторым параметром

з.ы.
Вам не кажется что вы пытаетесь натянуть ООП принципы на не ООП данные?
Вообще делать ГУЙ не используя ООП - ненужная морока. и классы тут подойдут лучше обжектов, т.к. скорость и минимальность неважна
Mirage
энтузиаст
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia
Контактная информация:

Сообщение Mirage »

Если передается все равно указатель, то вариант с "абстрактной" записью с общими параметрами сработает и без приведения типов.
Однако, как раз для таких случаев и придумали дженерики.
SAK
постоялец
Сообщения: 158
Зарегистрирован: 17.02.2006 23:45:14
Откуда: Тим
Контактная информация:

Сообщение SAK »

Код: Выделить всё

TRectButton = object
    Rect: zglTRect;
    OnClick: TOnClick;
    procedure CheckB(Down: boolean = False);
  end;

PRectTextButton = ^TRectTextButton;
  TRectTextButton = object (TRectButton)
    Alpha: byte;
    Color: longword;
    Text: UTF8String;
    TextScale: single;
    TextColor: longword;
  end;

  PRectImgButton = ^TRectImgButton;
  TRectImgButton = object (TRectButton)
    Img: zglPTexture;
  end;

procedure TRectButton.CheckB(Down: boolean = False);
begin
   // ...................
end;

По способу выделения памяти объекты аналогичны записям, но при этом обладают возможностью наследования.
trexxet
новенький
Сообщения: 31
Зарегистрирован: 25.03.2013 22:58:00
Откуда: Смоленск

Сообщение trexxet »

Спасибо, переведу все на обжекты.
Ответить