Главная страница
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.013 c
1-1276083003
Омлет
2010-06-09 15:30
2011.12.04
TDateTimePicker - ввод максимальной даты с клавиатуры


2-1313414426
TComponent
2011-08-15 17:20
2011.12.04
Использование курсора для навигации по страницам в TWebBrwser-e


2-1313252643
lazy BEGINner
2011-08-13 20:24
2011.12.04
Получение массива строк из шаблона со счетчиками


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


2-1313755879
Cobalt
2011-08-19 16:11
2011.12.04
проверка строки на соответсвие маске