Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Процедура имеющая параметр разного типа


Автор: Vetos 21.3.2008, 18:58
Допустим есть процедура Add, но мне нужно чтобы в нее можно было передать разные переменные, к примеру
Код

x:PGLPoint;
y:PGLLine;
...
Scene.Add(x);
Scene.Add(y);


У меня почемуто в таком коде ошибка
Код

    TGLScene=class
     Camera : PGLCamera;
     procedure Add(Obj:PGLObject) overload;
     procedure Delete(Obj:PGLObject);
     procedure Add(Point:PGLPoint) overload;           <<На этой строчке
     procedure Delete(Point:PGLPoint);
     procedure Add(Line:PGLLine);
     procedure Delete(Line:PGLLine);
     procedure DrawScene;
    private
     SceneObject:TGLSceneObject;
    end;

[Error] GLInclude.pas(81): Overloaded procedure 'Add' must be marked with the 'overload' directive
Ничего не получается, помогите!!!!!


Автор: MetalFan 21.3.2008, 19:05
ну так тебеж написали... а третью процедуру кто оверложивать будет?
Цитата(Vetos @  21.3.2008,  18:58 Найти цитируемый пост)
procedure Add(Line:PGLLine);


Автор: bems 21.3.2008, 19:05
1) перед overload нужна точка с запятой
2) ты уверен что по этим типам аргументов можно определить нужную процедуру?

Автор: MetalFan 21.3.2008, 19:06
и в догонку - "оверложеные" фуникции принято писать подряд... для наглядности. хотя конечно кому как

Автор: Vetos 21.3.2008, 19:10
Спасибо)

Добавлено через 6 минут и 22 секунды
Ага, вот уже и ошибочка вылезает.

Цитата

2) ты уверен что по этим типам аргументов можно определить нужную процедуру?


Чото не определяет, это никак нельзя исправить?
 

Автор: 4d5a 23.3.2008, 11:33
можно сделать одну процедуру, передавать ей аргумент типа класса базавого для всех (GLObject, GLPoint, GLLine), или просто поинтер. Разбираться к какому именно классу принадлежит аргумент уже внутри процедуры, или явно еще флаг, сообщающий о непосредственном типе передовать в процедуру.

если я правильно предполагаю 1) PGLObject=^GLObject 2) GLLine и GLPoint наследники GLObject, то
можно типа :

//Obj передается как PGLObject
  if (Obj^.ClassName='GLLine') then 
    Add_glLine(Obj) ;

Автор: bems 24.3.2008, 16:16
для начала откажись от указателей. Но эффект это даст только в тех случаях когда компилятор точно знает какой класс передается в функцию.

Автор: Vetos 24.3.2008, 23:38
Я нашел решение проблемы)))
Мне нужны были указатели, но так как указатели в перераспределении(overload) не распознаются, хотел распознать внутри процедуры.
Но как оказалось такой фишки нету(
Теперь я понял как еще можно получить указатель smile 

Теперь я просто создаю процедуры overload, с параметром переменной и уже внутри нее получаю указатель:
Код

     procedure Add(var Obj:TGLObject);overload;
     procedure Add(var Point:TGLPoint);overload;
     procedure Add(var Line:TGLLine);overload;
...

procedure TGLScene.Add(var Obj:TGLObject);
var PObj:PGLObject;
begin
PObj:=@Obj;
...
end;

procedure TGLScene.Add(var Point:TGLPoint);
var PPoint:PGLPoint;
begin
PPoint:=@Point;
...
end;

procedure TGLScene.Add(var Line:TGLLine);
var PLine:PGLLine;
begin
PLine:=@Line;
...
end;



Таким способом все работает на ура smile 

Спасибо большое всем кто участвовал)

Автор: Beltar 25.3.2008, 08:53
Тем не менее лучше использовать классы, их во-первых легко различать по свойству ClassName, не надо писать var в описании подпрограмм. Кроме того все создание их экземпляров Create и Free, а со структурами будет запара со всеми этими New.

Автор: Alix 25.3.2008, 10:00
Ребят, да какие классы для OGL??? Зачем такой геморрой и неоптимизированность с точки зрения производительности. Vetos нашел нормальный способ.

Автор: Beltar 25.3.2008, 11:17
Ой не знаю, PLine:=@Line; вроде как избыточно, указатель передается в ф-ию, а потом вычисляется еще раз.

Чем экземпляр класса отличается от структуры, кроме того, что структура передается по значению, а класс всегда по ссылке?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)