Wycinanie części tekstu z TEdit do autouzupełniania

0

cześć dzień dobry,
czy wiecie jakim bezpośrednim poleceniem mogę zrobić z tedit coś takiego:
delete(s,x,y); gdzie s to string?
Chodzi o bezpośrednią operację na znakach w tedit.
Gdy przenoszę edit.text do stringa to wszytsko działa ale jeśli w stringu znajdą się polskie znaki to zawodzi, bo kodowanie w stringu polskich znaków wymaga dodatkowego miejsca więc wszystko się rozjeżdża.

Natomiast gdy znacznik selstart stawiam w tedit to zawsze jest w odp. miejscu niezależnie czy są litery polskie w tedit.text czy nie.
Potrzebuję takiej funkcjonalności dla autouzupełniania w tedit. Nie chcę używać tcombobox bo chcę mieć to zrobione po swojemu wg specjalnych schematów i tedit mi pasuje.
Gdyby nie szczegół z polskimi znakami to wszystko śmiga jak potrzeba.

Podsumowując potrzebuję metody do np wycięcia całego tekstu po znaku odczytanego z tedit.selstart. - bez pośredniego przenoszenia tego do stringa i tam cięcia poleceniami copy i delete.

0

Mógłbym teoretycznie napisać nowe funkcje globalne dla copy i delete licząc te miejsca od nowa poprzez omijanie znaku key=63 dla
polskich znaków ale nie wiem czy to nie pokomplikue czegoś i czy nie zrobi się nie uniwersalne - jeśli w jakimś systemie znaki specjalne są kodowane inaczej niż przez dodanie znaku nr 63.

0

Napisz sobie komponent z TEdit do wstawiania przecinków.

A w meritum to nie opowiadaj o kodzie, tylko go daj.

0

w Lazarus masz unit LazUTF8, w którym są funkcje odpowiedzialne za operacje na UTF8.
W tym przypadku możnaby zrobić coś takiego

if Edit1.SelStart > 0 then
  Edit1.Text := UTF8Copy(Edit1.Text, 1, Edit1.SelStart)
else
  Edit1.Text := '';
0

Dzięki wydaje się że właśnie o to pytałem. Po pracy to sprawdzę :)))

0

Sama modyfikacja to nic trudnego — kopiujesz ciąg z kontrolki do zmiennej, obrabiasz zmienną, wrzucasz wynik do kontrolki, zastępując istniejący tekst. Przy czym dobrze by było po takiej zmianie przywrócić pozycję kursora, tak aby użytkownik nie odczuł tej zmiany zbyt mocno (żeby nie musiał szukać kursora i się irytować).

0

Tak właśnie robiłem ale przez polskie znaki łatwo do zmiennej nie da rady włożyć wszytskich operacji. Każdy znak polski z tych dziwnych wpływa na pozycję w strungu jak dwa znaki standardowe.
sprawę załatwił dopiero uft8copy() znak standardowy czy nie ma długość 1.

0

Jak pod Windows to nie chce mi się sprawdzać ale to powinno zadziałać (zmieniasz na pusty ciąg)

SendMessage(Edit1.Handle, EM_REPLACESEL, WParam(False), LParam(0));

https://docs.microsoft.com/en-us/windows/win32/controls/em-replacesel

0
Windowbee napisał(a):

Tak właśnie robiłem ale przez polskie znaki łatwo do zmiennej nie da rady włożyć wszytskich operacji. Każdy znak polski z tych dziwnych wpływa na pozycję w strungu jak dwa znaki standardowe.

Przecież to powszechnie wiadome, że RTL i LCL stoją na UTF-8, więc wszelkie operacje na takich ciągach znaków muszą być przeprowadzane za pomocą funkcji przystosowanych do wielobajtowych znaków.

Po to masz dostepny moduł LazUTF8, aby z niego korzystać, a ze standardowych funkcji korzysta się tylko gdy zawartość ciągów znaków jest zgodna z ASCII/ANSI lub gdy potrzeba operacji na bajtach, a nie na unikodowych znakach.

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