Czy kod jest poprawny?

Wątek przeniesiony 2017-04-03 22:57 z Delphi i Pascal przez flowCRANE.

0

Witam.

Czy ten kod jest poprawny?:

var i: integer;
begin
    for i := 0 to Form1.Memo1.Lines.Count - 1 do

        if Pos('Krakow', (Form1.Memo1.Lines.Strings[i])) > 0 then

        begin
            ShowMessage('Hello');
            break;
            end
            else

            begin
            application.Title:='WTF?!';
            ShowMessage('Are you kidding me?!');
            application.Terminate;
           end;

end;

Wydawało mi się, że można to też zrobić bez break.

0

Co ten kod robi?
Sprawdza czy w 0 linii jest tekst "Krakow" jeśli tak to wyświetla "Hello" jeśli nie "Are you kidding me?!" i zamyka program po komunikacie.
Pętla jest tutaj zbędna bo zawsze sprawdzi tylko 1 linię z memo,

0

A jak w takim razie zrobić, by sprawdził wszystkie linie memo?

1

Pytanie co chcesz osiągnąć, poniższy kod wyświetli w której linii jest wystąpienie napisu "Krakow" przeszukując całe memo. Jeśli chcesz przerwać po pierwszym wystąpieniu odkomentuj linię break

var
  i: integer;
  znaleziono_krakow: Boolean;
begin
  znaleziono_krakow := False;
  for i := 0 to Form1.Memo1.Lines.Count - 1 do
  begin
    if Pos('Krakow', (Form1.Memo1.Lines.Strings[i])) > 0 then
    begin
      ShowMessage(Format('Krakow w linii: %d', [i+1]));
      znaleziono_krakow := True;
//      break; //przerwanie pętli po wystąpieniu Krakow w memo przynajmniej raz
    end;
  end;

  if not znaleziono_krakow then
  begin
    application.Title := 'WTF?!';
    ShowMessage('Are you kidding me?!');
    application.Terminate;
  end;
end;
0

Dzięki, ale mam jeszcze jedno pytanie.
Da radę porównywać memo2 z memo1? Na zasadzie, że jeżeli jakiś wyraz będący zapisany w memo2 znajduje się w memo1 to cośtam?

0

No jasne, że da się. Memo to kolejne wiersze Memo.lines. Można je analizować po kolei w pętli. Wygooglaj sobie delphi split string. Znajdziesz jak podzielić wiersz na wyrazy. I możesz (też w pętli) szukać ich w drugim memo, czyli w memo.text.

Dodam jeszcze, że sprawdzasz istnienie stringa w stringu za pomocą funkcji pos.

0

Jest jeszcze czasem taki problem:

var
  i: integer;
  found: Boolean;
begin
  found := False;
  for i := 0 to Form1.Memo1.Lines.Count - 1 do
  begin
    if Pos('Zielona Gora', (Form1.Memo1.Lines.Strings[i])) > 0 then
    begin
      ShowMessage(Format('Found in: %d line', [i+1]));
      found := True;

    end;
  end;

  if not found then
  begin
    application.Title := 'WTF?!';
    ShowMessage('Are you kidding me?!');
    application.Terminate;
  end;
end;

Czasem bywa, że dwu wyrazowy string zostaje wrzucony do pierwszej, drugiej lini memo. Wówczas skrypt nie znajduje "zielona gora" w memo, lecz znajduje albo "zielona", albo "gora".
Jakieś rozwiązanie?

0

Możesz sobie przenieść zawartość listy do zmiennej łańcuchowej, po drodze zamieniając wszystkie znaki lub senwencje znaków nowej linii na spacje. Mały przykład:

var
  LText: String;
begin
  LText := StringReplace(MyList.Text, sLineBreak, ' ', [rfReplaceAll]);

W ten sposób otrzymasz jeden ciąg, na którym możesz już użyć funkcji Pos. Jeśli ostatnim wyrazem w jednej linii będzie Zielona, a pierwszym wyrazem w kolejnej linii będzie Góra, to w tak przygotowanym ciągu funkcja szukająca znajdzie ciąg Zielona Góra.

Kod sprawdziłem w Lazarusie, jednak zakładam, że w Delphi działa tak samo. Jedyną różnicą jest inna nazwa zmiennej przechowującej ciąg końca linii - w Lazarusie jest to zmienna LineEnding.

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.