Znalezienie ciągu znaków w Label.caption

0

Witam,

utknąłem w pewnym momencie przy pisaniu programu. Załóżmy że mam ciąg znaków w label1.caption o tresci "ABC Artur Maciek komenda". Mamy również label2.caption o tresci "Artur". Rzecz w tym, aby program wyszukał w ciągu label1.caption to co jest w label2.caption i zapisał to w zmiennej typu string. Poniżej wklejam to co udało mi się napisać. Problem w tym że zamiast pokazywać mi z ShowMessage komunikat o treści "Artur" (czyli to co znalazł w label1) pokazuje mi ABC A. Gdzie robię błąd?

procedure TForm1.Button1Click(Sender: TObject);
var
  j, i: byte;
  NrZnakuKomendy: byte;
  temp: string;
begin
  for j := 1 to length(label1.caption) do
  begin
     if (label1.caption[j+1] = 'k') and
        (label1.caption[j+2] = 'o') and
        (label1.caption[j+3] = 'm') and
        (label1.caption[j+4] = 'e') and
        (label1.caption[j+5] = 'n') and
        (label1.caption[j+6] = 'd') and
        (label1.caption[j+7] = 'a') then NrZnakuKomendy := j+9;
  end;

  for j := 1 to (NrZnakuKomendy-9) do
  begin
     if (label1.caption[j] = label2.caption[1]) then //zgodnosc 1 litery
     begin
        for i := 1 to length(label2.caption) do //tyle razy ile jest znakow
           temp := temp + label1.caption[i]; //kopiujemy z label1, nie z label2

        for i := 1 to length(label2.caption) do
        begin
           if (label1.caption[i] = temp[i]) then
           ShowMessage('Zgodnosc ' + IntToStr(i) + '!');

        end;
    ShowMessage(temp);
     end;
  end;
end;
1
i=Pos(label2.caption,label1.caption);
if i>0 then
begin
  ShowMessage('Zgodnosc '+IntToStr(i)+'!');
  ShowMessage(Copy(label1.caption,i+1));
end;
1
Reiko napisał(a)

Rzecz w tym, aby program wyszukał w ciągu label1.caption to co jest w label2.caption i zapisał to w zmiennej typu string.

Przepisywanie znalezionego ciągu w tym momencie nie ma żadnego sensu, bo zawartość zmiennej, do której lądowałby wynik i tak będzie taka sama, jak szukane słowo; Jeśli szukasz łańcucha Artur i zostanie on znaleziony, to do tej zmiennej wpisany zostałby ciąg Artur;

Jeśli potrzebujesz operować dalej na tym ciągu (tu: Artur), to równie dobrze nie musisz tworzyć dodatkowej zmiennej, a jedynie odwołać się do Label2.Caption i jedyne co to sprawdzić, czy szukany ciąg faktycznie występuje;

Natomiast jeśli będziesz potrzebował wyszukać dany ciąg bez rozróżniania wielkości liter - przed funkcją Pos sprowadź oba łańcuchy do małych / dużych liter funkcją LowerCase / UpperCase lub jeśli oba ciągi mogą zawierać znaki diakrytyczne - skorzystaj z funkcji AnsiLowerCase / AnsiUpperCase;

0

Dziękuję, jesteście kochani :) Owszem, nie znałem funkcji pos() i copy() ale już ten błąd naprawiłem. A problem załatwiłem kodem:

procedure TForm1.Button2Click(Sender: TObject);
var
  i: byte; //dopracuj
begin
i:=Pos(label2.caption,label1.caption);
   if i>0 then
   begin
     ShowMessage(Copy(label1.caption,i,length(label2.Caption)));
   end;

end;

Potrzebowałem w label1 znaleźć to co jest w label2 :)

0

Nie potrzebujesz ani kopiować, ani dodatkowej zmiennej - wcześniej napisałem Ci w jaki sposób można to rozwiązać prościej, coś w tym stylu:

procedure TForm1.Button2Click(Sender: TObject);
begin
  if Pos(Label2.Caption, Label1.Caption) > 0 then
    ShowMessage(Label2.Caption);
end;

a jeśli nie potrzebujesz rozróżniać wielkości liter to uprzednio należy "zmniejszyć" wszystkie duże litery przed sprawdzeniem:

procedure TForm1.Button2Click(Sender: TObject);
var
  Str, SubStr: AnsiString;
begin
  Str := AnsiLowerCase(Label1.Caption);
  SubStr := AnsiLowerCase(Label2.Caption);

  if Pos(SubStr, Str) > 0 then
    ShowMessage(SubStr);
end;

Jeśli kłopot zażegnany - zaznacz post rozwiązujący problem;

0

W sumie racja, może być bez copy ;)

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.