Jeżeli w pliku znajduje się określony znak, wyświetl komunikat

0

Witam. Wczytuję dane z pliku tekstowego, które są wczytywane do pola ListBox.
W tej chwili wczytuje mi dowolny tekst, w dowolnej liczbie linii.
Chciałbym, aby gdy w dowolnej linii znajdzie się chodź jedna cyfra, liczba bądź znak specjalny (również spacja) został wyświetlony komunikat "złe dane". Dopuszczalne są więc tylko małe litery a-z.

W chwili obecnej moja procedura wczytywania danych wygląda tak:

procedure TForm1.Button1Click(Sender: TObject);
begin
  if(OpenDialog1.Execute) then                                                  //Jeżeli uda się odworzyć plik
  begin
    ListBox1.Items.LoadFromFile(OpenDialog1.FileName);                          //Wczytanie zbiorów do listy 1

    Button2.Enabled := true;                                                    //Aktywacja przycisku 'Licz'
    Button3.Enabled := false;                                                   //Dezaktywacja przycisku 'Zapisz'
    ListBox2.Clear;                                                             //Wyczeszczenie listy 2
  end
  else
   MessageDlg('Nie wybrales pliku', mtInformation, [mbCancel], 0);              //Gdy nie uda się odworzyć pliku wyswietlenie komunikatu
end;  

Język: Pascal

Liczę na pomoc..

0

W forze ładuj kolejne stringi potem PosSet użyj na tym (moduł StrUtils).
Czy masz jakiś konkretny problem czy gotowca nie umiesz znaleźć?

0

Napisałem coś takiego, w dalszym kodzie:

  for i := 1 to Length(ListBox1.Items[0]) do                            
      if ListBox1.Items[0][i] <> 'a..z' then
      break ;

Ale niestety dalej wczytuje inne znaki (np. 1,2, , T,X,$ itp...)

Co poprawić?

Gdy wpiszę jedną literę czyli np:

if ListBox1.Items[0][i] = 'a' then break;

Wtedy program nie bierze pod uwagę 'a'...

Próbowałem też

 if ListBox1.Items[0][i] <> 'a'..'z' then break;
0
peterkovic napisał(a)

Napisałem coś takiego, w dalszym kodzie:

if ListBox1.Items[0][i] <> 'a..z' then

ListBox1.Items[0][i] to jest pojedynczy Char. Nie można go porównać ze stringiem 'a..z'.
Użyj operatora in.

0

Przed Twoim postem napisałem coś takiego:

for i := 0 to ListBox1.Items.Count - 1 do
    begin
      if Pos('p', ListBox1.Items[i]) > 0 then
      ListBox1.Items.Add('zle');

    end;      

W tej chwili znajduje ładnie wszystkie literki p...
Ale nie mam zamiaru wypisywać tysięcy kodów IF z każdą literą inną od a..z, tylko jak to ukrócić?

Operator in jest mi nieznany..

1

Użyj składni w rodzaju

  if (znak>='a') and (znak<='z') then

albo posłuż się zbiorami.

0
if not (ListBox1.Items[0][i] in ['a'..'z']) then
0

Podziękował. Finalnie wygląda to tak:

for i := 0 to ListBox1.Items.Count - 1 do
    begin
      if not (ListBox1.Items[i] >= 'a') and (ListBox1.Items[i] <= 'z') then
      begin
      Button2.Enabled := false;
      MessageDlg('Zle dane!', mtInformation, [mbCancel], 0);
      break;
      end 
1
var
  i, j: Integer;
begin
  for i := 0 to ListBox1.Items.Count - 1 do
    for j := 1 to Length(ListBox1.Items[i]) do
     begin
       if ListBox1.Items[i][j] in ['a'..'z'] then
         continue;

       Application.MessageBox(PAnsiChar(Format('Nieprawidłowe znaki w linii: %d [%d : "%s"]',
                              [i, j, ListBox1.Items[i][j]])), '--ujowe znaki',
                              MB_OK + MB_ICONINFORMATION);
       break;
     end;
end;
0
peterkovic napisał(a)

Podziękował. Finalnie wygląda to tak:

for i := 0 to ListBox1.Items.Count - 1 do
    begin
      if not (ListBox1.Items[i] >= 'a') and (ListBox1.Items[i] <= 'z') then
      begin
      Button2.Enabled := false;
      MessageDlg('Zle dane!', mtInformation, [mbCancel], 0);
      break;
      end 

Źle to zrobiłeś, ponieważ

not (ListBox1.Items[i] >= 'a') and (ListBox1.Items[i] <= 'z') równa się (ListBox1.Items[i] < 'a') and (ListBox1.Items[i] <= 'z') równa się (ListBox1.Items[i] < 'a')

Poczytaj o kolejności operatorów/działań.
Ponadto powinieneś porównywać kolejne znaki w poszczególnych liniach a nie całe linie.

0

Zgadza się, i też do tego doszedłem, dlatego zaznaczyłem fajeczką odpowiedź Szarp'a, bo jego kod mnie satysfakcjonuje i po lekkich przeróbkach działa b. dobrze ;)

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