Delphi - jakiś limit w listboxie ?

0

witam,

Odczytuję z pliku ini sekcję ACTIVE ALARMS i wywalam wynik na ListBOx'a:

begin
AlarmyH.ReadSection('ACTIVE ALARMS',ALarmyHistoryczneBox.Items);
AlarmyH.ReadSectionValues('ACTIVE ALARMS',ALarmyHistoryczneBox.Items);
AlarmyHistoryczneBox.TopIndex := -1 + ALarmyHistoryczneBox.Items.Count;
end;

Problem w tym że plik jest dość spory i odczytuje się tak mniej więcej tylko do połowy, jak skasuje trochę zawartości z początku to odpowiednio dalej odczytuje, ale i tak nie w całości.

Wiecie może czy jest jakiś limit w Listboxie? Jeśli tak czy można to jakoś obejść?
Musze wrzucić INI w całości...

0

Nie wiem dokładnie, ale stare Delphi miały limit na wielkość pliku ini do 64 KB,
powyżej źle się wczytywało i zapisywało. Ale od wersji Delphi 7 i wyżej pewnie
jest już ok. A zrób taki test, wczytaj do tego listboxa cały plik ini jako tekstowy
ponieważ jeżeli się uda to znaczy że może on przechowywać dużo tekstu, może
TStringList będzie lepszy, tylko później problem jak taką ogromną ilość danych,
zaprezentować wizualnie. Jeżeli nie ini to może w xmlu to możesz trzymać. Nic
więcej nie wymyślę, może ktoś inny jeszcze tutaj Tobie - coś lepszego doradzi.
Dodam, że z moich testow wynika, że TStringList, w chwilę wczytuje tekstowy
plik z 2708601 liniami (słownik od wersji gry "Literaki" offline - każda linijka w
nim to osobne słowo). Następnie poniższy kog wczytuje mi te 10000 linijek, no
a wątpie żebyś w swoim ini potrzebował więcej. Przy większej ilości trzeba by,
o ile się nie mylę użyć innych komponentów może bazodanowych - lecz w tym
za dużego doświadczenia nie mam, może są jakieś lepsze na torrym lub innej
stronie, a poniższy kod, wykonuje się u mnie mniej więcej 18300 milisekund.

var
  I : integer;
  SL : TStringList;
  Start, Stop : Cardinal;
begin
  ListBox1.Items.Clear;
  Start := GetTickCOunt;
  SL := TStringList.Create;
  SL.LoadFromFile('D:\slowa-win.txt');
    ListBox1.Items.BeginUpdate;
  for I := 0 to 99999 do
  begin
    ListBox1.Items.Add(SL[I]);
  end;
    ListBox1.Items.EndUpdate;
  Stop := GetTickCOunt;
  ShowMessage(IntToStr(Stop - Start));
  SL.Free;
end;
0

Kod Olesia jest oczywiście na maksa zły.
Begin i EndUpdate mają być poza pętlą, żeby to miało sens.

Kod autora postu też jest zły, bo z tego, co wiem(nie sprawdzałem w prawdzie) te metody przypisują do TStrings. A więc najpierw Dodajesz klucze, potem wartości(klucze w listBoxie powinny się wtedy wykasować). No i po co ustawiasz TopIndex?

Poza tym ograniczeniem jest ilość pamięci. Ale przy jej braku pojawi się błąd.

0

Ach, ale babol, faktycznie BeginUpdate i EndUpdate powinny być poza pętlą,
teraz już są. Jednak nic nie wymyśliłem więcej w kwesti problemow autora.
A po poprawce kod wykonuje się ledwie ponad 4000 milisekund czyli lepiej.

0

żeby bylo szybciej to niewczytuj do listboxa tylko do stringlist i tylko rysuj w jakimś komponencie np. StringList

100 000 lini tekstu wczytuje się kilkanaście milisekund

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