![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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 юникодные по умолчанию