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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Конвертация строк 
:(
    Опции темы
PsiMagistr
Дата 10.5.2011, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

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



Neobrat, я понял. спс.


Чумная вещь эта сериализация. С массивами объектов происходит жестяная штука. Сохраняется первый элемент массива и хоть кол теши.

Причем в файле имею 

Кучу записей.  И все заполнены первым элементом. Хотя массив содержит разные данные (тестировано).


Это сообщение отредактировал(а) PsiMagistr - 10.5.2011, 14:10


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
Neobrat
Дата 10.5.2011, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 28.8.2007

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



Цитата(PsiMagistr @ 10.5.2011,  10:25)
Код

procedure TForm1.Button3Click(Sender: TObject);
var i:Integer; F:TFileStream; M:TMemoryStream;
begin
M:=TMemoryStream.Create;
 F:=TFileStream.Create(ExtractFilePath(Application.ExeName)+ 'ПроБА',fmCreate);
 for i := 0 to high(Mass) do
  begin
  M.WriteComponent(Mass[i]);
  M.Position:=0;
  ObjectBinaryToText(M,F);
  end;
  M.Free;
  F.Free;
 end;




Зачем? не проще..
Код

procedure TForm1.Button3Click(Sender: TObject);
var i:Integer; M:TMemoryStream;
begin
M:=TMemoryStream.Create;
try
 for i := 0 to high(Mass) do
    M.WriteComponent(Mass[i]);

  M.SaveToFile(ExtractFilePath(Application.ExeName)+ 'ПроБА',fmCreate);
finally
  M.Free;
end;


код
Код

  xBtn: TButton;
  xID: Integer;
  xMem: TMemoryStream;
begin
  xMem := TMemoryStream.Create;
  try
  for xID := 0 to 10 do
    begin
    xBtn := TButton.Create(nil);
    xBtn.Caption := IntToStr(xID);
    xBtn.Name := 'MyButton'+IntToStr(xID);
    xMem.WriteComponent(xBtn);
    end;
    xMem.SaveToFile('C:/Test.txt');
  finally
    xMem.Free;
  end;

работает. 
Ищите ошибки в своем коде.
Зачем Вы приминаете сериализацию не совсем ясно. 

Это сообщение отредактировал(а) Neobrat - 10.5.2011, 14:46
PM MAIL   Вверх
bems
Дата 10.5.2011, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



Neobrat, WriteComponent из той же оперы


--------------------
Обижено школьников: 8
PM MAIL   Вверх
PsiMagistr
Дата 10.5.2011, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

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



Надо данные объекта сохранить. Но объекты в массиве. В динамическом массиве. И считываться должны в массив.

Это сообщение отредактировал(а) PsiMagistr - 10.5.2011, 14:50


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
CodeMonkey
Дата 10.5.2011, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 29
Всего: 89



На пальцах: сериализация в Delphi осуществляется на базе TPersistent, TComponent и TCollection.

TPersistent - это базовый класс, который можно сериализировать. Единственная проблема с ним в том, что по умолчанию его сериализирует TComponent. Сам TPersistent себя сериализировать не может. Это, впрочем, можно легко исправить.

Поэтому, главный сериализируемый класс в варианте по умолчанию - TComponent.

Далее, наборы из объектов сериализируются как составная часть объекта-контейнера. Таковыми (опять же, по умолчанию) в Delphi выступают TComponent и TCollection.

Соответственно, для того, чтобы сериализовать массив из 3-х TComponent, их надо добавить в четвёртый TComponent, который будет контейнером, и сериализовать уже его. Обо всём остальном позаботится TComponent.

Либо же, мы можем использовать TCollection и добавить 3 объекта в неё. И она нам всё засериализует.

Это грубо, но наглядно.

К сожалению, на руках у меня демки с TComponent и TCollection нет, а разбираться в вашем коде - нет времени, но вот здесь можно посмотреть пример сериализации одного объекта TPersistent и набора из трёх объектов TPersistent. Думаю, что это ещё лучше, чем TComponent и TCollection.

Эта демка сохраняет и загружает один объект и коллекцию в бинарном и текстовом виде.

Вот пример сохранения одного объекта в текстовом виде:
Код
object TTestObject
  Str = 'Predator'#39's crew ready to roll'
  Int = 42
end


Вот пример сохранения коллекции в текстовом виде:
Код
object TTestObjectCollection
  Items = <
    item
      Str = 'There is no cow level'
      Int = 5
    end
    item
      Str = 'Predator'#39's crew ready to roll'
      Int = 42
    end
    item
      Str = 'Size matters'
      Int = 999
    end>
end


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


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
PsiMagistr
Дата 10.5.2011, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

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



Neobrat,  и какая разница:

Код

FileStream.WriteComponent

//Или

MemoryStream.WriteComponent 

//И потом

MemoryStream.SaveToFile('C:/Test.txt');


Добавлено через 3 минуты и 29 секунд
CodeMonkey, весьма благоДарен. Т.е. как я понимаю, засерилизовыать массив без применения  TCollection или объекта-контейнера не получится?


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
Neobrat
Дата 10.5.2011, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 28.8.2007

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



Цитата(bems @ 10.5.2011,  12:46)
Neobrat, WriteComponent из той же оперы



"Зачем Вы приминаете сериализацию не совсем ясно. "

Возможно не совсем правильно выразился.

Какие предпосылки вынуждают использовать сериализацию?


"Надо данные объекта сохранить. Но объекты в массиве. В динамическом массиве. И считываться должны в массив."

Смотря что за объекты, что за данные и для каких целей.
Лично мой взгляд, 
  если нужны просто данные, то использовать рекорды.
  если используются объекты VCL, то встроенную сериализацию.
  если собственные объекты, то 
   а) пишется своя реализация сериализации, а по русски говоря дописывается две функции LoadFile SaveFile, а так же объект "загрузчик" которые следит за целостностью файла и т.д. и т.п.
   б) используется XML

у всех есть свои плюсы и минусы, которые я не вижу смысла обсуждать, каждый решает сам.
в вашей же задачи я не вижу смысла использовать встроенную сериализацию, так как из обычной записи(читай набора байт) создаете VCL-ый объект.

Добавлено через 5 минут и 48 секунд
Цитата(PsiMagistr @ 10.5.2011,  13:02)
Neobrat,  и какая разница:

Код

FileStream.WriteComponent

//Или

MemoryStream.WriteComponent 

//И потом

MemoryStream.SaveToFile('C:/Test.txt');

мм.. не в ту сторону смотрите. 
чуток оптимизировал ваш код просто.
PM MAIL   Вверх
PsiMagistr
Дата 10.5.2011, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

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



Neobrat

Вкратце

Для чего это нужно:

Записываются характеристики игрового персонажа.

Персонаж скорее всего будет объектом. Так логичнее.


Отсюда и сериализация


И в чем оптимизация между


FileStream.WriteComponent

и 

MemoryStream.WriteComponent 




--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
Neobrat
Дата 10.5.2011, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 28.8.2007

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



Цитата(PsiMagistr @ 10.5.2011,  13:22)
Neobrat

Вкратце

Для чего это нужно:

Записываются характеристики игрового персонажа.

Персонаж скорее всего будет объектом. Так логичнее.


Отсюда и сериализация


И в чем оптимизация между


FileStream.WriteComponent

и 

MemoryStream.WriteComponent

по поводу оптимизации, опять же не туда смотрите..
избавились от лишнего стрима и посмотри код ObjectBinaryToText, оно вам надо?

вопрос есть ли свойство у персонажа, которое не доступно для записи, но доступно на чтение, которое необходимо сохранять и подгружать?
если есть, то попробуйте со стандартной сериализацией это провернуть.

лично я скорее всего сделал бы "Загрузчик" и добавил две функции к персанажу LoadFile SaveFile
либо стал бы использовать xml

Это сообщение отредактировал(а) Neobrat - 10.5.2011, 15:39
PM MAIL   Вверх
PsiMagistr
Дата 10.5.2011, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

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



ObjectBinaryToText, оно вам надо? Желательно. Чтобы можно было редактировать в обычном блокноте.

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

Нет.

если есть, то попробуйте со стандартной сериализацией это провернуть.

лично я скорее всего сделал бы "Загрузчик" и добавил две функции к персанажу LoadFile SaveFile

Я тоже так хочу. 

либо стал бы использовать xml

что есть XML и с чем го кушать.

Добавлено @ 15:51
Почему отказался от рекордов:

При записи строковых переменных переменной длины (они у меня входят в рекорд) возникают траблы.  Добро пожаловать в ShortString


 ! 
MetalFan
для цитирования есть кнопки "быстрая цитата" и тег [quоte][/quоte]


Это сообщение отредактировал(а) MetalFan - 13.5.2011, 18:52


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
Neobrat
Дата 10.5.2011, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 28.8.2007

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



по поводу xml, google в помощь. как раз там и сможете редактировать свойства и поддерживать версионость.

"Почему отказался от рекордов:

При записи строковых переменных переменной длины (они у меня входят в рекорд) возникают траблы.  Добро пожаловать в ShortString"

1. Признайтесь себе лично, реально ли у вас будут данные длиннее 255, из за чего вы не можете использовать ShortString;
2. Посмотрите куда смотрит указатель строки string и ShortString а так же посмотрите где лежит реальное начало строки, думаю поймете от куда грабли растут  почему рекорды с обычным string не сохраняться.
Код

var
  xStr: string;
  xStr2: ShortString;
begin
  xStr := 'Юникод';
  xStr2 := 'АНСИ';
  memReport.Lines.Add('     String:' + IntToStr(Integer(@xStr))+' Point'+IntToStr(Integer(@xStr[1])));
  memReport.Lines.Add('ShortString:' + IntToStr(Integer(@xStr2))+' Point'+IntToStr(Integer(@xStr2[1])));
end;

3. если уж вам все таки надо использовать string с переменой длиной, то так как вы все равно делаете в объекте то в SaveFile 
  пишите сначала длину строки а потом саму строку, ну и при загрузке наоборот сначала читаете длину, подготавливаете строку SetLength, или GetMem и т.п., и читаете саму строку
PM MAIL   Вверх
PsiMagistr
Дата 10.5.2011, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

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



Признайтесь себе лично, реально ли у вас будут данные длиннее 255

Дело совсем-совсем не в этом. 

Если они будут меньше 255, в файле будут барахтаться пустышки

Это сообщение отредактировал(а) PsiMagistr - 10.5.2011, 16:29


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
bems
Дата 10.5.2011, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 18
Всего: 88



Цитата(Neobrat @  10.5.2011,  16:12 Найти цитируемый пост)
пишите сначала длину строки а потом саму строку, ну и при загрузке наоборот сначала читаете длину, подготавливаете строку SetLength, или GetMem и т.п., и читаете саму строку 

мы помним что разговор начинался с того чтобы не делать этого вручную? smile


--------------------
Обижено школьников: 8
PM MAIL   Вверх
PsiMagistr
Дата 10.5.2011, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

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



bems,  именно так.

Добавлено через 5 минут и 15 секунд
если уж вам все таки надо использовать string с переменой длиной, то так как вы все равно делаете в объекте 

Если я делаю в объекте, то долой рекорд и да здравствует сериализация!


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
Neobrat
Дата 10.5.2011, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 28.8.2007

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



мда.. ну и задачу вы себе выбрали..
не хотим что бы были пустышки и не хотим делать ручками..

кроме как пожелать вам удачи не чем помочь не могу. )
посмотрите в сторону IniFile может поможет )))))

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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