Как получить размер SizeOf для Object?..

alekcvp
Дата: 13.11.2019 14:57:19
Понадобилось тут описать несколько похожих структур данных, типа вариативных записей но посложнее, например:
type
  TBase = packed record
    ID: Cardinal;
    Size: Integer;
  end;

  TBaseText = packed record
    ID: Cardinal;
    Size: Integer;
    PropID: Word;
    Value: array [0..31] of Char;
  end;

  TBaseID = packed record
    ID: Cardinal;
    Size: Integer;
    Value: UInt64;  
  end;

Суть в том, что активно они активно используются, например так (это удобно, если потом записи меняются):
Write(TBaseIDVar, SizeOf(TBaseIDVar))

Так вот, была мысль сделать через object:
type
  TBase = packed object
    ID: Cardinal;
    Size: Integer;
  end;

  TBaseText = packed object(TBase)
    PropID: Word;
    Value: array [0..31] of Char;
  end;

Но проблема в том, что SizeOf(TBaseText) = SizeOf(Pointer), хотя object вроде не в куче хранится по-умолчанию?
И как теперь можно адекватно получить размер данных нужного объекта для записи его в поток?
Dimitry Sibiryakov
Дата: 13.11.2019 14:58:30

alekcvp
И как теперь можно адекватно получить размер данных нужного объекта для записи его в поток?

RTFM InstanceSize.

Posted via ActualForum NNTP Server 1.5

alekcvp
Дата: 13.11.2019 15:13:38
Dimitry Sibiryakov

alekcvp
И как теперь можно адекватно получить размер данных нужного объекта для записи его в поток?

RTFM InstanceSize.

Я даже жирненьким выделил: object, не class. InstanceSize - это метод TObject, у объектного типа его нет.
wadman
Дата: 13.11.2019 15:21:00
alekcvp
Dimitry Sibiryakov

пропущено...

RTFM InstanceSize.

Я даже жирненьким выделил: object, не class. InstanceSize - это метод TObject, у объектного типа его нет.

Хочешь нечто такое, что считает все свойства, в т.ч. и те, которые сами могут быть объектами или даже ссылками на объекты?
wadman
Дата: 13.11.2019 15:21:32
wadman
ссылками на объекты

Имею в виду списки.
alekcvp
Дата: 13.11.2019 15:21:40
Как выяснилось оно всё-таки работает, но только в рантайм.

Через уловку с const их размер отображается неправильно.
alekcvp
Дата: 13.11.2019 15:22:50
wadman
Хочешь нечто такое, что считает все свойства, в т.ч. и те, которые сами могут быть объектами или даже ссылками на объекты?

Нет, разумеется, только размер самого объекта (как записи). Но см. выше, проблема была в редакторе, а не в компиляторе.
Kazantsev Alexey
Дата: 13.11.2019 15:28:30
alekcvp
Но проблема в том, что SizeOf(TBaseText) = SizeOf(Pointer)

Это на какой версии у тебя такая проблема? Проверил на 10.3, размер показывает адекватный.
alekcvp
Дата: 13.11.2019 15:56:37
Kazantsev Alexey
alekcvp
Но проблема в том, что SizeOf(TBaseText) = SizeOf(Pointer)

Это на какой версии у тебя такая проблема? Проверил на 10.3, размер показывает адекватный.

Я просто чтобы размер записей смотреть без компиляции делал так:
const
  OBJ_SIZE = SizeOf(SomeTipe);

После этого наводишь мышку на OBJ_SIZE и видно размер. С record работает, а для object всегда 4 показывает (D10.3). Но при выполнении приложения нормально всё.
Kazantsev Alexey
Дата: 13.11.2019 16:07:41
alekcvp,

Ясно. Ох уж этот кодинсайт...