Różnice pomiędzy SynEdit a SynMemo Delphi
‒ TSynMemo to pochodna klasy TSynEdit, przygotowana jako szybki „zamiennik” standardowego TMemo.
‒ Różnice ograniczają się do:
• kilku pomocniczych metod (CaretXY ⇄ TextOffset, forwardery do Lines.Append),
• wyłącznie innych DOMYŚLNYCH ustawień (gutter, code-folding itp. wyłączone, aby wyglądać jak TMemo).
‒ Funkcjonalność silnika (syntax-highlighting, code-folding, gutter, Unicode, makra…) pozostaje w 100 % dostępna – trzeba ją jedynie włączyć.
‒ W gałęziach Lazarus/FPC od wersji 1.4 SynMemo jest oznaczony jako „deprecated”; zaleca się używać TSynEdit.
TSynEdit ←─ TSynMemo
• TSynMemo nie usuwa żadnego pola ani metody TSynEdit; dodaje zaledwie cztery wrappery:
– OffsetToCaret / CaretToOffset
– AppendLine / AppendLineBreak (forwardery do Lines.Append/Lines.Add).
Właściwość | TSynEdit (default) | TSynMemo (default) | Uwagi |
---|---|---|---|
Gutter.Visible | True | False | Numery linii i znaczniki wyłączone, aby zachować wygląd TMemo |
Options.eoShowScrollHint | True | False | |
Options.eoCodeFolding | True* | False | *jeśli obsługuje to dany highlighter |
WordWrap | False | True | Jak w TMemo |
WantReturns / WantTabs | True | Zgodne z TMemo |
W praktyce SynMemo „udaje” TMemo, ale wystarczy zmienić powyższe właściwości, aby uzyskać pełen potencjał SynEdit.
Kategoria | TSynEdit | TSynMemo |
---|---|---|
API | Pełne | Pełne + 4 helpery |
Liczba zdarzeń | Identyczna | Identyczna |
Kompatybilność TMemo | Wymaga dostrojenia | Domyślnie kompatybilny (Enter, WordWrap, ScrollBars) |
Silnik wewnętrzny jest ten sam; różnice wydajności zauważalne przez użytkowników wynikają wyłącznie z tego, że w SynMemo domyślnie nie renderuje się gutter i punkty składania.
• Lazarus/FPC ≥ 1.4 – SynMemo oznaczony jako „deprecated”; wszystkie dodatkowe metody mają trafić do TSynEdit.
• TurboPack/SynEdit dla Delphi – nadal zawiera oba komponenty, ale społeczność również zaleca TSynEdit.
TSynEdit – IDE, edytory skryptów, narzędzia refaktoryzacji, pliki konfiguracyjne z nawigacją.
TSynMemo – przeglądarki ogromnych logów, szybkie zamienniki TMemo, proste wpisy tekstowe z kolorowaniem.
// Zamiana 1: zamień klasę w DFM/źródle
object LogViewer: TSynEdit // było TSynMemo
// Zamiana 2: odtwórz ustawienia „memo-like”
SynEdit1.Gutter.Visible := False;
SynEdit1.WordWrap := True;
SynEdit1.Options := SynEdit1.Options - [eoShowScrollHint, eoAutoIndent];
Kod zwykle kompiluje się bez zmian; brakujące metody (OffsetToCaret…) można dodać samodzielnie lub użyć helpera:
type
TSynEditHelper = class helper for TSynEdit
function OffsetToCaret(const Offset: PtrInt): TPoint;
function CaretToOffset(const Pt: TPoint): PtrInt;
end;
‒ Aktywny fork „SynEdit-2” (GitHub) dodaje obsługę High-DPI, RTL-Aware, lepsze wsparcie dla macOS i kontynuuje unifikację API (SynMemo w ogóle nie występuje).
‒ Trend w komponentach edytorów to odejście od duplikowania klas; preferowana jest jedna klasa z profilami konfiguracji (preset „Memo-Like” zamiast oddzielnego SynMemo).
• Dlaczego SynMemo powstał? 20 lat temu TMemo był popularny – przeniesienie projektu polegało na zamianie nazw klas bez dodatkowych modyfikacji UI.
• Zawijanie wierszy: w SynEdit operacja uwzględnia gutter; stąd w skrajnych przypadkach SynMemo bywa minimalnie szybszy.
• Wszystkie highlightery (TSynPasSyn, TSynPythonSyn…) działają identycznie w obu klasach.
• Oba komponenty – MPL 1.1 (Delphi) lub modified LGPL (Lazarus).
• Kompatybilność licencyjna pozwala na użycie w projektach zamkniętych przy zachowaniu warunków MPL/LGPL (dostarczenie źródeł zmian komponentu).
• Brak dodatkowych kwestii prywatności; edytor nie wysyła danych na zewnątrz.
MaxUndo := 0
i ScrollPastEOL := False
; różnice między klasami są pomijalne. ‒ W niektórych starych forkach SynMemo naprawdę usuwał pewne właściwości z RTTI; w nowych wydaniach różnica znika.
‒ Dokumentacja bywa niespójna – oficjalne Wiki Lazarusa odnosi się jeszcze do „braku guttera” w SynMemo; kod źródłowy temu przeczy.
• Śledź repo GitHub „SynEdit/SynEdit” – plan refaktoryzacji API.
• Przetestuj alternatywy: Scintilla, KCLEdit, TextRenderNG – zwłaszcza jeśli potrzebna jest funkcja „Mini-Map” lub diff-view.
• Porównaj zużycie pamięci przy plikach 1 GB w obu klasach (profilowanie HeapTrc/CodeSite).
TSynMemo nie jest „okrojoną” wersją SynEdit, lecz jego konfiguracją plus cztery wygodne metody. Funkcje silnika są identyczne; różne są tylko domyślne opcje. Społeczność i maintainerzy rekomendują przejście na TSynEdit, ponieważ SynMemo jest w fazie wygaszania. Jeśli dziś zaczynasz projekt – wybierz TSynEdit i włącz/wyłącz wymagane opcje, a zyskasz maksymalną kompatybilność w przyszłości.