2009-06-03 22:38:48
Kilka wniosków - RichEdit

Kontrolka bardzo fajna, posiada od groma "hidden features", wiele rzeczy chodzi inaczej niż udokumentowano i generalnie praca z nią zapewnia dużo zabawy. ;) Kilka moich obserwacji i wniosków...

  • Używanie RichEdita do dynamicznego podświetlania składni to samobójstwo. Nie da się tego zrobić bez podnoszenia wymagań do S. T. A. L. K. E. R.'owego poziomu. Da się zrobić kolorowanie statyczne, ale wtedy najlepiej przygotować kod generujący właściwy dokument w formacie RTF (URTF) i taki "wlać" (stream-in) do kontrolki.
  • Unicode? Proszę bardzo. Problem w tym, że trzeba utworzyć kontrolkę klasy RICHEDIT20W (lub RICHEDIT30W) - nawet jeśli kontrolka ANSI obsługuje Unikodowy tekst (via wlanie URTFa - RTFa w kodowaniu UTF-8), to komunikaty takie jak EM_GETTEXTRANGE zwracają tekst w kodowaniu ANSI, z diakrytykami przekodowanymi na lokalną stronę kodową lub na pytajniki. A i tak bez względu na wersję, kontrolka sypie czasem kodem ANSI a czasem Unicode (tzn. sypała - pamiętam że coś takiego się działo, ale to chyba na RichEdicie 2.0 z Windows 98).
  • AutoURLDetect - fajnie, RichEdit 2.0 dorobił się autodetekcji URLi ("ożywiania" linków w rodzaju www.hcm.prv.pl), ale jak to zwykle bywa z advanced convenience features - jest. Można sobie włączyć i wyłączyć, i to wszystko w tym temacie. Żeby zaimplementować obsługę nietypowych urli ("gg:", "tlen:", "magnet:"), albo żeby chociaż zmienić kolor wyróżnienia - sorry, ale musimy sobie radzić sami (no i ja sobie radzę...).
  • Jeżeli włączone jest zawijanie wierszy, EM_EXLINEFROMCHAR zwraca numer widocznej (złamanej) linii, a nie rzeczywistej. Jeżeli mamy trzy linie tekstu, i druga złamie się na pięć kolejnych, pobranie trzeciej linii zwróci fragment drugiej.
  • EM_GETTEXTRANGE zwraca tekst nie zwinięty, bez względu na stan zawijania wierszy, przy czym każdy wiersz jest oddzielony pionową tabulacją (kod ASCII $0B). Zwracam uwagę, że w wywołaniu tego komunikatu nie liczy się bajtów, a znaki. Bufor musi mieć n+1 (kontrolka ANSI) lub (n+1)*2 (kontrolka Unicode) miejsca na tekst.
  • Drukowanie RichEdita to ZUO.
  • Dodanie do kontrolki takiej rzeczy jak obrazek oznacza o jeden czajnik kawy (lub jedną paczkę papierosów, jeśli ktoś pali) mniej. Idąc drogą URTFa, jest to SZALENIE nieefektywne, chyba że napiszemy własny kod podający dane kontrolce i po prostu będziemy generować URTFa w czasie rzeczywistym, ze swojego doświadczenia wiem, że jest to trudne, ale wykonalne i zapewnia świetne wyniki jeśli chodzi o użycie RAMu.
  • I nie, URTF jest standardem, ale po pierwsze Microsoftu, po drugie lokalnym dla RichEdita. Jeśli ktoś chce zapisać unikodowy tekst w formacie RTF, nie może liczyć na już istniejący kod generujący dokument URTF, bo... ŻADEN program (z Wordem na czele) nie sparsuje takiego dokumentu, a jeśli już, to źle.
  • RichEdit świetnie się nadaje jako "emulator" Unikodowej (dostępnej od NT4 w górę) odmiany kontrolki EDIT (czy to jedno, czy wielowierszowej), trzeba tylko uważać na to co zwracają typowe komunikaty (inymi słowy - być przygotowanym na otrzymanie tekstu kodowanego Unikodem niż ANSI).

Aż dziwię się, że do tej pory nie pojawiła się żadna natywna kontrolka dla Delphi zastępująca RichEdita - pomijając RichView, który jest bardzo wolny i bardzo pamięciożerny. Praktycznie nie nadaje się do użytku, do tego autorzy oberwali cegłą po głowach i za taki CRAP liczą sobie $289 (o, tu). ;) Ale to chyba normalne na rynku RAD.


Może Cię zainteresować...

Link | Komentarzy: 4 | Programowanie, Tech
Pokazuj komentarze.
Komentowanie wyłączone dla tego wpisu.
Powered by:
Hellcore Mailer - polski program pocztowyOpera Web BrowserFreeBSD - The Power to Serve!Slackware
RSSy:
Sidekick:
Projekty:
O autorze:
Zobacz:
Kategorie:
Archiwum:
Szukaj: