Szybszy StringList

0

Witam, mam kolejny problem. Otóż chodzi mi teraz o klasę TStringList. Mam na formie buttona, edita i memo i teraz klikając przycisku jest taka procedura:

procedure TForm1.Button1Click(Sender: TObject);
begin
var: Lista: TStringList;
i: Integer;
try
Memo1.Clear;
Lista:=TStringList.Create;
Lista.LoadFromFile('C:\text.txt');
if Edit1.Text<>'' then
  begin
  for i:=0 to Lista.Count-1 do
      begin
      if Pos(LowerCase(Edit1.Text), LowerCase(Lista.Strings[i]))>0 then
         begin
           Memo1.Lines.Add(Lista.Strings[i]);
         end;
      end;
  end;
finally
Lista.Free;
end;
end;

I mam teraz pytanie czy da się jakoś zrobić tak aby przy każdym klikaniu na przycisk NIE ładowac ponowenie pliku do listy (to zwalnia szukanie). Wiem że można wczytać przy tworzeniu okna ten plik a pożniej zwolnic go z pamięcie przy zamykaniu ale wtedy wyskakują jakeś błędy proszę o pomoc :(

0

Przed wczytaniem danych
BeginUpdate
po wczytaniu(gdy chcesz je wyświetlić)
EndUpdate
Są to oczywiście metody klasy TStringList.
To powinno przyspieszyć daną czynność, a jeśli chcesz całkowicie wyłączyć ładowanie pliku do Listy, to np. stwórz sobie zmienną IfLoad typu Boolean i po każdym kliknięciu przycisku sprawdzaj jej wartość i w zależności od niej wczytuj lub nie plik, a po wczytaniu ustaw odpowiednio.
Ewentualnie zamiast tworzyć zmienna globalną można by sprawdzać czy Lista jest pusta, jeśli tak, to wczytać plik, lecz to zależy od tego jak działa Twój program (czy tylko potrzebuje wczytać plik i zawsze wtedy lista jest pusta).

pzdr.

0

Tak na szybko.

type
  TForm = class (TForm)
    Memo1 :TMemo;
  public
    SL :TStringList;
  end;

procedure TForm.Create(Sender :TObject);
begin
   SL := TStringList.Create();
   SL.LoadFromFile('____');
end;

procedure TForm.Destroy;
begin
  SL.Free();
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  s :string;
begin
  Memo1.Clear;
  s := LowerCase(Edit1.Text);
  if (s <> '') and (SL.Count <> 0) then
  begin
  for i:=0 to SL.Count-1 do
      begin
      if Pos(s, LowerCase(SL.Strings[i]))>0 then
         begin
           Memo1.Lines.Add(SL.Strings[i]);
         end;
      end;
  end;
end;
0
wedrowiec napisał(a)

Przed wczytaniem danych
BeginUpdate
po wczytaniu(gdy chcesz je wyświetlić)
EndUpdate
Są to oczywiście metody klasy TStringList.
To powinno przyspieszyć daną czynność

W jego wypadku nic to nie da.
Do tego co napisał Oleksy_Adam można jeszcze dodać po
SL.LoadFromFile('____');
linijke
SL.Text := LowerCase( SL.Text );
co pozwoli wywalić LowerCase'a z
if Pos(s, LowerCase(SL.Strings[i]))>0 then

0

Witam ponownie.

Zrobiłem tak jak poradziliście i nie widać różnicy :( Może dlatego że plik który wczytuje zawiera 13 000 słów:)

0

TMemo trochę spowalnia, więc bym to poprawił tak:

type
  TForm = class (TForm)
    Memo1 :TMemo;
  public
    SL :TStringList;
    SL2 :TStringList;
  end;

procedure TForm.Create(Sender :TObject);
begin
   SL := TStringList.Create();
   SL.LoadFromFile('____');
   SL2 := TStringList.Create();
end;

procedure TForm.Destroy;
begin
  SL.Free();
  SL2.Free();
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  s :string;
begin
  Memo1.Clear;
  SL2.Clear;
  s := LowerCase(Edit1.Text);
  if (s <> '') and (SL.Count <> 0) then
  begin
  for i:=0 to SL.Count-1 do
      begin
      if Pos(s, LowerCase(SL.Strings[i]))>0 then
         begin
           SL2.Add(SL.Strings[i]);
         end;
      end;
      Memo1.Lines := SL2;
  end;
end;
0

Wywalić z pętli:
Memo1.Lines:= SL2;
i za całym for'em dać:
Memo1.Lines.Text := SL2.Text;

0
SiNuS napisał(a)

Wywalić z pętli:
Memo1.Lines:= SL2;
i za całym for'em dać:
Memo1.Lines.Text := SL2.Text;

to jest za for'em przecież :>

0

Fakt ;)
zwracam honor :)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.