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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> RecordToString 
V
    Опции темы
Ak47black
  Дата 20.5.2007, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Здраствуйте.
Подскажите пожалуйста.
Вообшем есть ComponentToString функция переводяшяя компонент в строку.
А у меня такая ситуация что мне нужно не компонент перевести в строку ,а структуру (Record).
Как мне-бы тут получше сделать?
Ну каждое значение то тупо переводить при том что структура очень большая.
И динамические массивы есть.
Пробовал к компоненту приклуплять и потом переводить, тоже неполучилось :|

Это сообщение отредактировал(а) Ak47black - 20.5.2007, 20:48
PM MAIL   Вверх
Alexeis
Дата 20.5.2007, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Ak47black, структура это просто проименованная облась памяти и больше ничего. В Run Time о ее содержимом ничего не известно, то ли дело объект с его RTTI. Вот для этого ее и придумали чтобы было легче жить smile .

P.S. Можно попробовать из структуры сделать объект. Объект ничем не хуже, разве что добавиться лишних 4 байта в конец, но думаю это ведь не критично, а так с ним можно делать все что с записью. Набахаешь ему пропитей в секции паблишд, глядишь RTTI появиться smile . Это все вроде работает начиная с TPersistent, а минимальный размер у него как и у TObject всего 4 байта. Snowy целую статью написал о TPersistent. Прикольная это вещь.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
skyboy
Дата 20.5.2007, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

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



а я бы создал два интерфейса ISerializeable(для перевода в строку) и IDeSerializeable - для обратного конвертирования из строки... smile
в любом случае, вместо записей стОит перейти к ООП-модели.
PM MAIL   Вверх
Alexeis
Дата 20.5.2007, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(skyboy @  20.5.2007,  23:05 Найти цитируемый пост)
а я бы создал два интерфейса ISerializeable(для перевода в строку) и IDeSerializeable - для обратного конвертирования из строки...


  Хм... а с каких пор интерфейсы что-то реализовывают? Как я читал интерфейс это всего лишь дополнительная таблица VMT у объекта. Реализуют все объекты. Что это за штука такая ISerializeable, расскажи подробнее  smile 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
skyboy
Дата 21.5.2007, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

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



Цитата(Alexeis @  20.5.2007,  22:19 Найти цитируемый пост)
Хм... а с каких пор интерфейсы что-то реализовывают?

не, ну как создал бы - так и реализовал бы в своих классах smile)) То есть это просто была незаконченная мысль: создать интерфейсы для того, чтоб потом повсеместно использовать уже унифицированную обработку объектов(по крайней мере - в своем коде). Это скорее к вопросу проектирования. Сорри, что смутил smile 

PM MAIL   Вверх
Ak47black
Дата 21.5.2007, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



При помоши TPersistent, то невыходит чтото.
Сделал минимальное тестовое приложение во код
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TTestRec = record
    TestStrArr: array of String;
  end;

  TSaveClass = class(TPersistent)
  public
    TestRec: TTestRec;
  end;

  TObjWriter = class(TWriter)
  end;  

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure WriteObj(obj: TPersistent; st: TStream);
begin
  with TObjWriter.Create(st, 64) do
  begin
    WriteProperties(obj);
    FlushBuffer; Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  FileStream: TFileStream;
  SaveClass: TSaveClass;
  i: Integer;
begin
  SaveClass:= TSaveClass.Create;
  SetLength(SaveClass.TestRec.TestStrArr,20);

  for i:=0 to 19 do
  begin
    SaveClass.TestRec.TestStrArr[i]:= 'Some Text.';
  end;

  FileStream:= TFileStream.Create('C:\save.sav',fmCreate or fmOpenWrite);
  WriteObj(SaveClass,FileStream);

  FileStream.Free;
end;

end.

И приклепляю заодно что-бы не копировать.
Посмотрите может чтото я нетак делаю ?
(Сохраняет 0 байт)

Это сообщение отредактировал(а) Ak47black - 21.5.2007, 15:02

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  SaveArray.rar 7,87 Kb
PM MAIL   Вверх
Snowy
Дата 21.5.2007, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



И правильно делает - сохраняются только published property
PM MAIL   Вверх
Ak47black
Дата 21.5.2007, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ну тогда если
Так 
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TTestRec = record
    TestStrArr: array of String;
  end;

  TSaveClass = class(TPersistent)
  public
    FTestRec: TTestRec;
  published
    property TestRec: TTestRec read FTestRec write FTestRec;
  end;

  TObjWriter = class(TWriter)
  end;  

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure WriteObj(obj: TPersistent; st: TStream);
begin
  with TObjWriter.Create(st, 64) do
  begin
    WriteProperties(obj);
    FlushBuffer; Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  FileStream: TFileStream;
  SaveClass: TSaveClass;
  i: Integer;
begin
  SaveClass:= TSaveClass.Create;
  SetLength(SaveClass.TestRec.TestStrArr,20);// Тут Ошибка

  for i:=0 to 19 do
  begin
    SaveClass.TestRec.TestStrArr[i]:= 'Some Text.';
  end;

  FileStream:= TFileStream.Create('C:\save.sav',fmCreate or fmOpenWrite);
  WriteObj(SaveClass,FileStream);

  FileStream.Free;
end;

end.


,то
Цитата

[Error] Unit1.pas(56): Constant object cannot be passed as var parameter


Это сообщение отредактировал(а) Ak47black - 21.5.2007, 15:17

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  SaveArray.rar 9,74 Kb
PM MAIL   Вверх
Snowy
Дата 21.5.2007, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



А почему бы тебе не использовать TStringList?
Зачем этот array?
PM MAIL   Вверх
Ak47black
Дата 21.5.2007, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Snowy, ну это я как для теста.
У меня большая структура там всякого полно
Вот отрывок например
Код

***
    Drives: array of record
      Name: String;
      Path: String;
      DriveType: String;
      FileSystem: String;
      SerialNo: String;
      UsesD: Int64;
      FreeD: Int64;
      TotalD: Int64;
      IconSmall: TIcon;
      IconBig: TIcon;
      Flags: record
        FILE_NAMED_STREAMS: Boolean;
        FILE_READ_ONLY_VOLUME: Boolean;
        FILE_SUPPORTS_OBJECT_IDS: Boolean;
        FILE_SUPPORTS_REPARSE_POINTS: Boolean;
        FILE_SUPPORTS_SPARSE_FILES: Boolean;
        FILE_VOLUME_QUOTAS: Boolean;
        FS_CASE_IS_PRESERVED: Boolean;
        FS_CASE_SENSITIVE: Boolean;
        FS_FILE_COMPRESSION: Boolean;
        FS_FILE_ENCRYPTION: Boolean;
        FS_PERSISTENT_ACLS: Boolean;
        FS_UNICODE_STORED_ON_DISK: Boolean;
        FS_VOL_IS_COMPRESSED: Boolean;
      end;
    end;
***

Тут уже TStringList непоможет.

Добавлено через 2 минуты и 30 секунд
Как это все послать через сокет я не представляю кроме как тупой перебор, (таам только отрывок ,а сама структура очень большая)

Добавлено через 3 минуты и 24 секунды
Просто тупо выдернуть этот кусок с памяти не получиться :|

Это сообщение отредактировал(а) Ak47black - 21.5.2007, 15:24
PM MAIL   Вверх
Alexeis
Дата 21.5.2007, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Ak47black, охохо, безнадежное дело, разве что все рекорды (и вложенные тоже) делать объектами, а для каждого из полей делать Published свойство.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Snowy
Дата 21.5.2007, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Угу. Дохлый номер.
записи не сериализуются и волшебной палочкой в единую область памяти не собираются.
Либо делай класс, либо вручную запихивай каждый элемент в TWriter.
PM MAIL   Вверх
Ak47black
Дата 21.5.2007, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

Либо делай класс

Это как если по подробней?
PM MAIL   Вверх
Snowy
Дата 21.5.2007, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Как? Как обычно классы делают.
А все поля сделай публишед пропертями.
PM MAIL   Вверх
Alexeis
Дата 21.5.2007, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Код

HZ = class (TPersistent)
  protected
        _FILE_NAMED_STREAMS: Boolean;
        _FILE_READ_ONLY_VOLUME: Boolean;
        _FILE_SUPPORTS_OBJECT_IDS: Boolean;
        _FILE_SUPPORTS_REPARSE_POINTS: Boolean;
        _FILE_SUPPORTS_SPARSE_FILES: Boolean;
        _FILE_VOLUME_QUOTAS: Boolean;
        _FS_CASE_IS_PRESERVED: Boolean;
        _FS_CASE_SENSITIVE: Boolean;
        _FS_FILE_COMPRESSION: Boolean;
        _FS_FILE_ENCRYPTION: Boolean;
        _FS_PERSISTENT_ACLS: Boolean;
        _FS_UNICODE_STORED_ON_DISK: Boolean;
        _FS_VOL_IS_COMPRESSED: Boolean;
    Published 
       property FILE_NAMED_STREAMS: Boolean read _FILE_NAMED_STREAMS write _FILE_NAMED_STREAMS;
       property FILE_READ_ONLY_VOLUME: Boolean read _FILE_READ_ONLY_VOLUME write _FILE_READ_ONLY_VOLUME;
       property ...
       property ...    
       property 
       property 
       property 
       property 
       property 
       property 
       property 
       property 
   end;


HZ2 = class (TPersistent)
  protected
      _Name: String;
      _Path: String;
      _DriveType: String;
      _FileSystem: String;
      _SerialNo: String;
      _UsesD: Int64;
      _FreeD: Int64;
      _TotalD: Int64;
      _IconSmall: TIcon;
      _IconBig: TIcon;
      _Flags: HZ;
    Published 
       property Name: String read _Name write _Name;
       property ...    
       property ...
       property 
       property 
       property 
       property 
       property 
       property 
       property     
    end;


Это сообщение отредактировал(а) Alexeis - 21.5.2007, 16:13


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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