SynEdit/pl: what changed
Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.
| Old | New | Line | |
|---|---|---|---|
| 1 | 1 | **SynEdit** to pakiet edycji/notatek z [[Syntax highlighting/pl|podświetlaniem składni]] dostępny na [[SynEdit tab/pl|karcie SynEdit]] obsługujący wiele języków/składni. | |
| 2 | 2 | ||
| 3 | 3 | SynEdit zawarty w Lazarusie został utworzony na bazie [SynEdit 1.0.3](http://synedit.sourceforge.net/), i został w dużym stopniu zaadaptowany i rozszerzony. Zmiany są wymienione poniżej. | |
| 4 | 4 | ||
| 5 | 5 | Pakiet Lazarus zawiera komponent edytora źródeł o nazwie [[TSynEdit/pl|TSynEdit]], kilka podświetlaczy składni i inne komponenty używane do edycji źródeł. | |
| 6 | 6 | ||
| 7 | 7 | Licencjonowany na tych samych warunkach, co oryginalny SynEdit (MPL lub GPL). | |
| 8 | 8 | ||
| 9 | 9 | ## Wersja oryginalna a Lazarus | |
| 10 | 10 | ||
| 11 | 11 | Wersją dla Lazarus opiekuje się głównie Martin Friebe. Martin napisał na forum, co zostało dodane do wersji Lazarusa od czasu pojawienia się tego forka: | |
| 12 | 12 | ||
| 13 | 13 | Duże rzeczy dodane do wersji Lazarus: | |
| 14 | 14 | ||
| 15 | 15 | - zwijanie bloków kodu | |
| 16 | 16 | - konfigurowalny boczny margines i jego części (tzw. rynna) | |
| 17 | 17 | - wspólny tekst pomiędzy kilkoma redaktorami | |
| 18 | 18 | - obsługa kodowania utf-8 | |
| 19 | 19 | - wtyczka do edycji synchronizacji | |
| 20 | 20 | - podstawowa obsługa RTL/LTR | |
| 21 | 21 | - konfiguracja myszy za pomocą MouseActions | |
| 22 | 22 | - przepisano różne moduły podświetlania/oznaczeń składni | |
| 23 | 23 | ||
| 24 | 24 | Bazy kodu wersji Delphi/Lazarus zostały niezależnie przeprojektowane. Pozostało bardzo niewiele do zrobienia. | |
| 25 | 25 | ||
| 26 | 26 | ## Port SynEdit 2.0 | |
| 27 | 27 | ||
| 28 | 28 | Istnieje alternatywny port wersji 2.0.x oryginalnego SynEdit. Nie jest aktywnie utrzymywany, ostatnie zatwierdzenie (obecnie jest marzec 2024) miało miejsce w 2023 roku, ale od 2011 roku ma on wersję 2.0.5. | |
| 29 | 29 | ||
| 30 | 30 | - [[SynEdit/port]] | |
| 31 | 31 | - [Github](https://github.com/rnapoles/strona) | |
| 32 | 32 | ||
| 33 | 33 | ## SynEdit w IDE | |
| 34 | 34 | ||
| 35 | 35 | SynEdit w Lazarusie jest pakietem wbudowanym, ponieważ samo IDE używa go do edycji kodów źródłowych. Z tego powodu nie można usunąć tego pakietu z listy instalacyjnej. Natomiast aby usunąć SynEdit z palety komponentów, można usunąć pakiet SynEditDsgn z instalacji. | |
| 36 | 36 | ||
| 37 | 37 | ## Używanie SynEdit | |
| 38 | 38 | ||
| 39 | 39 | ### Podświetlacze składni | |
| 40 | 40 | ||
| 41 | 41 | - Istnieje kilka standardowych poświetlaczy składni (zobacz [[SynEdit tab/pl|karta SynEdit]] w [[Component Palette|palecie komponentów]]) | |
| 42 | 42 | - Istnieją podświetlacze skryptowe, które można dostosować do wielu innych formatów plików: | |
| 43 | 43 | - [[TSynAnySyn]] (standardowy, jest domyślnie na palecie komponentów) | |
| 44 | 44 | - [[TSynPositionHighlighter]] (standardowy, **nie** jest obecny palecie komponentów) | |
| 45 | 45 | - [[TSynUniHighlighter]] (standardowy, **nie** jest obecny na palecie komponentów) | |
| 46 | 46 | - SynFacilSyn ([Github](https://github.com/t-edson/SynFacilSyn)) | |
| 47 | 47 | - Istnieje więcej podświetlaczy innych firm: SynCacheSyn, SynGeneralSyn, SynRCSyn, SynRubySyn, SynSDDSyn, SynSMLSyn, SynSTSyn, SynTclTkSyn, SynUnrealSyn, SynURISyn, SynVBScriptSyn, SynVrml97Syn, [Spójrz tutaj](http://bugs.freepascal.org/view.php?id=18248). | |
| 48 | 48 | - Możesz napisać nowy podświetlacz, zobacz informacje na [[SynEdit Highlighter/pl|SynEdit Highlighter]]. | |
| 49 | 49 | ||
| 50 | 50 | ### Znaczniki | |
| 51 | 51 | ||
| 52 | 52 | Znaczniki umożliwiają dodatkowe kolorowanie [[SynEdit Markup]] | |
| 53 | 53 | ||
| 54 | 54 | ### Oznaczenia | |
| 55 | 55 | ||
| 56 | 56 | Znaczniki zapewniają dodatkowe kolorowanie | |
| 57 | 57 | ||
| 58 | 58 | ### Edycja istniejącego podświetlacza | |
| 59 | 59 | ||
| 60 | 60 | Czasami możesz chcieć edytować istniejące podświetlacze składni (tak jak chciałem to zrobić kilka dni temu), które już istnieją. W tym przykładzie będziemy edytować podświetlacz dla kodu pascala (nazwa klasy: [[TSynPasSyn]]; pakiet: SynEdit V1.0; moduł: SynHighlighterPas.pas). | |
| 61 | 61 | ||
| 62 | 62 | Powiedzmy, że chcemy osiągnąć to, aby nasza aplikacja (w tym przypadku Lazarus) rozróżniał trzy typy komentarzy, które istnieją w Pascalu: | |
| 63 | 63 | ||
| 64 | 64 | ``` pascal | |
| 65 | 65 | (* standardowe *) | |
| 66 | 66 | { klamry } | |
| 67 | 67 | // ukośniki | |
| 68 | 68 | ``` | |
| 69 | 69 | ||
| 70 | 70 | Może to być pomocne, jeśli chcesz rozróżnić różne typy swoich komentarzy (np. „Opis”, „Notatka”, „Referencja” itp.) i chcesz, aby każdy wyróżniony był innym kolorem. | |
| 71 | 71 | ||
| 72 | 72 | > **Note:** Na wypadek, gdybyś coś zepsuł, sugeruję dodanie kilku komentarzy „NEW” i „/NEW”, ale nie jest to konieczne | |
| 73 | 73 | ||
| 74 | 74 | - Najpierw otwórz moduł „SynHighlighterPas”, który powinien znajdować się w katalogu SynEdit. | |
| 75 | 75 | - Ponieważ nie chcemy powodować niezgodności, tworzymy nowy rodzaj typu wyliczającego, który pomoże nam później zidentyfikować nasz komentarz: | |
| 76 | 76 | ||
| 77 | 77 | Np. pod deklaracją „tkTokenKind” napisz: | |
| 78 | 78 | ||
| 79 | 79 | ``` pascal | |
| 80 | 80 | {NEW} | |
| 81 | 81 | TtckCommentKind = (tckAnsi, tckBor, tckSlash); | |
| 82 | 82 | {/NEW} | |
| 83 | 83 | ``` | |
| 84 | 84 | ||
| 85 | 85 | - W deklaracji „TSynPasSyn” wyszukaj „FTokenID” i dodaj pomiędzy „FTokenID” a następnym polem | |
| 86 | 86 | ||
| 87 | 87 | ``` pascal | |
| 88 | 88 | {NEW} | |
| 89 | 89 | FCommentID: TtckCommentKind; | |
| 90 | 90 | {/NEW} | |
| 91 | 91 | //Tworzy to nowe pole, w którym możemy zapisać informację, jakiego rodzaju mamy komentarz | |
| 92 | 92 | ``` | |
| 93 | 93 | ||
| 94 | 94 | - W deklaracji „TSynPasSyn” wyszukaj „fCommentAttri” i dodaj następujący tekst między „fCommentAttri” a następnym polem | |
| 95 | 95 | ||
| 96 | 96 | ``` pascal | |
| 97 | 97 | {NEW} | |
| 98 | 98 | fCommentAttri_Ansi: TSynHighlighterAttributes; | |
| 99 | 99 | fCommentAttri_Bor: TSynHighlighterAttributes; | |
| 100 | 100 | fCommentAttri_Slash: TSynHighlighterAttributes; | |
| 101 | 101 | {/NEW} | |
| 102 | 102 | //Dzięki temu możemy zwrócić różne atrybuty dla każdego typu komentarza | |
| 103 | 103 | ``` | |
| 104 | 104 | ||
| 105 | 105 | - Następnie wyszukaj definicję konstruktora „TSynPasSyn”, która powinna brzmieć „constructor TSynPasSyn.Create(AOwner: TComponent);”. | |
| 106 | 106 | - Musimy utworzyć nasze nowe atrybuty, dlatego dodajemy nasze atrybuty gdzieś w konstruktorze (sugeruję po domyślnym „fCommentAttri”) | |
| 107 | 107 | ||
| 108 | 108 | ``` pascal | |
| 109 | 109 | (...) | |
| 110 | 110 | AddAttribute(fCommentAttri); | |
| 111 | 111 | {NEW} | |
| 112 | 112 | fCommentAttri_Ansi := TSynHighlighterAttributes.Create(SYNS_AttrComment+'_Ansi', SYNS_XML_AttrComment+'_Ansi'); //Ostatnie dwa ciągi to podpis i przechowywana nazwa | |
| 113 | 113 | //Jeśli chcesz mieć domyślne ustawienia swojego atrybutu, możesz np. dodać to: | |
| 114 | 114 | //fCommentAttri_Ansi.Background := clBlack; //Ustawiłoby to „Tło” na „clBlack” jako domyślne | |
| 115 | 115 | AddAttribute(fCommentAttri_Ansi); | |
| 116 | 116 | fCommentAttri_Bor := TSynHighlighterAttributes.Create(SYNS_AttrComment+'_Bor', SYNS_XML_AttrComment+'_Bor'); | |
| 117 | 117 | AddAttribute(fCommentAttri_Bor); | |
| 118 | 118 | fCommentAttri_Slash := TSynHighlighterAttributes.Create(SYNS_AttrComment+'_Slash', SYNS_XML_AttrComment+'_Slash'); | |
| 119 | 119 | AddAttribute(fCommentAttri_Slash); | |
| 120 | 120 | {/NEW} | |
| 121 | 121 | (...) | |
| 122 | 122 | ``` | |
| 123 | 123 | ||
| 124 | 124 | - Bardziej skomplikowane działanie polega teraz na wyszukaniu miejsc, w których „FTokenID” jest ustawione na „tkComment” i jednocześnie obsługuje nasz „podtyp” (oczywiście już je dla Ciebie znalazłem :) | |
| 125 | 125 | ||
| 126 | 126 | ``` pascal | |
| 127 | 127 | procedure TSynPasSyn.BorProc; | |
| 128 | 128 | (...) | |
| 129 | 129 | fTokenID := tkComment; | |
| 130 | 130 | {NEW} | |
| 131 | 131 | FCommentID:=tckBor; | |
| 132 | 132 | {/NEW} | |
| 133 | 133 | if rsIDEDirective in fRange then | |
| 134 | 134 | (...) | |
| 135 | 135 | ``` | |
| 136 | 136 | ||
| 137 | 137 | ``` pascal | |
| 138 | 138 | procedure TSynPasSyn.AnsiProc; | |
| 139 | 139 | begin | |
| 140 | 140 | fTokenID := tkComment; | |
| 141 | 141 | {NEW} | |
| 142 | 142 | FCommentID:=tckAnsi; | |
| 143 | 143 | {/NEW} | |
| 144 | 144 | (...) | |
| 145 | 145 | ``` | |
| 146 | 146 | ||
| 147 | 147 | ``` pascal | |
| 148 | 148 | procedure TSynPasSyn.RoundOpenProc; | |
| 149 | 149 | (...) | |
| 150 | 150 | fTokenID := tkComment; | |
| 151 | 151 | {NEW} | |
| 152 | 152 | FCommentID:=tckAnsi; | |
| 153 | 153 | {/NEW} | |
| 154 | 154 | fStringLen := 2; // długość "(*" | |
| 155 | 155 | (...) | |
| 156 | 156 | ``` | |
| 157 | 157 | ||
| 158 | 158 | ``` pascal | |
| 159 | 159 | procedure TSynPasSyn.SlashProc; | |
| 160 | 160 | begin | |
| 161 | 161 | if fLine[Run+1] = '/' then begin | |
| 162 | 162 | fTokenID := tkComment; | |
| 163 | 163 | {NEW} | |
| 164 | 164 | FCommentID:=tckSlash; | |
| 165 | 165 | {/NEW} | |
| 166 | 166 | if FAtLineStart then begin | |
| 167 | 167 | (...) | |
| 168 | 168 | ``` | |
| 169 | 169 | ||
| 170 | 170 | ``` pascal | |
| 171 | 171 | procedure TSynPasSyn.SlashContinueProc; | |
| 172 | 172 | (...) | |
| 173 | 173 | fTokenID := tkComment; | |
| 174 | 174 | {NEW} | |
| 175 | 175 | FCommentID:=tckSlash; | |
| 176 | 176 | {/NEW} | |
| 177 | 177 | while not(fLine[Run] in [#0, #10, #13]) do | |
| 178 | 178 | (...) | |
| 179 | 179 | ``` | |
| 180 | 180 | ||
| 181 | 181 | - Teraz musimy tylko pobrać informacje po wywołaniu „GetTokenAttribute” i zwrócić właściwy atrybut, dlatego edytujemy „GetTokenAttribute” w następujący sposób: | |
| 182 | 182 | ||
| 183 | 183 | ``` pascal | |
| 184 | 184 | function TSynPasSyn.GetTokenAttribute: TSynHighlighterAttributes; | |
| 185 | 185 | begin | |
| 186 | 186 | case GetTokenID of | |
| 187 | 187 | tkAsm: Result := fAsmAttri; | |
| 188 | 188 | {OLD | |
| 189 | 189 | tkComment: Result := fCommentAttri; //To jest komentarz i stanowi kopię zapasową, więc zostanie zignorowany | |
| 190 | 190 | /OLD} | |
| 191 | 191 | {NEW} | |
| 192 | 192 | tkComment: begin | |
| 193 | 193 | if (FCommentID = tckAnsi) then | |
| 194 | 194 | Result := fCommentAttri_Ansi //To jest typ standardowy AnsiComment | |
| 195 | 195 | else | |
| 196 | 196 | if (FCommentID = tckBor) then | |
| 197 | 197 | Result := fCommentAttri_Bor //To jest typ klamrowy BorComment | |
| 198 | 198 | else | |
| 199 | 199 | if (FCommentID = tckSlash) then | |
| 200 | 200 | Result := fCommentAttri_Slash //To jest typ ukośnikowy SlashComment | |
| 201 | 201 | else | |
| 202 | 202 | Result := fCommentAttri //Jeśli nasz kod w jakiś sposób zawiódł, przywróć ustawienia domyślne | |
| 203 | 203 | end; | |
| 204 | 204 | {/NEW} | |
| 205 | 205 | tkIDEDirective: begin | |
| 206 | 206 | (...) | |
| 207 | 207 | ``` | |
| 208 | 208 | ||
| 209 | 209 | Jeśli używasz lazarusa, po prostu zainstaluj ponownie pakiet SynEdit, jeśli nie, przekompiluj swój projekt/pakiet. | |
| 210 | 210 | ||
| 211 | 211 | **GOTOWE ! Mówię poważnie! Twój kod jest teraz gotowy na rozróżnianie różnych typów komentarzy.** | |
| 212 | 212 | ||
| 213 | 213 | Lazarus-IDE automatycznie wykrywa, jakie atrybuty istnieją i pokazuje je w opcjach, na przykład zapisuje je, jeśli je zmienisz. Jeśli Twoja aplikacja/IDE tego nie robi, będziesz musiał ustawić Kolor/Czcionkę/itp. nowych atrybutów gdzieś ręcznie (np. w konstruktorze TSynPasSyn) | |
| 214 | 214 | ||
| 215 | 215 | ### Realizacja wtyczek | |
| 216 | 216 | ||
| 217 | 217 | Istnieją 3 wtyczki uzupełniające dla SynEdit: | |
| 218 | 218 | ||
| 219 | 219 | [[TSynCompletion]] | |
| 220 | 220 | ||
| 221 | 221 | - Oferuje listę słów w rozwijanym menu za pomocą kombinacji klawiszy skrótu (domyślnie: Ctrl-Spacja). | |
| 222 | 222 | - Używane w IDE do uzupełniania identyfikatora. | |
| 223 | 223 | - Zawarte w przykładach. | |
| 224 | 224 | - Dostępne na palecie komponentów (od wersji 0.9.3x). | |
| 225 | 225 | ||
| 226 | 226 | Przykładowy kod wywołujący programowo wyskakujące okienko uzupełniania (tj. bez naciskania skrótu klawiaturowego): | |
| 227 | 227 | ||
| 228 | 228 | ``` pascal | |
| 229 | 229 | YourSynEdit.CommandProcessor(YourSynCompletion.ExecCommandID, '', nil) | |
| 230 | 230 | ``` | |
| 231 | 231 | ||
| 232 | 232 | [[TSynAutoComplete]] | |
| 233 | 233 | ||
| 234 | 234 | - Zastępuje bieżący token fragmentem tekstu. **Nie** jest to interaktywne. **Nie** posiada menu rozwijanego. | |
| 235 | 235 | - Zawarte w przykładach. | |
| 236 | 236 | - Dostępne na palecie komponentów. | |
| 237 | 237 | ||
| 238 | 238 | [[TSynEditAutoComplete]] | |
| 239 | 239 | ||
| 240 | 240 | - Podstawowy moduł szablonów. **Nie** posiada menu rozwijanego. | |
| 241 | 241 | - Używany przez IDE do szablonów kodu. IDE zawiera dodatkowy kod rozszerzający tę funkcję (rozwijane i synchronizujące makra dodawane są przez IDE). | |
| 242 | 242 | - **Nie** ujęte w przykładach. | |
| 243 | 243 | ||
| 244 | 244 | Todo: Należy udokumentować różnice pomiędzy 2. i 3. poziomem. Może uda się je połączyć. | |
| 245 | 245 | ||
| 246 | 246 | ### Logiczna/fizyczna pozycja karetki | |
| 247 | 247 | ||
| 248 | 248 | SynEdit oferuje położenie karetki (migającego kursora tekstowego) w 2 różnych formach: | |
| 249 | 249 | ||
| 250 | 250 | - Fizyczne X/Y: Odpowiada pozycji wizualnej (na płótnie) karetki, | |
| 251 | 251 | - Logiczne X/Y: Odpowiada przesunięciu bajtów tekstu. | |
| 252 | 252 | ||
| 253 | 253 | Obydwa są oparte na 1. Obecnie współrzędne Y są zawsze takie same. To może się zmienić w przyszłości. | |
| 254 | 254 | ||
| 255 | 255 | Współrzędna fizyczna | |
| 256 | 256 | To pozycja w siatce wyświetlania (pomijająca przewijanie). Przy czym: | |
| 257 | 257 | ||
| 258 | 258 | litera „a” i „â” zajmują JEDNĄ komórkę w siatce, zwiększając fizyczne x o 1. Mimo że w utf8 kodowanie „a” zajmuje jeden bajt, a „â” zajmuje kilka bajtów. | |
| 259 | 259 | ||
| 260 | 260 | jednakże znak tabulacji (#9), poza tym, że jest tylko jednym bajtem i jednym znakiem, może zająć kilka komórek w siatce, zwiększając fizyczne x o więcej niż jeden. Istnieją również znaki w językach chińskim i wschodnim, które zajmują 2 pozycje siatki (znak Google o pełnej szerokości i o połowie szerokości) | |
| 261 | 261 | ||
| 262 | 262 | Współrzędna logiczna | |
| 263 | 263 | To przesunięcie bajtu w ciągu znaków przechowującym linię. | |
| 264 | 264 | ||
| 265 | 265 | litera „a” ma 1 bajt i zwiększa się o 1 | |
| 266 | 266 | ||
| 267 | 267 | litera „â” ma 2 (lub 3) bajty i zwiększa się o tą wartość | |
| 268 | 268 | ||
| 269 | 269 | tab ma 1 bajt i zwiększa się o 1. | |
| 270 | 270 | ||
| 271 | 271 | Żaden z tych współrzędnych nie podaje pozycji w znakach/punktach kodowych UTF8 (tak jak np. Utf8Copy czy Utf8Length). | |
| 272 | 272 | ||
| 273 | 273 | Fizyczna współrzędna X jest zawsze liczona od lewej strony tekstu, nawet jeśli jest on przewijany. Aby uzyskać grid-x aktualnie przewijanej kontrolki, wykonaj: | |
| 274 | 274 | ||
| 275 | 275 | ||
| 276 | 276 | grid-X-in-visible-part-of-synedit := PhysicalX - SynEdit.LeftChar + 1 | |
| 277 | 277 | ||
| 278 | 278 | grid-y-in-visible-part-of-synedit := SynEdit.RowToScreenRow(PhysicalY); // obejmuje zwijanie bloków | |
| 279 | 279 | ||
| 280 | 280 | użyj ScreenRowToRow do odwrotnych wyliczeń | |
| 281 | 281 | ||
| 282 | 282 | ### Zmiana tekstu za pomocą kodu | |
| 283 | 283 | ||
| 284 | - | ||
| 284 | + | > **Warning:** Zmiana tekstu za pomocą właściwości SynEdit.Lines nie działa w przypadku funkcji cofnij/ponów. | |
| 285 | 285 | ||
| 286 | 286 | Dostęp do tekstu można uzyskać za pośrednictwem SynEdit.Lines. Jest to właściwość oparta na TStrings oferująca dostęp do odczytu/zapisu dla każdej linii. Pierwszy wiersz ma index 0. | |
| 287 | 287 | ||
| 288 | 288 | ``` pascal | |
| 289 | 289 | SynEdit.Lines[0] := 'Text'; // pierwsza line | |
| 290 | 290 | ``` | |
| 291 | 291 | ||
| 292 | 292 | Za pomocą SynEdit.Lines można ustawić początkową wersję tekstu (np. wczytaną z pliku). Należy pamiętać, że SynEdit.Lines.Add/SynEdit.Lines.Append nie obsługuje podziału wierszy wewnątrz dodanych ciągów. Należy dodawać linie jedna po drugiej. | |
| 293 | 293 | ||
| 294 | 294 | Aby zmodyfikować zawartość SynEdit i pozwolić użytkownikowi na cofnięcie akcji, użyj następujących metod: | |
| 295 | 295 | ||
| 296 | 296 | ``` pascal | |
| 297 | 297 | procedure InsertTextAtCaret(aText: String; aCaretMode: TSynCaretAdjustMode = scamEnd); | |
| 298 | 298 | property TextBetweenPoints[aStartPoint, aEndPoint: TPoint]: String // Logiczna pozycja | |
| 299 | 299 | read GetTextBetweenPoints write SetTextBetweenPointsSimple; | |
| 300 | 300 | property TextBetweenPointsEx[aStartPoint, aEndPoint: TPoint; CaretMode: TSynCaretAdjustMode]: String | |
| 301 | 301 | write SetTextBetweenPointsEx; | |
| 302 | 302 | procedure SetTextBetweenPoints(aStartPoint, aEndPoint: TPoint; | |
| 303 | 303 | const AValue: String; | |
| 304 | 304 | aFlags: TSynEditTextFlags = []; | |
| 305 | 305 | aCaretMode: TSynCaretAdjustMode = scamIgnore; | |
| 306 | 306 | aMarksMode: TSynMarksAdjustMode = smaMoveUp; | |
| 307 | 307 | aSelectionMode: TSynSelectionMode = smNormal ); | |
| 308 | 308 | ``` | |
| 309 | 309 | ||
| 310 | 310 | Examples: | |
| 311 | 311 | ||
| 312 | 312 | ``` pascal | |
| 313 | 313 | // Wstaw tekst w miejscu karetki | |
| 314 | 314 | SynEdit.InsertTextAtCaret('Tekst'); | |
| 315 | 315 | // Zamień tekst od punktu (x=2,y=10) do punktu (x=4,y=20) na Str | |
| 316 | 316 | SynEdit.TextBetweenPoints[Point(2,10), Point(4,20)] := Str; | |
| 317 | 317 | ``` | |
| 318 | 318 | ||
| 319 | 319 | ``` pascal | |
| 320 | 320 | // Usuń/zamień pojedynczy znak w pozycji karetki | |
| 321 | 321 | var | |
| 322 | 322 | p1, p2: TPoint; | |
| 323 | 323 | begin | |
| 324 | 324 | p1 := SynEdit.LogicalCaretXY; | |
| 325 | 325 | p2 := p1; | |
| 326 | 326 | // Oblicz pozycję bajtu następnego znaku | |
| 327 | 327 | p2.x := p2.x + UTF8CharacterLength(@SynEdit.LineText[p2.x]); | |
| 328 | 328 | // p1 wskazuje pierwszy bajt znaku, który ma zostać zastąpiony | |
| 329 | 329 | // p2 wskazuje pierwszy bajt znaku po ostatnim znaku, który można zastąpić | |
| 330 | 330 | // Zamień na „Tekst” (lub użyj pustego ciągu, aby usunąć) | |
| 331 | 331 | SynEdit.TextBetweenPoints[p1, p2] := 'Tekst'; | |
| 332 | 332 | ``` | |
| 333 | 333 | ||
| 334 | 334 | ### Zwiń/rozwiń za pomocą kodu | |
| 335 | 335 | ||
| 336 | 336 | - To jest wciąż w budowie. | |
| 337 | 337 | - Działa to tylko wtedy, gdy bieżący poddświetlacz składni obsługuje zwijanie kodu (szczegóły w [[SynEdit Highlighter]]). | |
| 338 | 338 | - Należy również pamiętać, że niektóre podświetlacze obsługują kilka niezależnych drzew zwijania. Np. w Pascalu możesz zwinąć słowa kluczowe (begin, end, class, procedura itp.), które jest głównym zwijaniem, ale możesz zwinąć też \$ifdef lub \$region, które jest zwijaniem drugorzędnym. | |
| 339 | 339 | - Zwijanie bieżącego zaznaczenia różni się także od zwijania słów kluczowych. | |
| 340 | 340 | ||
| 341 | 341 | Metody zwijania kodu: | |
| 342 | 342 | ||
| 343 | 343 | 1\) TSynEdit.CodeFoldAction | |
| 344 | 344 | ||
| 345 | 345 | Pasuje na podanej linii. Jeśli jest więcej niż jeden, zwija najbardziej do środka (najbardziej po prawej). Uwaga: to nie działa w przypadku zaznaczania ani w przypadku zakładek, które całkowicie się ukrywają / Wymagają przetestowania dla innych operacji zwijania. | |
| 346 | 346 | ||
| 347 | 347 | 2\) TSynEdit.FindNextUnfoldedLine | |
| 348 | 348 | ||
| 349 | 349 | 3\) TSynEdit.FoldAll / TSynEdit.UnfoldAll | |
| 350 | 350 | ||
| 351 | 351 | ### Zakładki | |
| 352 | 352 | ||
| 353 | 353 | - [Temat na forum dotyczący dodawania znaków marginesu (rynny) i kolorowych linii](http://forum.lazarus.freepascal.org/index.php/topic,14948.msg79794.html) | |
| 354 | 354 | ||
| 355 | 355 | ### Więcej informacji | |
| 356 | 356 | ||
| 357 | 357 | Dyskusje na forum, które zawierają informacje o SynEdit: | |
| 358 | 358 | ||
| 359 | 359 | - [Wyszukaj/zamień; wstawka korektorska; pozycja logiczna/fizyczna](http://forum.lazarus.freepascal.org/index.php/topic,19520.msg111158.html#msg111158) | |
| 360 | 360 | - [Różnica między SynEdit/SynMemo](http://forum.lazarus.freepascal.org/index.php/topic,19645.msg111962.html#msg111962) | |
| 361 | 361 | - [Działania myszy; wyłącz wklejanie środkowym kliknięciem](http://forum.lazarus.freepascal.org/index.php/topic,23997.msg144100.html#msg144100) | |
| 362 | 362 | - [Informacje o TSynEditMarkup](http://forum.lazarus.freepascal.org/index.php?topic=24842) | |
| 363 | 363 | ||
| 364 | 364 | ### Przykładowe aplikacje | |
| 365 | 365 | ||
| 366 | 366 | Przykładowe zastosowania znajdziesz w folderze "lazarus/examples/synedit". | |
| 367 | 367 | ||
| 368 | 368 | ### Dodawanie skrótów klawiszowych do wycinania/kopiowania/wklejania/itp | |
| 369 | 369 | ||
| 370 | 370 | Skróty klawiszowe można wdrożyć za pomocą poleceń SynEdit. | |
| 371 | 371 | ||
| 372 | 372 | ``` pascal | |
| 373 | 373 | uses | |
| 374 | 374 | SynEdit, SynEditKeyCmds; | |
| 375 | 375 | ||
| 376 | 376 | procedure TForm1.SynEdit1KeyDown(Sender: TObject; var Key: Word; | |
| 377 | 377 | Shift: TShiftState); | |
| 378 | 378 | begin | |
| 379 | 379 | if (Shift = [ssCtrl]) then | |
| 380 | 380 | case Key of | |
| 381 | 381 | VK_C: SynEdit1.CommandProcessor(TSynEditorCommand(ecCopy), ' ', nil); | |
| 382 | 382 | VK_V: SynEdit1.CommandProcessor(TSynEditorCommand(ecPaste), ' ', nil); | |
| 383 | 383 | VK_X: SynEdit1.CommandProcessor(TSynEditorCommand(ecCut), ' ', nil); | |
| 384 | 384 | end; | |
| 385 | 385 | end; | |
| 386 | 386 | ``` | |
| 387 | 387 | ||
| 388 | 388 | ## Dalszy rozwój, dyskusje | |
| 389 | 389 | ||
| 390 | 390 | - RTL (od prawej do lewej): rozpoczęty przez Mazena (częściowo zaimplementowany w systemie Windows) | |
| 391 | 391 | - SynEdit używa tylko UTF8; wersja ASCII/ANSI już nie istnieje. Czcionka jest wstępnie wybrana w zależności od systemu. Użytkownik może wybrać inną czcionkę, ale musi wtedy wybrać czcionkę o stałej szerokości. | |
| 392 | 392 | - automatyczny wybór czcionki o stałej szerokości: W tej chwili SynEdit zaczyna od czcionki „courier”. W tej chwili LCL TFont nie udostępnia właściwości umożliwiającej filtrowanie czcionek o stałej szerokości. | |
| 393 | 393 | - automatyczny wybór czcionki UTF-8: To samo co powyżej o stałej szerokości, ale także z czcionką UTF-8, tak aby np. umlauty były wyświetlane poprawnie. | |
| 394 | 394 | - Martwe klucze. Większość klawiatur obsługuje wpisywanie dwóch lub więcej klawiszy w celu utworzenia jednego znaku specjalnego (takiego jak znaki akcentowane lub umlaut). (Jest to obsługiwane przez zestaw widżetów LCL) | |
| 395 | 395 | - [[Redesign of the SynEdit component|Przeprojektowanie komponentu SynEdit]]. Podstawowym celem jest bardziej niezawodne wyświetlanie i nawigacja w tekście. Bardziej modułowe podejście pozwala również na lepszą integrację rozszerzeń i wyspecjalizowanych elementów sterujących do użytku poza Lazarusem. | |
| 396 | 396 | - [Zawijanie słów](http://bugs.freepascal.org/view.php?id=30395). Jest to eksperymentalna implementacja oparta na idei klas TextTrimmer/TabExpansion. Powiązany problem z bugtrakerem zawiera klasę i wyjaśnienie zmian wymaganych w innych plikach, aby działał. | |
| 397 | 397 | - Haki w przetwarzaniu kluczy/poleceń SynEdit. Na forum: <http://forum.lazarus-ide.org/index.php/topic,35592.msg243316.html#msg243316> | |
| 398 | 398 | ||
| 399 | 399 | ## Zobacz także | |
| 400 | 400 | ||
| 401 | 401 | - [[SynEdit Highlighter/pl|Podświetlacz SynEdit]] | |
| 402 | 402 | - [„Edytuj istniejący podświetlacz”: niemiecki wątek na forum pod adresem „lazarusforum.de”](http://www.lazarusforum.de/viewtopic.php?f=5&t=8723) | |
| 403 | 403 | - [[ATSynEdit]] | |
| 404 | 404 | ||
| 405 | 405 | --- | |
| 406 | 406 | *From the Free Pascal wiki, page "SynEdit/pl", as it stood on 2024-03-12 after a change by Slawek, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).* | |
| 407 | 407 | Category: Components | |
| 408 | 408 | Category: Lazarus | |
| 409 | 409 | Category: SynEdit |
