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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Тип Pointer 
:(
    Опции темы
Vetos
Дата 22.3.2008, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Существует несколько записей и класс, также существуют типы ссылки на эти типы:
Код

    PGLPoint=^TGLPoint;
    TGLPoint=record
    Position:TGLPosition;
    Size:Single;
    Color:TGLColor4f;
    end;
    PGLLine=^TGLLine;
    TGLLine=class(TGLObject)
    P1,P2:TGLPosition;
    Size:Single;
    Color:TGLColor4f;
    end;
    
    PGLObject=^TGLObject;
    TGLCube=class(TGLObject)
    procedure Show;override;
    end;

Картина примерна такая. Есть процедура с параметром типа Pointer, как определить на какой именно тип ссылается Obj:
Код

     procedure Add(Obj:Pointer);

Как проверить: указателем на какой тип является Obj?

Это сообщение отредактировал(а) Vetos - 22.3.2008, 11:12


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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 5
Всего: 12



Pointer не нужен.
Код

procedure Add(Obj: TObject);
begin
 if Obj is TGLLine then ....
 if Obj is TGLCube then ...
end;

Код

PGLLine=^TGLLine;

Не нужно так как:
Код

Obj: TGLLine;
 
это и есть указатель так что ты зделал указатель на указатель  smile 

Это сообщение отредактировал(а) ivan219 - 22.3.2008, 11:43
PM MAIL ICQ   Вверх
Vetos
Дата 22.3.2008, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Так ведь TGLLine не класс а просто запись, и мне нужно хранить в массивах именно указатели на сами переменные, а в массивы заганять их при помощи Add но не хочется писать отдельно для линии, точки, потомучто в дальнейшем таких объектов будет больше, и не хочется писать для каждого)
А указатель мне нужен для того чтобы я мог изменять поля переменной, а не заполнять опять массивы после каждого изменения.

Добавлено @ 13:06
Сорри, в первом посте я обшибся
Код

  TGLLine=record
  P1,P2:TGLPosition;
  Size:Single;
  Color:TGLColor4f;
  end;


Это сообщение отредактировал(а) Vetos - 22.3.2008, 13:08


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


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


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

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



первое, что в голову приходит - хранить первым полем тип записи.
ну и передавать указатель на нее. брать первый байт и определять, что за данные.
например:
Код

const
  C_RECTYPESTR : byte = 1;
  C_RECTYPEDWORD : byte = 2;
type
  PTypedRec = ^TTypedRec;
  TTypedRec = record
     type: byte;
  end;
  PTypedRecStr = ^TTypedRecStr;
  TTypedRecStr = record
    type: byte;
    str: string;
  end;
  TTypedRecDWORD = record
    type: byte;
    dwrd: DWORD;
  end;
...
  procedure ProcessRec( APRec: PTypedRec );
  begin
    case APRec^.type of
     C_RECTYPESTR : with PTypedRecStr(APRec)^ do ...;
     C_RECTYPEDWORD : with PTypedRecDWORD(APRec)^ do ...;
   end;
  end;
...
  procedure CallProcessRec;
  var
    lRecStr: TTypedRecStr;
    lRecDWORD: TTypedRecDWORD;
    lPRec: PTypedRec;
  begin
    lRecStr.type := C_RECTYPESTR;
    lRecStr.str := 'asdasdasd';
    ProcessRec( PTypedRec(@lRecStr));
    lRecDWORD.type := C_RECTYPEDWORD;
    lRecDWORD.dwrd := 123123;
    ProcessRec( PTypedRec(@lRecStr));
  end;




либо перейти на классы.


Это сообщение отредактировал(а) MetalFan - 22.3.2008, 14:31


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


Опытный
**


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

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



Вообщем то понятно, я тоже об этом думал.
Получается что такого как я хотел решения несуществует  smile 
Жаль, но за помощь спасибо!


--------------------
Строить нужно так, чтоб никто не сломал!
А ломать, чтоб никто не знал 8) :ne_huliganit 
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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