Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Load/Save ListView [D7, XP]


Antoxa ©   (2011-08-17 16:47:00) 

Здравствуйте мастера! В программе требовалось сохраниять и загружать данные ListView. Погуглив нашел тут: http://forum.sysman.ru/index.php?showtopic=11529.Использовал 2-ой способ от Song:
procedure TForm1.LoadListViewToFile(AListView: TListView; sFileName: string);
procedure TForm1.SaveListViewToFile(AListView: TListView; sFileName: string);
Изначально прога писалась в Дельфи 7 и отлично работала. Недостатком являлось нежелание программы запускатся под Виндовс 7. Поэтому было решено перенести ее в Дельфи2010(Embarcadero). Откомпиленая в Дельфи2010 прога начала работать в семерке,но отказалась загружать данные в ListView. Думается причина в процедуре LoadListViewToFile но где понять не могу :( Может подскажете? Премного благодарен за любой совет!


Antoxa   (2011-08-18 18:05:00) [1]

Thanks за ссылку! Осталось перевести googlem... ;)


Dennis I. Komarov   (2011-08-18 17:53:00) [2]

function Decode(x: AnsiString): string;
begin
...
end;


Самое сложное написал... :)
З.Ы.
http://en.wikipedia.org/wiki/Unicode
З.З.Ы.
Я не использую последние дельфы


Antoxa   (2011-08-18 15:37:00) [3]

А небольшой example можно? Сам не осилю :( Спасибо!


Dennis I. Komarov   (2011-08-18 15:23:00) [4]


> А как можно написать конвертер?

А можно ANSI в Unicode?


Antoxa   (2011-08-18 15:10:00) [5]

А как можно написать конвертер?


Dennis I. Komarov   (2011-08-18 12:56:00) [6]

Не проще написать конвертер A-файлов в W-файлы, и юзать стандартные методы TListView?


Antoxa   (2011-08-18 11:11:00) [7]

Спасибо большое за советы! Буду пробовать...


Ega23   (2011-08-17 21:44:00) [8]


> В процедуре LoadListViewToFile заменил sFileName:String
> на sFileName:AnsiString,а sExeName:String на sExeName:AnsiString,
>  список все равно пуст, хотя ошибок выполнения нет.


Ну смотрим твою функцию

procedure TForm1.SaveListViewToFile(AListView: TListView; sFileName: string);
var
 idxItem, idxSub, IdxImage: Integer;
 F: TFileStream;
 pText: PChar;
 sText: string;
 W, ItemCount, SubCount: Word;
 MySignature: array [0..2] of Char;


pText - раз, sText - два, MySignature - три.

Delphi2010 - unicode, Delphi 7 - ANSI.
Соответственно, если ты один раз сохранишь всё из D2010, то потом должно всё загружаться нормально, ничего не меняя.
А вот от предыдущей версии будут косяки.

Я бы на твоём месте сделал так:
0. Товарищ, который писал данный код, сделал очень грамотно, что сигнатуру ввернул.
1. пишем 3 метода:
private
  LoadFromStreamA(Stream: TStream);
  LoadFromStreamW(Stream: TStream);
public
  LoadFromStream(Stream: TStream);

2. В методе LoadFromStreamA аккуратно меняем string на AnsiString, PChar на PAnsiChar
3. Метод LoadFromStreamW оставляем как есть
4. В методе LoadFromStream грузим файл в TMemoryStream (это будет выгоднее, т.к. одним чохом загрузится), а далее проверяем первые 3 байта.
Если они равны 'LVF' ( только это AnsiChar, не забудь!!! ), то вызываем метод LoadFromStreamA.
Если они равны 'LVF' ( а вот теперь уже просто Char, не забудь!!! ), то вызываем метод LoadFromStreamW.
Иначе - raise Exception.Create

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


Германн   (2011-08-17 18:20:00) [9]


> В процедуре LoadListViewToFile заменил sFileName:String
> на sFileName:AnsiString

А внутри этой процедуры нет переменных типа string?


Antoxa   (2011-08-17 18:10:00) [10]

В процедуре LoadListViewToFile заменил sFileName:String на sFileName:AnsiString,а sExeName:String на sExeName:AnsiString, список все равно пуст, хотя ошибок выполнения нет. Файл данных в Дельфи 7 загружает той же процедурой. Может его конвертация требуется? :/


Ega23   (2011-08-17 17:38:00) [11]


> И что делать?

Заменить string на AnsiString

А вообще я бы попробовал поковыряться с родными методами. Беглый просмотр дал, что TListItems.ReadData\WriteData в приват спрятаны. Но просмотр был действительно крайне беглый, если поковырять, то можно что-нибудь и вытащить.
Самое банальное, что приходит в голову - в генофонд хелпер добавить, в нём приват будет виден.


Dennis I. Komarov   (2011-08-17 17:29:00) [12]


> И что делать?

Найти кто виноват :)


Antoxa   (2011-08-17 17:28:00) [13]

И что делать?


Dennis I. Komarov   (2011-08-17 17:28:00) [14]


> Недостатком являлось нежелание программы запускатся под
> Виндовс 7. Поэтому было решено перенести ее в Дельфи2010(Embarcadero).

А надо было найти причину...


MBo   (2011-08-17 17:15:00) [15]

строки в 2010 юникодные по умолчанию


Наверх

Титульная страница Поиск, карта сайта Написать письмо