Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.07.2010, 21:53   #1
bulldog5293
Форумчанин
 
Регистрация: 13.05.2010
Сообщений: 670
По умолчанию Какой то гюк

На просторах рунета нашёл код для сохранения и загрузке данных listview, но почемуто он работает не так, а точнее не полностью данные сохраняет, что в нём не так?
Код:

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;
begin
  //Initialization
  with AListView do
  begin
    ItemCount := 0;
    SubCount  := 0;
    //****
    MySignature := 'LVF';
    //  ListViewFile
    F := TFileStream.Create(sFileName, fmCreate or fmOpenWrite);
    F.Write(MySignature, SizeOf(MySignature));

    if Items.Count = 0 then
      // List is empty
      ItemCount := 0
    else
      ItemCount := Items.Count;
    F.Write(ItemCount, SizeOf(ItemCount));

    if Items.Count > 0 then
    begin
      for idxItem := 1 to ItemCount do
      begin
        with Items[idxItem - 1] do
        begin
          //Save subitems count
          if SubItems.Count = 0 then
            SubCount := 0
          else
            SubCount := Subitems.Count;
          F.Write(SubCount, SizeOf(SubCount));
          //Save ImageIndex
          IdxImage := ImageIndex;
          F.Write(IdxImage, SizeOf(IdxImage));
          //Save Caption
          sText := Caption;
          w     := Length(sText);
          pText := StrAlloc(Length(sText) + 1);
          StrPLCopy(pText, sText, Length(sText));
          F.Write(w, SizeOf(w));
          F.Write(pText^, w);
          StrDispose(pText);
          if SubCount > 0 then
          begin
            for idxSub := 0 to SubItems.Count - 1 do
            begin
              //Save Item's subitems
              sText := SubItems[idxSub];
              w     := Length(sText);
              pText := StrAlloc(Length(sText) + 1);
              StrPLCopy(pText, sText, Length(sText));
              F.Write(w, SizeOf(w));
              F.Write(pText^, w);
              StrDispose(pText);
            end;
          end;
        end;
      end;
    end;
    F.Free;
  end;
end;



procedure TForm1.LoadListViewToFile(AListView: TListView; sFileName: string);
var
  F: TFileStream;
  IdxItem, IdxSubItem, IdxImage: Integer;
  W, ItemCount, SubCount: Word;
  pText: PChar;
  PTemp: PChar;
  MySignature: array [0..2] of Char;
  sExeName: string;
begin
  with AListView do
  begin
    ItemCount := 0;
    SubCount  := 0;

    sExeName := ExtractFileName(sFileName);

    if not FileExists(sFileName) then
    begin
      MessageBox(Handle, PChar(Format(Msg1, [sExeName])), 'I/O Error', MB_ICONERROR);
      Exit;
    end;

    F := TFileStream.Create(sFileName, fmOpenRead);
    F.Read(MySignature, SizeOf(MySignature));

    if MySignature <> 'LVF' then
    begin
      MessageBox(Handle, PChar(Format(Msg2, [sExeName])), 'I/O Error', MB_ICONERROR);
      Exit;
    end;

    F.Read(ItemCount, SizeOf(ItemCount));
    Items.Clear;

    for idxItem := 1 to ItemCount do
    begin
      with Items.Add do
      begin
        //Read imageindex
        F.Read(SubCount, SizeOf(SubCount));
        //Read imageindex
        F.Read(IdxImage, SizeOf(IdxImage));
        ImageIndex := IdxImage;
        //Read the Caption
        F.Read(w, SizeOf(w));
        pText := StrAlloc(w + 1);
        pTemp := StrAlloc(w + 1);
        F.Read(pTemp^, W);
        StrLCopy(pText, pTemp, W);
        Caption := StrPas(pText);
        StrDispose(pTemp);
        StrDispose(pText);
        if SubCount > 0 then
        begin
          for idxSubItem := 1 to SubCount do
          begin
            F.Read(w, SizeOf(w));
            pText := StrAlloc(w + 1);
            pTemp := StrAlloc(w + 1);
            F.Read(pTemp^, W);
            StrLCopy(pText, pTemp, W);
            Items[idxItem - 1].SubItems.Add(StrPas(pText));
            StrDispose(pTemp);
            StrDispose(pText);
          end;
        end;
      end;
    end;

    F.Free;
  end;
end;

// Example:

procedure TForm1.Button1Click(Sender: TObject);
begin
  // Save Items and Clear the ListView
  SaveListViewToFile(ListView1, 'MyListView.sav');
  ListView1.Items.Clear;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  // Load Items
  LoadListViewToFile(ListView1, 'MyListView.sav');
end;

Последний раз редактировалось Stilet; 22.07.2010 в 10:59.
bulldog5293 вне форума Ответить с цитированием
Старый 21.07.2010, 22:12   #2
ex.cluz
Участник клуба
 
Аватар для ex.cluz
 
Регистрация: 15.01.2010
Сообщений: 1,325
По умолчанию

А как он "не так" сохраняет? Поподробнее.
Грибы - они разные. Один тебя накормит, другой тебе кино покажет...
Редактор журнала "
[ПРОграммист]"
Yan's Home Digital Lab
ex.cluz вне форума Ответить с цитированием
Старый 21.07.2010, 22:51   #3
bulldog5293
Форумчанин
 
Регистрация: 13.05.2010
Сообщений: 670
По умолчанию

к примеру пишу
http://www.programmersforum.ru
bulldog5293
password
сохраняю, потом загружаю назад и получаю
http://www.prog
bulldoutton
passdout
bulldog5293 вне форума Ответить с цитированием
Старый 21.07.2010, 22:56   #4
ex.cluz
Участник клуба
 
Аватар для ex.cluz
 
Регистрация: 15.01.2010
Сообщений: 1,325
По умолчанию

На первый взгляд ошибку не вижу. Попробуйте запустить отладку по шагам и посмотрите откуда чего берется.
Грибы - они разные. Один тебя накормит, другой тебе кино покажет...
Редактор журнала "
[ПРОграммист]"
Yan's Home Digital Lab
ex.cluz вне форума Ответить с цитированием
Старый 21.07.2010, 23:10   #5
bulldog5293
Форумчанин
 
Регистрация: 13.05.2010
Сообщений: 670
По умолчанию

отладку по шагам это типа то что высвечивается внизу дельфи во время запуска проекта?
Кстати попробывал 123456789 получил 12345butt

Народ ну скажите что не так?

Последний раз редактировалось Stilet; 22.07.2010 в 11:05.
bulldog5293 вне форума Ответить с цитированием
Старый 21.07.2010, 23:16   #6
ex.cluz
Участник клуба
 
Аватар для ex.cluz
 
Регистрация: 15.01.2010
Сообщений: 1,325
По умолчанию

Там мусор из оперативки, вроде, лезет. Надо операции с указателями смотреть.

Кстати, не пробовали имя для файла, куда происходит сохранение, целиком (вместе с путем) задавать?
У меня такой глюк под ХР был. Если имя файла короткое - прога писала в него много мусора. Почему это происходило так и не разобрался.
Грибы - они разные. Один тебя накормит, другой тебе кино покажет...
Редактор журнала "
[ПРОграммист]"
Yan's Home Digital Lab
ex.cluz вне форума Ответить с цитированием
Старый 21.07.2010, 23:22   #7
bulldog5293
Форумчанин
 
Регистрация: 13.05.2010
Сообщений: 670
По умолчанию

длинное имя тоже пробывал, он сохраняет короткие данные правельно к примеру1\2\3, а с длинными данными касяк, а указатели где смотреть?
bulldog5293 вне форума Ответить с цитированием
Старый 21.07.2010, 23:27   #8
ex.cluz
Участник клуба
 
Аватар для ex.cluz
 
Регистрация: 15.01.2010
Сообщений: 1,325
По умолчанию

Цитата:
указатели где смотреть?
В коде

Завтра на свежую голову посмотрю (если до этого никто не поможет).
Грибы - они разные. Один тебя накормит, другой тебе кино покажет...
Редактор журнала "
[ПРОграммист]"
Yan's Home Digital Lab
ex.cluz вне форума Ответить с цитированием
Старый 21.07.2010, 23:32   #9
bulldog5293
Форумчанин
 
Регистрация: 13.05.2010
Сообщений: 670
По умолчанию

хорошё, буду ждать
bulldog5293 вне форума Ответить с цитированием
Старый 22.07.2010, 01:35   #10
ZuBy
Участник клуба
 
Аватар для ZuBy
 
Регистрация: 29.09.2008
Сообщений: 1,234
По умолчанию

я сохранение делаю так:

Код:
procedure SaveListView(list: TListView; fname: string);
var
  ini: TMemIniFile; // uses IniFiles
  cnt, subcnt: integer;
  i, j: integer;
begin
  cnt := list.Items.Count;
  if cnt = 0 then exit;
  subcnt := list.Columns.Count;
  ini := TMemIniFile.Create(fname);
  try
    ini.WriteInteger('count', 'value', cnt - 1);
    for i := 0 to cnt - 1 do
    begin
      ini.WriteString('item' + inttostr(i), 'caption', list.Items[i].Caption);
      for j := 0 to subcnt - 2 do
      begin
        ini.WriteString('item' + inttostr(i), 'subitem' + inttostr(j), list.Items[i].SubItems[j]);
      end;
    end;
    ini.UpdateFile;
  finally
    ini.Free;
  end;
end;
а чтение так:
Код:
procedure ReadToListView(list: TListView; fname: string);
var
  ini: TMemIniFile; // uses IniFiles
  cnt, subcnt: integer;
  i, j: integer;
begin
  ini := TMemIniFile.Create(fname);
  try
    cnt := ini.ReadInteger('count', 'items', 0);
    subcnt := ini.ReadInteger('count', 'columns', 0);
    if (cnt > 0) then
    begin
      for i := 0 to cnt do
      begin
        list.Items.Add.Caption := ini.ReadString('item' + inttostr(i), 'caption', '');
        for j := 0 to subcnt - 1 do
        begin
          list.Items[i].SubItems.Add(ini.ReadString('item' + inttostr(i),
            'subitem' + inttostr(j), ''));
        end;
      end;
    end;
  finally
    ini.Free;
  end;
end;
сорс

Последний раз редактировалось ZuBy; 22.07.2010 в 02:19.
ZuBy вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Какой алгоритм? AK BULLETS Общие вопросы Delphi 4 18.05.2010 09:18
какой же оператор..( ayPinki Общие вопросы C/C++ 2 13.12.2009 10:05
Из какой вы страны? Роман Радер Свободное общение 24 12.11.2008 16:02
какой язык beygul Помощь студентам 4 17.09.2008 20:02
Какой компонент VenMaster Общие вопросы Delphi 4 07.06.2008 10:38