powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как получить размер SizeOf для Object?..
16 сообщений из 16, страница 1 из 1
Как получить размер SizeOf для Object?..
    #39888655
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Понадобилось тут описать несколько похожих структур данных, типа вариативных записей но посложнее, например:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
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;


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


Так вот, была мысль сделать через object :
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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 вроде не в куче хранится по-умолчанию?
И как теперь можно адекватно получить размер данных нужного объекта для записи его в поток?
...
Рейтинг: 0 / 0
Как получить размер SizeOf для Object?..
    #39888657
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpИ как теперь можно адекватно получить размер данных нужного объекта для записи его в поток?

RTFM InstanceSize.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как получить размер SizeOf для Object?..
    #39888673
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

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

RTFM InstanceSize.

Я даже жирненьким выделил: object , не class. InstanceSize - это метод T Object, у объектного типа его нет.
...
Рейтинг: 0 / 0
Как получить размер SizeOf для Object?..
    #39888681
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
Dimitry Sibiryakov

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

RTFM InstanceSize.

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

Хочешь нечто такое, что считает все свойства, в т.ч. и те, которые сами могут быть объектами или даже ссылками на объекты?
...
Рейтинг: 0 / 0
Как получить размер SizeOf для Object?..
    #39888682
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman
ссылками на объекты

Имею в виду списки.
...
Рейтинг: 0 / 0
Как получить размер SizeOf для Object?..
    #39888683
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как выяснилось оно всё-таки работает, но только в рантайм.

Через уловку с const их размер отображается неправильно.
...
Рейтинг: 0 / 0
Как получить размер SizeOf для Object?..
    #39888686
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman
Хочешь нечто такое, что считает все свойства, в т.ч. и те, которые сами могут быть объектами или даже ссылками на объекты?

Нет, разумеется, только размер самого объекта (как записи). Но см. выше, проблема была в редакторе, а не в компиляторе.
...
Рейтинг: 0 / 0
Как получить размер SizeOf для Object?..
    #39888691
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
Но проблема в том, что SizeOf(TBaseText) = SizeOf(Pointer)

Это на какой версии у тебя такая проблема? Проверил на 10.3, размер показывает адекватный.
...
Рейтинг: 0 / 0
Как получить размер SizeOf для Object?..
    #39888713
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey
alekcvp
Но проблема в том, что SizeOf(TBaseText) = SizeOf(Pointer)

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

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


После этого наводишь мышку на OBJ_SIZE и видно размер. С record работает, а для object всегда 4 показывает (D10.3). Но при выполнении приложения нормально всё.
...
Рейтинг: 0 / 0
Как получить размер SizeOf для Object?..
    #39888723
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

Ясно. Ох уж этот кодинсайт...
...
Рейтинг: 0 / 0
Как получить размер SizeOf для Object?..
    #39889051
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зачем использовать object?
...
Рейтинг: 0 / 0
Как получить размер SizeOf для Object?..
    #39889056
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
14.11.2019 13:22, Квейд пишет:
> зачем использовать object?

стильно, модно, молодёжно! (С)

зы: за любую новую хрень первым делом хватаются школьники.
как обезьяны, йопт.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как получить размер SizeOf для Object?..
    #39889082
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Квейд
зачем использовать object?

Статика + наследование, иногда удобно.

Мимопроходящий,

Она была новой во времена Turbo Pascal 5-6.
...
Рейтинг: 0 / 0
Как получить размер SizeOf для Object?..
    #39889094
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
14.11.2019 13:48, Kazantsev Alexey пишет:
> Она была новой во времена Turbo Pascal 5-6.

сам объект в 5.5 появился.
но речь то не об этом.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как получить размер SizeOf для Object?..
    #39889251
swame2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alekcvp,

Я бы сделал TBase полем в остальных записях типа
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  TBase = packed record
    ID: Cardinal;
    Size: Integer;
  end;

  TBaseText = packed record
    Base: TBase;
    PropID: Word;
    Value: array [0..31] of Char;
  end;


Тогда в записях можно компоновать произвольные повторяющиеся куски.
Тогда packed в TBase тогда смысла не имеет, типы Cardinal, Integer не сожмутся, а скорость доступа уменьшится
...
Рейтинг: 0 / 0
Как получить размер SizeOf для Object?..
    #39889265
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Квейд,

У вас есть запись, в ней есть поля и методы, облегчающие работу с этими полями.
Запись сохраняется в поток и/или передаётся по сети целиком, как я показывал выше.

Теперь вам надо сделать ещё несколько записей, расширяющих эту. Все методы в каждой отдельной записи дублировать? А если потом я захочу исходную запись изменить - вручную изменять все остальные и все методы в них?.. Неудобно.
Object решает все эти проблемы.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как получить размер SizeOf для Object?..
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]