SynEdit/pl: what changed
Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.
Title: SynEdit/pl
| Old | New | Line | |
|---|---|---|---|
| 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 | + | ||
| 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 | + | ||
| 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 | + | ||
| 7 | + | Licencjonowany na tych samych warunkach, co oryginalny SynEdit (MPL lub GPL). | |
| 8 | + | ||
| 9 | + | ## Wersja oryginalna a Lazarus | |
| 10 | + | ||
| 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 | + | ||
| 13 | + | Duże rzeczy dodane do wersji Lazarus: | |
| 14 | + | ||
| 15 | + | - zwijanie bloków kodu | |
| 16 | + | - konfigurowalny boczny margines i jego części (tzw. rynna) | |
| 17 | + | - wspólny tekst pomiędzy kilkoma redaktorami | |
| 18 | + | - obsługa kodowania utf-8 | |
| 19 | + | - wtyczka do edycji synchronizacji | |
| 20 | + | - podstawowa obsługa RTL/LTR | |
| 21 | + | - konfiguracja myszy za pomocą MouseActions | |
| 22 | + | - przepisano różne moduły podświetlania/oznaczeń składni | |
| 23 | + | ||
| 24 | + | Bazy kodu wersji Delphi/Lazarus zostały niezależnie przeprojektowane. Pozostało bardzo niewiele do zrobienia. | |
| 25 | + | ||
| 26 | + | ## Port SynEdit 2.0 | |
| 27 | + | ||
| 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 | + | ||
| 30 | + | - [[SynEdit/port]] | |
| 31 | + | - [Github](https://github.com/rnapoles/strona) | |
| 32 | + | ||
| 33 | + | ## SynEdit w IDE | |
| 34 | + | ||
| 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 | + | ||
| 37 | + | ## Używanie SynEdit | |
| 38 | + | ||
| 39 | + | ### Podświetlacze składni | |
| 40 | + | ||
| 41 | + | - Istnieje kilka standardowych poświetlaczy składni (zobacz [[SynEdit tab/pl|karta SynEdit]] w [[Component Palette|palecie komponentów]]) | |
| 42 | + | - Istnieją podświetlacze skryptowe, które można dostosować do wielu innych formatów plików: | |
| 43 | + | - [[TSynAnySyn]] (standardowy, jest domyślnie na palecie komponentów) | |
| 44 | + | - [[TSynPositionHighlighter]] (standardowy, **nie** jest obecny palecie komponentów) | |
| 45 | + | - [[TSynUniHighlighter]] (standardowy, **nie** jest obecny na palecie komponentów) | |
| 46 | + | - SynFacilSyn ([Github](https://github.com/t-edson/SynFacilSyn)) | |
| 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 | + | - Możesz napisać nowy podświetlacz, zobacz informacje na [[SynEdit Highlighter/pl|SynEdit Highlighter]]. | |
| 49 | + | ||
| 50 | + | ### Znaczniki | |
| 51 | + | ||
| 52 | + | Znaczniki umożliwiają dodatkowe kolorowanie [[SynEdit Markup]] | |
| 53 | + | ||
| 54 | + | ### Oznaczenia | |
| 55 | + | ||
| 56 | + | Znaczniki zapewniają dodatkowe kolorowanie | |
| 57 | + | ||
| 58 | + | ### Edycja istniejącego podświetlacza | |
| 59 | + | ||
| 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 | + | ||
| 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 | + | ||
| 64 | + | ``` pascal | |
| 65 | + | (* standardowe *) | |
| 66 | + | { klamry } | |
| 67 | + | // ukośniki | |
| 68 | + | ``` | |
| 69 | + | ||
| 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 | + | ||
| 72 | + | > **Note:** Na wypadek, gdybyś coś zepsuł, sugeruję dodanie kilku komentarzy „NEW” i „/NEW”, ale nie jest to konieczne | |
| 73 | + | ||
| 74 | + | - Najpierw otwórz moduł „SynHighlighterPas”, który powinien znajdować się w katalogu SynEdit. | |
| 75 | + | - Ponieważ nie chcemy powodować niezgodności, tworzymy nowy rodzaj typu wyliczającego, który pomoże nam później zidentyfikować nasz komentarz: | |
| 76 | + | ||
| 77 | + | Np. pod deklaracją „tkTokenKind” napisz: | |
| 78 | + | ||
| 79 | + | ``` pascal | |
| 80 | + | {NEW} | |
| 81 | + | TtckCommentKind = (tckAnsi, tckBor, tckSlash); | |
| 82 | + | {/NEW} | |
| 83 | + | ``` | |
| 84 | + | ||
| 85 | + | - W deklaracji „TSynPasSyn” wyszukaj „FTokenID” i dodaj pomiędzy „FTokenID” a następnym polem | |
| 86 | + | ||
| 87 | + | ``` pascal | |
| 88 | + | {NEW} | |
| 89 | + | FCommentID: TtckCommentKind; | |
| 90 | + | {/NEW} | |
| 91 | + | //Tworzy to nowe pole, w którym możemy zapisać informację, jakiego rodzaju mamy komentarz | |
| 92 | + | ``` | |
| 93 | + | ||
| 94 | + | - W deklaracji „TSynPasSyn” wyszukaj „fCommentAttri” i dodaj następujący tekst między „fCommentAttri” a następnym polem | |
| 95 | + | ||
| 96 | + | ``` pascal | |
| 97 | + | {NEW} | |
| 98 | + | fCommentAttri_Ansi: TSynHighlighterAttributes; | |
| 99 | + | fCommentAttri_Bor: TSynHighlighterAttributes; | |
| 100 | + | fCommentAttri_Slash: TSynHighlighterAttributes; | |
| 101 | + | {/NEW} | |
| 102 | + | //Dzięki temu możemy zwrócić różne atrybuty dla każdego typu komentarza | |
| 103 | + | ``` | |
| 104 | + | ||
| 105 | + | - Następnie wyszukaj definicję konstruktora „TSynPasSyn”, która powinna brzmieć „constructor TSynPasSyn.Create(AOwner: TComponent);”. | |
| 106 | + | - Musimy utworzyć nasze nowe atrybuty, dlatego dodajemy nasze atrybuty gdzieś w konstruktorze (sugeruję po domyślnym „fCommentAttri”) | |
| 107 | + | ||
| 108 | + | ``` pascal | |
| 109 | + | (...) | |
| 110 | + | AddAttribute(fCommentAttri); | |
| 111 | + | {NEW} | |
| 112 | + | fCommentAttri_Ansi := TSynHighlighterAttributes.Create(SYNS_AttrComment+'_Ansi', SYNS_XML_AttrComment+'_Ansi'); //Ostatnie dwa ciągi to podpis i przechowywana nazwa | |
| 113 | + | //Jeśli chcesz mieć domyślne ustawienia swojego atrybutu, możesz np. dodać to: | |
| 114 | + | //fCommentAttri_Ansi.Background := clBlack; //Ustawiłoby to „Tło” na „clBlack” jako domyślne | |
| 115 | + | AddAttribute(fCommentAttri_Ansi); | |
| 116 | + | fCommentAttri_Bor := TSynHighlighterAttributes.Create(SYNS_AttrComment+'_Bor', SYNS_XML_AttrComment+'_Bor'); | |
| 117 | + | AddAttribute(fCommentAttri_Bor); | |
| 118 | + | fCommentAttri_Slash := TSynHighlighterAttributes.Create(SYNS_AttrComment+'_Slash', SYNS_XML_AttrComment+'_Slash'); | |
| 119 | + | AddAttribute(fCommentAttri_Slash); | |
| 120 | + | {/NEW} | |
| 121 | + | (...) | |
| 122 | + | ``` | |
| 123 | + | ||
| 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 | + | ||
| 126 | + | ``` pascal | |
| 127 | + | procedure TSynPasSyn.BorProc; | |
| 128 | + | (...) | |
| 129 | + | fTokenID := tkComment; | |
| 130 | + | {NEW} | |
| 131 | + | FCommentID:=tckBor; | |
| 132 | + | {/NEW} | |
| 133 | + | if rsIDEDirective in fRange then | |
| 134 | + | (...) | |
| 135 | + | ``` | |
| 136 | + | ||
| 137 | + | ``` pascal | |
| 138 | + | procedure TSynPasSyn.AnsiProc; | |
| 139 | + | begin | |
| 140 | + | fTokenID := tkComment; | |
| 141 | + | {NEW} | |
| 142 | + | FCommentID:=tckAnsi; | |
| 143 | + | {/NEW} | |
| 144 | + | (...) | |
| 145 | + | ``` | |
| 146 | + | ||
| 147 | + | ``` pascal | |
| 148 | + | procedure TSynPasSyn.RoundOpenProc; | |
| 149 | + | (...) | |
| 150 | + | fTokenID := tkComment; | |
| 151 | + | {NEW} | |
| 152 | + | FCommentID:=tckAnsi; | |
| 153 | + | {/NEW} | |
| 154 | + | fStringLen := 2; // długość "(*" | |
| 155 | + | (...) | |
| 156 | + | ``` | |
| 157 | + | ||
| 158 | + | ``` pascal | |
| 159 | + | procedure TSynPasSyn.SlashProc; | |
| 160 | + | begin | |
| 161 | + | if fLine[Run+1] = '/' then begin | |
| 162 | + | fTokenID := tkComment; | |
| 163 | + | {NEW} | |
| 164 | + | FCommentID:=tckSlash; | |
| 165 | + | {/NEW} | |
| 166 | + | if FAtLineStart then begin | |
| 167 | + | (...) | |
| 168 | + | ``` | |
| 169 | + | ||
| 170 | + | ``` pascal | |
| 171 | + | procedure TSynPasSyn.SlashContinueProc; | |
| 172 | + | (...) | |
| 173 | + | fTokenID := tkComment; | |
| 174 | + | {NEW} | |
| 175 | + | FCommentID:=tckSlash; | |
| 176 | + | {/NEW} | |
| 177 | + | while not(fLine[Run] in [#0, #10, #13]) do | |
| 178 | + | (...) | |
| 179 | + | ``` | |
| 180 | + | ||
| 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 | + | ||
| 183 | + | ``` pascal | |
| 184 | + | function TSynPasSyn.GetTokenAttribute: TSynHighlighterAttributes; | |
| 185 | + | begin | |
| 186 | + | case GetTokenID of | |
| 187 | + | tkAsm: Result := fAsmAttri; | |
| 188 | + | {OLD | |
| 189 | + | tkComment: Result := fCommentAttri; //To jest komentarz i stanowi kopię zapasową, więc zostanie zignorowany | |
| 190 | + | /OLD} | |
| 191 | + | {NEW} | |
| 192 | + | tkComment: begin | |
| 193 | + | if (FCommentID = tckAnsi) then | |
| 194 | + | Result := fCommentAttri_Ansi //To jest typ standardowy AnsiComment | |
| 195 | + | else | |
| 196 | + | if (FCommentID = tckBor) then | |
| 197 | + | Result := fCommentAttri_Bor //To jest typ klamrowy BorComment | |
| 198 | + | else | |
| 199 | + | if (FCommentID = tckSlash) then | |
| 200 | + | Result := fCommentAttri_Slash //To jest typ ukośnikowy SlashComment | |
| 201 | + | else | |
| 202 | + | Result := fCommentAttri //Jeśli nasz kod w jakiś sposób zawiódł, przywróć ustawienia domyślne | |
| 203 | + | end; | |
| 204 | + | {/NEW} | |
| 205 | + | tkIDEDirective: begin | |
| 206 | + | (...) | |
| 207 | + | ``` | |
| 208 | + | ||
| 209 | + | Jeśli używasz lazarusa, po prostu zainstaluj ponownie pakiet SynEdit, jeśli nie, przekompiluj swój projekt/pakiet. | |
| 210 | + | ||
| 211 | + | **GOTOWE ! Mówię poważnie! Twój kod jest teraz gotowy na rozróżnianie różnych typów komentarzy.** | |
| 212 | + | ||
| 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 | + | ||
| 215 | + | ### Realizacja wtyczek | |
| 216 | + | ||
| 217 | + | Istnieją 3 wtyczki uzupełniające dla SynEdit: | |
| 218 | + | ||
| 219 | + | [[TSynCompletion]] | |
| 220 | + | ||
| 221 | + | - Oferuje listę słów w rozwijanym menu za pomocą kombinacji klawiszy skrótu (domyślnie: Ctrl-Spacja). | |
| 222 | + | - Używane w IDE do uzupełniania identyfikatora. | |
| 223 | + | - Zawarte w przykładach. | |
| 224 | + | - Dostępne na palecie komponentów (od wersji 0.9.3x). | |
| 225 | + | ||
| 226 | + | Przykładowy kod wywołujący programowo wyskakujące okienko uzupełniania (tj. bez naciskania skrótu klawiaturowego): | |
| 227 | + | ||
| 228 | + | ``` pascal | |
| 229 | + | YourSynEdit.CommandProcessor(YourSynCompletion.ExecCommandID, '', nil) | |
| 230 | + | ``` | |
| 231 | + | ||
| 232 | + | [[TSynAutoComplete]] | |
| 233 | + | ||
| 234 | + | - Zastępuje bieżący token fragmentem tekstu. **Nie** jest to interaktywne. **Nie** posiada menu rozwijanego. | |
| 235 | + | - Zawarte w przykładach. | |
| 236 | + | - Dostępne na palecie komponentów. | |
| 237 | + | ||
| 238 | + | [[TSynEditAutoComplete]] | |
| 239 | + | ||
| 240 | + | - Podstawowy moduł szablonów. **Nie** posiada menu rozwijanego. | |
| 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 | + | - **Nie** ujęte w przykładach. | |
| 243 | + | ||
| 244 | + | Todo: Należy udokumentować różnice pomiędzy 2. i 3. poziomem. Może uda się je połączyć. | |
| 245 | + | ||
| 246 | + | ### Logiczna/fizyczna pozycja karetki | |
| 247 | + | ||
| 248 | + | SynEdit oferuje położenie karetki (migającego kursora tekstowego) w 2 różnych formach: | |
| 249 | + | ||
| 250 | + | - Fizyczne X/Y: Odpowiada pozycji wizualnej (na płótnie) karetki, | |
| 251 | + | - Logiczne X/Y: Odpowiada przesunięciu bajtów tekstu. | |
| 252 | + | ||
| 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 | + | ||
| 255 | + | Współrzędna fizyczna | |
| 256 | + | To pozycja w siatce wyświetlania (pomijająca przewijanie). Przy czym: | |
| 257 | + | ||
| 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 | + | ||
| 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 | + | ||
| 262 | + | Współrzędna logiczna | |
| 263 | + | To przesunięcie bajtu w ciągu znaków przechowującym linię. | |
| 264 | + | ||
| 265 | + | litera „a” ma 1 bajt i zwiększa się o 1 | |
| 266 | + | ||
| 267 | + | litera „â” ma 2 (lub 3) bajty i zwiększa się o tą wartość | |
| 268 | + | ||
| 269 | + | tab ma 1 bajt i zwiększa się o 1. | |
| 270 | + | ||
| 271 | + | Żaden z tych współrzędnych nie podaje pozycji w znakach/punktach kodowych UTF8 (tak jak np. Utf8Copy czy Utf8Length). | |
| 272 | + | ||
| 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 | + | ||
| 275 | + | ||
| 276 | + | grid-X-in-visible-part-of-synedit := PhysicalX - SynEdit.LeftChar + 1 | |
| 277 | + | ||
| 278 | + | grid-y-in-visible-part-of-synedit := SynEdit.RowToScreenRow(PhysicalY); // obejmuje zwijanie bloków | |
| 279 | + | ||
| 280 | + | użyj ScreenRowToRow do odwrotnych wyliczeń | |
| 281 | + | ||
| 282 | + | ### Zmiana tekstu za pomocą kodu | |
| 283 | + | ||
| 284 | + | > **Warning:** Zmiana tekstu za pomocą właściwości <u>SynEdit.Lines</u> <u>nie działa w przypadku funkcji cofnij/ponów. </u> | |
| 285 | + | ||
| 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 | + | ||
| 288 | + | ``` pascal | |
| 289 | + | SynEdit.Lines[0] := 'Text'; // pierwsza line | |
| 290 | + | ``` | |
| 291 | + | ||
| 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 | + | ||
| 294 | + | Aby zmodyfikować zawartość SynEdit i pozwolić użytkownikowi na cofnięcie akcji, użyj następujących metod: | |
| 295 | + | ||
| 296 | + | ``` pascal | |
| 297 | + | procedure InsertTextAtCaret(aText: String; aCaretMode: TSynCaretAdjustMode = scamEnd); | |
| 298 | + | property TextBetweenPoints[aStartPoint, aEndPoint: TPoint]: String // Logiczna pozycja | |
| 299 | + | read GetTextBetweenPoints write SetTextBetweenPointsSimple; | |
| 300 | + | property TextBetweenPointsEx[aStartPoint, aEndPoint: TPoint; CaretMode: TSynCaretAdjustMode]: String | |
| 301 | + | write SetTextBetweenPointsEx; | |
| 302 | + | procedure SetTextBetweenPoints(aStartPoint, aEndPoint: TPoint; | |
| 303 | + | const AValue: String; | |
| 304 | + | aFlags: TSynEditTextFlags = []; | |
| 305 | + | aCaretMode: TSynCaretAdjustMode = scamIgnore; | |
| 306 | + | aMarksMode: TSynMarksAdjustMode = smaMoveUp; | |
| 307 | + | aSelectionMode: TSynSelectionMode = smNormal ); | |
| 308 | + | ``` | |
| 309 | + | ||
| 310 | + | Examples: | |
| 311 | + | ||
| 312 | + | ``` pascal | |
| 313 | + | // Wstaw tekst w miejscu karetki | |
| 314 | + | SynEdit.InsertTextAtCaret('Tekst'); | |
| 315 | + | // Zamień tekst od punktu (x=2,y=10) do punktu (x=4,y=20) na Str | |
| 316 | + | SynEdit.TextBetweenPoints[Point(2,10), Point(4,20)] := Str; | |
| 317 | + | ``` | |
| 318 | + | ||
| 319 | + | ``` pascal | |
| 320 | + | // Usuń/zamień pojedynczy znak w pozycji karetki | |
| 321 | + | var | |
| 322 | + | p1, p2: TPoint; | |
| 323 | + | begin | |
| 324 | + | p1 := SynEdit.LogicalCaretXY; | |
| 325 | + | p2 := p1; | |
| 326 | + | // Oblicz pozycję bajtu następnego znaku | |
| 327 | + | p2.x := p2.x + UTF8CharacterLength(@SynEdit.LineText[p2.x]); | |
| 328 | + | // p1 wskazuje pierwszy bajt znaku, który ma zostać zastąpiony | |
| 329 | + | // p2 wskazuje pierwszy bajt znaku po ostatnim znaku, który można zastąpić | |
| 330 | + | // Zamień na „Tekst” (lub użyj pustego ciągu, aby usunąć) | |
| 331 | + | SynEdit.TextBetweenPoints[p1, p2] := 'Tekst'; | |
| 332 | + | ``` | |
| 333 | + | ||
| 334 | + | ### Zwiń/rozwiń za pomocą kodu | |
| 335 | + | ||
| 336 | + | - To jest wciąż w budowie. | |
| 337 | + | - Działa to tylko wtedy, gdy bieżący poddświetlacz składni obsługuje zwijanie kodu (szczegóły w [[SynEdit Highlighter]]). | |
| 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 | + | - Zwijanie bieżącego zaznaczenia różni się także od zwijania słów kluczowych. | |
| 340 | + | ||
| 341 | + | Metody zwijania kodu: | |
| 342 | + | ||
| 343 | + | 1\) TSynEdit.CodeFoldAction | |
| 344 | + | ||
| 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 | + | ||
| 347 | + | 2\) TSynEdit.FindNextUnfoldedLine | |
| 348 | + | ||
| 349 | + | 3\) TSynEdit.FoldAll / TSynEdit.UnfoldAll | |
| 350 | + | ||
| 351 | + | ### Zakładki | |
| 352 | + | ||
| 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 | + | ||
| 355 | + | ### Więcej informacji | |
| 356 | + | ||
| 357 | + | Dyskusje na forum, które zawierają informacje o SynEdit: | |
| 358 | + | ||
| 359 | + | - [Wyszukaj/zamień; wstawka korektorska; pozycja logiczna/fizyczna](http://forum.lazarus.freepascal.org/index.php/topic,19520.msg111158.html#msg111158) | |
| 360 | + | - [Różnica między SynEdit/SynMemo](http://forum.lazarus.freepascal.org/index.php/topic,19645.msg111962.html#msg111962) | |
| 361 | + | - [Działania myszy; wyłącz wklejanie środkowym kliknięciem](http://forum.lazarus.freepascal.org/index.php/topic,23997.msg144100.html#msg144100) | |
| 362 | + | - [Informacje o TSynEditMarkup](http://forum.lazarus.freepascal.org/index.php?topic=24842) | |
| 363 | + | ||
| 364 | + | ### Przykładowe aplikacje | |
| 365 | + | ||
| 366 | + | Przykładowe zastosowania znajdziesz w folderze "lazarus/examples/synedit". | |
| 367 | + | ||
| 368 | + | ### Dodawanie skrótów klawiszowych do wycinania/kopiowania/wklejania/itp | |
| 369 | + | ||
| 370 | + | Skróty klawiszowe można wdrożyć za pomocą poleceń SynEdit. | |
| 371 | + | ||
| 372 | + | ``` pascal | |
| 373 | + | uses | |
| 374 | + | SynEdit, SynEditKeyCmds; | |
| 375 | + | ||
| 376 | + | procedure TForm1.SynEdit1KeyDown(Sender: TObject; var Key: Word; | |
| 377 | + | Shift: TShiftState); | |
| 378 | + | begin | |
| 379 | + | if (Shift = [ssCtrl]) then | |
| 380 | + | case Key of | |
| 381 | + | VK_C: SynEdit1.CommandProcessor(TSynEditorCommand(ecCopy), ' ', nil); | |
| 382 | + | VK_V: SynEdit1.CommandProcessor(TSynEditorCommand(ecPaste), ' ', nil); | |
| 383 | + | VK_X: SynEdit1.CommandProcessor(TSynEditorCommand(ecCut), ' ', nil); | |
| 384 | + | end; | |
| 385 | + | end; | |
| 386 | + | ``` | |
| 387 | + | ||
| 388 | + | ## Dalszy rozwój, dyskusje | |
| 389 | + | ||
| 390 | + | - RTL (od prawej do lewej): rozpoczęty przez Mazena (częściowo zaimplementowany w systemie Windows) | |
| 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 | + | - 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 | + | - 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 | + | - 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 | + | - [[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 | + | - [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 | + | - Haki w przetwarzaniu kluczy/poleceń SynEdit. Na forum: <http://forum.lazarus-ide.org/index.php/topic,35592.msg243316.html#msg243316> | |
| 398 | + | ||
| 399 | + | ## Zobacz także | |
| 400 | + | ||
| 401 | + | - [[SynEdit Highlighter/pl|Podświetlacz SynEdit]] | |
| 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 | + | - [[ATSynEdit]] | |
| 404 | + | ||
| 405 | + | --- | |
| 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 | + | Category: Components | |
| 408 | + | Category: Lazarus | |
| 409 | + | Category: SynEdit |
