Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.12.04;
Скачать: CL | DM;

Вниз

Load/Save ListView   Найти похожие ветки 

 
Antoxa   (2011-08-17 16:47) [0]

Здравствуйте мастера! В программе требовалось сохраниять и загружать данные 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 но где понять не могу :( Может подскажете? Премного благодарен за любой совет!


 
MBo ©   (2011-08-17 17:15) [1]

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


 
Antoxa   (2011-08-17 17:28) [2]

И что делать?


 
Dennis I. Komarov ©   (2011-08-17 17:28) [3]


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

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


 
Dennis I. Komarov ©   (2011-08-17 17:29) [4]


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

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


 
Ega23 ©   (2011-08-17 17:38) [5]


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

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

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


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

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


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


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

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


 
Ega23 ©   (2011-08-17 21:44) [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

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


 
Antoxa   (2011-08-18 11:11) [9]

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


 
Dennis I. Komarov ©   (2011-08-18 12:56) [10]

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


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

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


 
Dennis I. Komarov ©   (2011-08-18 15:23) [12]


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

А можно ANSI в Unicode?


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

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


 
Dennis I. Komarov ©   (2011-08-18 17:53) [14]

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


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


 
Antoxa   (2011-08-18 18:05) [15]

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



Страницы: 1 вся ветка

Текущий архив: 2011.12.04;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.01 c
15-1313077949
Kolan
2011-08-11 19:52
2011.12.04
Является ли открытый пароль в форме регистрации нарушением закона


2-1313585266
Antoxa
2011-08-17 16:47
2011.12.04
Load/Save ListView


15-1313166354
ПЛОВ
2011-08-12 20:25
2011.12.04
Автотестирование ПО - что почитать?


15-1312895553
Медвежонок Пятачок
2011-08-09 17:12
2011.12.04
Внимание здешним телепатам. Есть работа


2-1313514028
Pcrepair
2011-08-16 21:00
2011.12.04
Конвертер BMP 32 bit BGRA в BMP 8 bit c Palette