[delphi]ListBox wykonywanie czynności aż do czasu gdy listbox będzie pusty

0

Witam !
Próbuję napisać program który wykonuję to co na załączonym obrazku.
//Dodano później
Może trochę źle się wyraziłem, chciałbym zrobić żeby program odczytywał pierwszy item, wyświetlał komunikat i kasował go i tak aż do końca itemów.
Dodano później
Zrobiłem coś takiego ale chciałbym zrobić żeby pętla cały czas działała aż nie skasuje wszystkich katalogów z listy.

var
 SR: TSearchRec;
 Fik : Integer;
 copy: String;
procedure szukaj;
begin
Fik := FindFirst(copy+'*.txt', faAnyFile, SR);
 while (Fik = 0) do
 begin
 Form1.ListBox1.Items.Add(copy+sr.Name);
 Fik := FindNext(SR);
 FindClose(SR);
 end;
 end;

procedure TForm1.Button1Click(Sender: TObject);
Var
Temp: String;
Count, FI, I: Integer;
Begin
 Count := ListBox1.Items.Count; // Policz liczbę itemów w ListBox
 For I := 0 To Count-1 Do
  if (Count > -1) Then // Zabezpieczenie
  Begin
   FI := LenGth(ListBox1.Items[I]); // Policz ilość znaków w pierwszym item'ie
   Temp := ListBox1.Items[I][LenGth(ListBox1.Items[0])]; // Skopiuj do string ostatni znak pierwszego itemu
   copy:=ListBox1.Items[I];
   if (Temp = '\') Then
   begin
   ListBox1.Items.Delete(I);
   szukaj;

   end
   Else // Jeżeli tak, to wyświetl komunikat, że to katalog
    ShowMessage('To nie jest katalog');
end;
end; 
0
var
temp : string;
...
temp := listbox.items[listbox.items.count-1];
if (temp[length(temp-1)] = '/') then showMessage('To katalog') else showMessage('To nie katalog');

To kod pisany z pamieci, a ze w Delphi pisalem dawno temu, to moze byc lekko bledny, ale ogolnie chyba o to Ci chodzilo ?

0

Poprzednik pisal na szybko. Stringi w Delphi są numerowane od 1 do Length(String), a
postępując dokładnie według schematu plus idiotoodpornośc jeżeli ListBox bybły pusty:

//...
var
  FirstItem, LastChar : string;
  ItmCount, StrLength : integer;
begin
  ItmCount := ListBox1.Items.Count;
  if ItmCount > 0 then
  begin
    FirstItem := ListBox1.Items[0];
    StrLength := Length(FirstItem);
    LastChar := Copy(FirstItem, StrLength, 1);
    if LastChar = '/' then
      showMessage('To katalog.')
    else
      showMessage('To nie katalog.');
  end;
end;
0

Heh, ponadto chodzilo o pierwszego item'a a ja napisalem kod dot. ostatniego ;p

0

Może trochę źle się wyraziłem ale dzięki, chciałbym zrobić żeby program odczytywał pierwszy item, wyświetlał komunikat i kasował go i tak aż do końca itemów.

0

te itemy to chyba TStringList. Zerknij do dokumentacji/helpa, tam powinny być opisane wszystkie metody tej klasy. Nie wiem gdzie tutaj masz problem...

0

Pisane bez kompilatora:

Var Temp: String;
    Count, Fi, I: Integer;
Begin
 Count := ListBox1.Items.Count-1; // Policz liczbę itemów w ListBox
 For I := 0 To Count Do
  if (Count > -1) Then // Zabezpieczenie
  Begin
   Fi := LenGth(ListBox1.Items[I]); // Policz ilość znaków w pierwszym item'ie
   Temp := ListBox1.Items[I][LenGth(ListBox1.Items[0])]; // Skopiuj do string ostatni znak pierwszego itemu
   ListBox1.Items[i].Delete; // Chyba tak...
   if (Temp = '/') Then // Sprawdź, czy ostatni znak to /
    ShowMessage('To jest katalog') Else // Jeżeli tak, to wyświetl komunikat, że to katalog
    ShowMessage('To nie jest katalog'); // Jeżeli nie, to wyświetl komunikat, że to nie katalog
  End;
 End;

Tak ?

0

ja bym zrobił to w ten sposób (nie sprrawdzałem czy działa):

 
 while ListBox1.Items.Count > 0 do
 begin
   if ListBox1.Items[0][LenGth(ListBox1.Items[0])] = '/' then 
     ShowMessage('To jest katalog') 
   else // Jeżeli tak, to wyświetl komunikat, że to katalog
     ShowMessage('To nie jest katalog'); // Jeżeli nie, to wyświetl komunikat, że to nie katalog   
 
   ListBox1.Items[0].Delete;
 end

Problem z Twoim kodem jest taki, że pętla for wykona się zawsze określoną ilość razy, np 5, bo było 5 itemów. Ty w każdym kroku pętli kasujesz jednego itema, ale nadal w każdym kroku pętli wykorzystujesz zmienną i, jako indeks... zobacz, w pewnym momencie masz już tylko dwa itemy, zmienna przyjmuje wartość i=2 i robiąc coś takiego items[i] odwołujesz się poza zakres

//aha... zobacz
For I := 0 To Count Do
... i pętla wykona się jeden raz więcej, niż jest itemów. Powinno być For I := 0 To Count - 1 Do

0

Można też

for I := Count - 1 downto 0 do
0

Zrobiłem coś takiego ale chciałbym zrobić żeby pętla cały czas działała aż nie skasuje wszystkich katalogów z listy.

var
 SR: TSearchRec;
 Fik : Integer;
 copy: String;
procedure szukaj;
begin
Fik := FindFirst(copy+'*.txt', faAnyFile, SR);
 while (Fik = 0) do
 begin
 Form1.ListBox1.Items.Add(copy+sr.Name);
 Fik := FindNext(SR);
 FindClose(SR);
 end;
 end;

procedure TForm1.Button1Click(Sender: TObject);
Var
Temp: String;
Count, FI, I: Integer;
Begin
 Count := ListBox1.Items.Count; // Policz liczbę itemów w ListBox
 For I := 0 To Count-1 Do
  if (Count > -1) Then // Zabezpieczenie
  Begin
   FI := LenGth(ListBox1.Items[I]); // Policz ilość znaków w pierwszym item'ie
   Temp := ListBox1.Items[I][LenGth(ListBox1.Items[0])]; // Skopiuj do string ostatni znak pierwszego itemu
   copy:=ListBox1.Items[I];
   if (Temp = '\') Then
   begin
   ListBox1.Items.Delete(I);
   szukaj;

   end
   Else // Jeżeli tak, to wyświetl komunikat, że to katalog
    ShowMessage('To nie jest katalog');
end;
end; 
0

Czy ktoś mi pomoże ?
Pozdrawiam ziomalski.

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