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

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

Вернуться   Форум программистов > Delphi программирование > Lazarus, Free Pascal, CodeTyphon
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.05.2011, 13:33   #1
Lex_Liven
Пользователь
 
Аватар для Lex_Liven
 
Регистрация: 21.04.2010
Сообщений: 15
По умолчанию Как записать object, содержащий WideString в файл?

Есть тип
Код:
type
TMyObj=object
  Name:WideString;
  ID:integer;
  procedure SomeMethod;
end;
Соответственно, есть объект и файл
Код:
var MyObj:TMyObj;
     F:File of TMyObj;
Нужно записать объект (или несколько) в файл так, чтобы потом можно было прочитать.
Я пишу
Код:
AssignFile(F,'File.dat');
Rewrite(F);
Write(F,MyObj);
CloseFile(F);
И в файле получаю какую-то ересь вместо Name. При этом ID видно при просмотре файла в Hex-редакторе.

Как решить?
Если нет прямого пути, буду рад любым предложениям по хранению такого TMyObj.

Последний раз редактировалось Lex_Liven; 30.05.2011 в 13:36.
Lex_Liven вне форума Ответить с цитированием
Старый 30.05.2011, 13:56   #2
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Читаем вдумчиво с заходом по указываемым ссылкам: http://forum.vingrad.ru/forum/topic-.../view-all.html

Особенно вот это смотрим: http://www.delphikingdom.ru/asp/view...alogid=1206#06
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 30.05.2011, 15:02   #3
Lex_Liven
Пользователь
 
Аватар для Lex_Liven
 
Регистрация: 21.04.2010
Сообщений: 15
По умолчанию

Цитата:
Сообщение от GunSmoker Посмотреть сообщение
Читаем вдумчиво с заходом по указываемым ссылкам: http://forum.vingrad.ru/forum/topic-.../view-all.html

Особенно вот это смотрим: http://www.delphikingdom.ru/asp/view...alogid=1206#06
Первую ссылку не осилил до конца - там совсем ударились в классы...
А по второй я сделал вывод, что простейший способ - это записать не WideString, а Array[1..500]of WideChar.
Так? Или я, все-таки, недостаточно вдумчиво читал?
Lex_Liven вне форума Ответить с цитированием
Старый 30.05.2011, 15:04   #4
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Простейший - да. Со всеми его ограничениями (трата места впустую, ограничение на длину, невозможность редактирования человеком). Но быстро и просто - да.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 30.05.2011, 15:13   #5
Lex_Liven
Пользователь
 
Аватар для Lex_Liven
 
Регистрация: 21.04.2010
Сообщений: 15
По умолчанию

Ну, в исходном проекте, над которым я работаю, ограничения длины были еще жестче - 30-50 символов, так что это некритично.
Я не понял насчет "редактирования человеком" - вся работа с этими строками идет через компоненты формы, возможность редактирования файлов вручную не предусматривается, так что это тоже не то, на что стоит заморачиваться.
Большое спасибо. Когда проверю, дополню пост.
=================================== ======
Проверил. Дополняю.
Все действительно заработало "почти из коробки". Есть, правда, один глюк. Если не записывать длину строки в виде Integer в тот же файл, то при считывании - считываются все 500 символов (если массив из 500 элементов), что создает проблемы при записи в такой массив, например, пути к файлу. Сейчас попробую дописать в конец 0 символ.
Не помогло. Думаю ввести новый объект...
Код:
  WString=object
                Len:integer;
                Text:array[1..500]of WideChar;
                function GetText:WideString;             //получить обычный WideString из объекта. Для работы с функциями Дельфи.
                procedure SetText(S:WideString); //соответственно, сохранить WideString в объект.
  end;
Есть предложения по размеру массива внутри? Можно ли сделать его изменяющимся для каждого объекта? Чтобы можно было объявить объект типа WString[50], например?

Последний раз редактировалось Lex_Liven; 31.05.2011 в 08:53.
Lex_Liven вне форума Ответить с цитированием
Старый 01.06.2011, 06:45   #6
Lex_Liven
Пользователь
 
Аватар для Lex_Liven
 
Регистрация: 21.04.2010
Сообщений: 15
По умолчанию

Так как? Есть возможность задать размерность объекта? Или придется объявлять 4 типа? WString30, WString50, WString100 и WString500?
Lex_Liven вне форума Ответить с цитированием
Старый 01.06.2011, 07:30   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

опишите процедуры SaveToStream/LoadFromStream(или вам именно через File надо?)
в них и сохраняйте/грузите как нужно.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 01.06.2011, 07:33   #8
Lex_Liven
Пользователь
 
Аватар для Lex_Liven
 
Регистрация: 21.04.2010
Сообщений: 15
По умолчанию

Если я объявляю такой объект, то он пишется в файл и читается оттуда без проблем. Даже если я его потом в другой объект включаю (а именно для этого он мне и нужен). Просто хотелось бы для строки длиной не более 30 символов использовать именно WString с массивом внутри array[1..30], а не 500.

Или мне для этого надо объявить класс WString со своими методами, а уже от него создавать объекты?

Последний раз редактировалось Lex_Liven; 01.06.2011 в 07:46.
Lex_Liven вне форума Ответить с цитированием
Старый 01.06.2011, 08:04   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
 WString=object
                Len:integer;
                Text:array[1..30]of WideChar;
                function GetText:WideString;             //получить обычный WideString из объекта. Для работы с функциями Дельфи.
                procedure SetText(S:WideString); //соответственно, сохранить WideString в объект.
  end;
а так нельзя чтоль?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 01.06.2011, 08:38   #10
Lex_Liven
Пользователь
 
Аватар для Lex_Liven
 
Регистрация: 21.04.2010
Сообщений: 15
По умолчанию

Цитата:
Или придется объявлять 4 типа? WString30, WString50, WString100 и WString500?
Пепел, я читал ваши посты и не ожидал, что вы будете невнимательно читать. Мне нужны 4 размера данного объекта. в 30, 50, 100 и 500 символов.
Lex_Liven вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как записать файл UNICODE ? MakTpaxep Общие вопросы C/C++ 0 24.02.2011 17:05
как создать проект содержащий ОДИН файл в visual LOST94 Visual C++ 4 23.06.2010 16:17
Дан файл, содержащий текст на русском языке.Составить в алфавитном порядке список слов в файл. JiLiYa Паскаль, Turbo Pascal, PascalABC.NET 3 26.12.2008 12:05
Как записать файл в файл программы? Хамяг Общие вопросы Delphi 2 02.11.2008 16:01
как записать record в файл Kn793 Общие вопросы Delphi 5 01.08.2008 08:10