Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.11.2007, 09:37   #11
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию Вывод (1)

Во первых, правило

Цитата:
integer = 4 байта
real = 8 байт
string = 4 байта (как указатель)
Итого: 4+4+8=16 байт.
не верно. Компилятор производит оптимизацию и при выделении памяти округляет до 4. Поэтому

TMyClass = class
end;

весит 4 быйта

А

TMyClass = class
f1: Byte;
end;

уже 8.

Во вторых, не в этом суть вопроса. Вот указатель на string весит 4 байта, а мне еще нужен и размер самого массива, буть он неладен. А для этого мне нужно знать, что такое-то поле является ссылкой на массив или запись или объект.

Короче, я решил обязать всех программистов реализовать в своих классах мотод записи данных об объекте в определенный формат. В общем - это хоть и х..ое (сори) плохое, но решение.

А дело было так. Захотел я написать процедуру сохранения в файл объекта, хранящего данные о неком проекте. Но так, чтобы раз и на всегда. Но теперь понял, что моих знаний не хватит. И мне проще уболтать других программистов самим записывать данные, чем писать универсальный метод.
Хотя прошу заметить, что сделал я это не абы как. Рассказываю.

1. Создан класс хранящий данные об объекте в виде массива байт.

Код:
  TSibByteArrayObject = class
  private
    FOwner            : TSibByteFile;  // см. далее
    FObject           : TObject     ;  // указатель на системный объект
    FArrayByte        : TArrayByte  ;  // собственно массив байтов
    FCountByte        : Int64       ;  //  ну это их кол-во
    FPosition         : Int64       ; //  текущая позиция байта (используется при считывании)
    FNotSaveIdentifier: Integer     ; // идентификатор. Если = 0, то объект записывается, если <> 0, то нет (для объектов настройки среды).

    function GetOwner    : TSibByteFile;
    function GetObject   : TObject     ;
    function GetCountByte: Int64       ;
    function GetPosition : Int64;
    function GetByte (Index: Int64): Byte;

    procedure SetByte (Index: Int64; const AValue: Byte);
  protected
    constructor Create (AOwner: TSibByteFile; AObject: TObject);
    procedure Free;
    procedure Clear;

    function AddCount (ACount: Cardinal): Boolean;
  public
    function AddByte     (AValue: Byte    ): Boolean;
    function AddBoolean  (AValue: Boolean ): Boolean;
    function AddInt64    (AValue: Int64   ): Boolean;
    function AddExtended (AValue: Extended): Boolean;
    function AddCurrency (AValue: Currency): Boolean;
    function AddString   (AValue: String  ): Boolean;
    function AddObject   (AValue: TObject ): Boolean;

    function GiveByte    : Byte    ;
    function GiveBoolean : Boolean ;
    function GiveInt64   : Int64   ;
    function GiveExtended: Extended;
    function GiveCurrency: Currency;
    function GiveString  : String  ;
    function GiveObject  : TObject ;

    property Owner    : TSibByteFile read GetOwner    ;
    property SysObject: TObject      read GetObject   ;
    property CountByte: Int64        read GetCountByte;
    property Position : Int64        read GetPosition ;

    property Byte [Index: Int64]: Byte read GetByte write SetByte;
  end;
Sibedir вне форума Ответить с цитированием
Старый 16.11.2007, 09:38   #12
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

2. Создан класс хранящий объекты подлежащие сохранению.

Код:
  TSibByteFile = class
  private
    FName               : String         ;  // Имя файла
    FMessList           : TSibMessageList;  // Эт мое
    FCountObj           : Integer        ;  // Кол-во объектов
    FReasonReferenceFile: Integer        ;  // Причина обращения (rrfRead = 1; rrfWrite = 2; rrfReadWrite = 3;)
    FObjects: array of TSibByteArrayObject;  // список сохраняемых объектов

    function GetName               : String         ;
    function GetCountObject        : Integer        ;
    function GetReasonReferenceFile: Integer        ;
    function GetMessageList        : TSibMessageList;

    procedure SetMessageList (const AValue: TSibMessageList);
  protected
    constructor Create (AName: String; AReasonReferenceFile: Integer);
    procedure Free;

    function AddCountObj: Boolean;
  public
    procedure Clear;

    function Write: Boolean;  // Запись
    function Read: Boolean;  // Чтение

    procedure RegistrationNotSaveObject (AObject: TObject; AIdentifier: Integer); // Регистрация несохраняемого файла

    function AddObject (AObject: TObject): Cardinal;  // Добавить объект
    function GiveObject (ANumber: Cardinal): TObject;  // Получить объект

    property Name               : String          read GetName                                    ;
    property CountObject        : Integer         read GetCountObject                             ;
    property ReasonReferenceFile: Integer         read GetReasonReferenceFile                     ;
    property MessageList        : TSibMessageList read GetMessageList         write SetMessageList;
  end;
3. В любом классе, объекты которого нужно быдет сохранять, реализовать механизм с помощью перечисленных средств.

И самое главное, что это дает.

При загрузке объектов из памяти все указатели корректно обновляются.

Не знаю, может быть это уже кто-то реализовал, но в таких вещах я доверяю пока только себе. Правда работа еще не совсем доделана, но результаты имеются. Если интересно, как закончу отпишусь. Если хотите, могу посветить этому тему.


Ищю статьи:
"RTTI для чайников"
"Что такое RTTI и с чем его едят"
"Ламер и RTTI"
ну и т. п.

Последний раз редактировалось zetrix; 21.11.2007 в 06:28.
Sibedir вне форума Ответить с цитированием
Старый 21.11.2007, 06:17   #13
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
Стрелка

Этот вопрос я переформулировал и создал тему "Получение информации о классе".
Sibedir вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменить размер объекта Comment Васкинс Microsoft Office Excel 4 16.07.2008 14:11
Динамическое создание объекта ANGa Помощь студентам 3 10.04.2008 18:14
Как найти размер папки! vitalik007 Общие вопросы Delphi 6 02.02.2008 14:29
Принадлежность объекта по координатам Angel_CJ Помощь студентам 9 12.09.2007 18:43
Свойства объекта KBak Win Api 5 15.08.2007 20:21