C++ Builder - zaznaczenie tekstu w innym oknie bez utraty aktywności obecnie aktywnego okna

0

Piszę swój własny notatnik w C++ Builderze, o wdzięcznej nazwie "Notatnik Szatana". Postanowiłem napisać samemu wyszukiwanie frazy w polu tekstowym. Mam jednak pewien problem.

Sama szukajka wygląda tak:
user image

Jeśli wpisany zostanie tekst znajdujący się w tekście, napis "Nie znaleziono" będzie niewidoczny, a tekst w głównym oknie zostanie zaznaczony.

Natomiast funkcja odpowiedzialna za zaznaczenie tekstu po znalezieniu wygląda tak:
Dopiero się uczę, więc pozwoliłem sobie po prostu wziąć jedną funkcję z internetu. Reszta kodu jest moja.

void zaznaczenie(TMemo *tresc, int start, int meta)
{
        tresc->Perform(EM_SETSEL, start, meta);
        tresc->SetFocus();
        //tutaj trzeba jeszcze sprawic, by okno glowne nie stawalo sie aktywne, tylko zeby szukajka pozostala aktywna a zaznaczenie pojawialo sie w oknie glownym
        //ANY IDEAS?
}

Funkcja szukania wywoływana jest przy OnChange pola edit występującego w okienku wyszukiwania. Chcę, by szukana fraza zaznaczała się na bieżąco gdy wpisujemy tekst w pole edit. Podoba mi się ta funkcjonalność - jedno klikanie mniej (nie jest potrzebny żaden button szukaj na który należałoby kliknąć), a wszystko dynamiczniej i prościej. Pomysł wziąłem z tego, jak działa wyszukiwanie w używanej przeze mnie przeglądarce internetowej i stwierdziłem, że w moim notatniku właśnie tak musi to wyglądać.

Wyszukuje prawidłowo. Tyle tylko, że po znalezieniu, oprócz zaznaczenia frazy w polu tekstowym głównego okna, czyni to okno aktywnym. Tak więc, żeby kontynuować wpisywanie szukanej frazy, należy z powrotem kliknąć na okno wyszukiwania. I tak ciągle po wpisaniu każdego znaku.
A nie chcę rezygnować z tej funkcjonalności zaznaczania na bieżąco.

Macie może jakiś pomysł, żeby został zaznaczony tekst w polu tekstowym w oknie głównym programu, ale bez utraty aktywności szukajki (ewentualnie żeby po zaznaczeniu tekstu pole wyszukiwania stało się z powrotem aktywne, ale tekst w polu tekstowym w oknie głównym pozostał zaznaczony)?

Jeśli ktoś by chciał zobaczyć całość mojego kodu, to proszę: http://pastebin.com/NLdd506A

0

Problem polega na tym, że nie ustawiłeś jednej właściwości Mema (w Object Inspector) HideSelection. Domyślnie ma true, ale tu jest potrzebne false.
Po tej zmianie można zdarzenie OnChange pola edycyjnego zaimplementpwać w następujący sposób (bez dodatkowych funkcji):

int start = Form1->Memo1->Text.Pos(Edit1->Text);
if(start > 0)
{
  Form1->Memo1->SelStart = start - 1;
  Form1->Memo1->SelLength = Edit1->Text.Length();
}

Zakładam, że pozostawiłeś nazwy domyślne.

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