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


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

    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?

Автор: ivan219 22.3.2008, 11:27
Pointer не нужен.
Код

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

Код

PGLLine=^TGLLine;

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

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

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

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

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

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

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;




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

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

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