Форум: "Начинающим";
Текущий архив: 2011.12.04;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.003 c