Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1301388555
Максон
2011-03-29 12:49
2011.12.04
Stringgrid


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


15-1313239099
>|<
2011-08-13 16:38
2011.12.04
Аномальный курсор


4-1252479375
d@vinchi
2009-09-09 10:56
2011.12.04
COM сервер в службе...


2-1312296516
Foma
2011-08-02 18:48
2011.12.04
TIdMultiPartFormDataStream и русский текст





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский