listview (index out of bounds)

Odpowiedz Nowy wątek
2004-03-13 14:33

Rejestracja: 17 lat temu

Ostatnio: 3 lata temu

0

Mam listview i sortuje sobie kolumny w sposb jaki by na forum kiedys.
Jednak kiedy dodaje jakas pozycje do listview i zapisuje do pliku nie zapisuje wszystkiego tak jak powinien a w momencie gdy zamykam program wywala index out of bounds (x) gdzie x to nr kolumny wg ktorej jest posortowany listview. Jak zrobic aby nie generowal tego bledu i dzialal poprawnie??

// nie wiem czemu ale nie mam polskich znakow [nuda]


Pozdrowienia Waldi

Pozostało 580 znaków

2004-03-13 14:49

Rejestracja: 16 lat temu

Ostatnio: 15 lat temu

0

Daj kod, bo trudno coś wywnioskować...


"Life's but a walking shadow, a poor player
That struts and frets his hour upon the stage
And then is heard no more: it is a tale
Told by an idiot, full of sound and fury,
Signifying nothing."
William Shakespeare

Pozostało 580 znaków

2004-03-13 15:15

Rejestracja: 17 lat temu

Ostatnio: 3 lata temu

0

Daj kod, bo trudno coś wywnioskować...

Chcesz kilka tysięcy lini?? w kilku unitach??

Kod do sortowania jest na forum, bo to głównie z tym się wiąże.
http://4programmers.net/Forum/viewpost.php?id=121577&h=listview

ShowworksArea listview jest na true nawet jak jest na false to i tak nic nie zmienia (jak by ktoś wspominał o faq)


Pozdrowienia Waldi

Pozostało 580 znaków

2004-03-13 16:11

Rejestracja: 16 lat temu

Ostatnio: 15 lat temu

0

IMHO kod sortowania jest poprawny, poza tym, że należy zmienić CompareText na AnsiCompareText, żeby porównywał poprawnie polskie znaki diakrytyczne.

Jakiś błąd musi być w zapisywaniu do pliku, ale jeszcze gdzie indziej.


"Life's but a walking shadow, a poor player
That struts and frets his hour upon the stage
And then is heard no more: it is a tale
Told by an idiot, full of sound and fury,
Signifying nothing."
William Shakespeare

Pozostało 580 znaków

2004-03-14 10:01

Rejestracja: 16 lat temu

Ostatnio: 9 lat temu

0

Pewnie twoja petla zapisujaca wyglada mniej wiecej tak:
for i := 0 to ListView.Items.Count do
Zapisz

Zmien na ListView.Items.Count - 1.


gone...

Pozostało 580 znaków

pq
2004-03-14 11:58
pq

Rejestracja: 18 lat temu

Ostatnio: 9 lat temu

0

Przypuszczam, że chmolu ogólnie ma rację, aczkolwiek ja raczej obstawiałbym, że trzeba Pred(SubItems.Count)*, bo błąd jest przy liczeniu kolumn, nie wierszy.

*Dla niezorientowanych: to inna forma Subitems.Count-1


"Ecie pecie - odparłem. - Wiadomo, że wszystkiemu winien komputer. Ten brzydal!" (Lem)

Pozostało 580 znaków

Anonim
2004-03-14 13:46
Anonim
0

IMHO kod sortowania jest poprawny, poza tym, że należy zmienić CompareText na AnsiCompareText, żeby porównywał poprawnie polskie znaki diakrytyczne.

Jakiś błąd musi być w zapisywaniu do pliku, ale jeszcze gdzie indziej.

Zapisywanie wygląda tak było na forum ale nie moge znaleźć.
Normalnie działa dopiero jak posortuje wg innej kolumny niż 1 to się wywypuje.

procedure Tform2.zapisywanie(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;

Pozostało 580 znaków

2004-03-14 13:51

Rejestracja: 17 lat temu

Ostatnio: 3 lata temu

0

to wyżej też moje ale zapomniałem się zaloować
A tak wygląda wywołanie zapisu
form2.zapisywanie(form2.ListView1,'dane\muzyka.dat');

IMHO kod sortowania jest poprawny, poza tym, że należy zmienić CompareText na AnsiCompareText, żeby porównywał poprawnie polskie znaki diakrytyczne
Jakiś błąd musi być w zapisywaniu do pliku, ale jeszcze gdzie indziej..

Jak zmienie na ansicompareText <ort>towogóle </ort>nie sortuje od razu wywala błąd List index out of bounds(x)

Juz zrobiłem
Zrobiłem na AnsiCompareText i dodatkowo w OI sorttype na stdata i działa. Kto by pomyślał że to tak się wiąże dziwnie ze sobą


Pozdrowienia Waldi

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0