Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Процедура имеющая параметр разного типа 
:(
    Опции темы
Vetos
Дата 21.3.2008, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 4.4.2005

Репутация: 1
Всего: 4



Допустим есть процедура 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
Ничего не получается, помогите!!!!!



Это сообщение отредактировал(а) Vetos - 21.3.2008, 18:58


--------------------
Строить нужно так, чтоб никто не сломал!
А ломать, чтоб никто не знал 8) :ne_huliganit 
PM MAIL ICQ   Вверх
MetalFan
Дата 21.3.2008, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



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




--------------------
There are always someone smarter than you...
PM MAIL   Вверх
bems
Дата 21.3.2008, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



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


--------------------
Обижено школьников: 8
PM MAIL   Вверх
MetalFan
Дата 21.3.2008, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 22
Всего: 128



и в догонку - "оверложеные" фуникции принято писать подряд... для наглядности. хотя конечно кому как


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Vetos
Дата 21.3.2008, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 4.4.2005

Репутация: 1
Всего: 4



Спасибо)

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

Цитата

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


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


--------------------
Строить нужно так, чтоб никто не сломал!
А ломать, чтоб никто не знал 8) :ne_huliganit 
PM MAIL ICQ   Вверх
4d5a
Дата 23.3.2008, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 10.6.2007

Репутация: нет
Всего: 1



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

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

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


Это сообщение отредактировал(а) 4d5a - 23.3.2008, 11:42
PM MAIL   Вверх
bems
Дата 24.3.2008, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



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


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Vetos
Дата 24.3.2008, 23:38 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 4.4.2005

Репутация: 1
Всего: 4



Я нашел решение проблемы)))
Мне нужны были указатели, но так как указатели в перераспределении(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 

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


--------------------
Строить нужно так, чтоб никто не сломал!
А ломать, чтоб никто не знал 8) :ne_huliganit 
PM MAIL ICQ   Вверх
Beltar
Дата 25.3.2008, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 0
Всего: 7



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


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
Alix
Дата 25.3.2008, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

Репутация: 8
Всего: 23



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


--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
Beltar
Дата 25.3.2008, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 0
Всего: 7



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

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


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0834 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.