Błąd "Access Violation" podczas obsługi ComboBox

Błąd "Access Violation" podczas obsługi ComboBox
KL
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 4 lata
  • Postów:92
0

Witam.
W programie wybieram z ComboBox nazwę klienta, jeśli wpiszę nieistniejącą nazwę to tworzy nowy i dodaje go do bazy k1. Pola ComboBox-a to nagłówki bazy k1.
Zwykle działa dobrze, lecz zdarzają się sytuacje (raz na 100) że program wywala się z komunikatem "Access violation at address ......".
Aby sprawdzić punkt błędu dołożyłem zmienne xb1 i xb2. Na ich podstawie wiem, że warunek if nie jest spełniany, lecz n otrzymuje wartość -1. Dlaczego?
Oto fragment kodu:

Kopiuj
   if CKlnt.Items.IndexOf(CKlnt.Text)=-1 then begin // dodanie nowego klienta
       xb2:=xb1;
       xb1:=62;
       n:=length(k1);
       SetLength(k1,n+1);
       CKlnt.Items.Add(CKlnt.Text);
   end else n:=CKlnt.ItemIndex;                 
   xb2:=xb1;
   xb1:=63;
   xb:=IntToStr(n)+' / '+IntToStr(length(k1));

Obsługa błędu zapisuje mi takie dane: "1.6.0.2>18>63|65535 / 208:Vcl.ExtCtrls.TPanel: Access violation at address 0040B876 in module 'xxx.exe'. Write of address 031A7618". Dane to wersja pliku>xb2>xb1 | xb: opis błędu.

edytowany 4x, ostatnio: Klakierus
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 4 godziny
  • Lokalizacja:Tuchów
  • Postów:12166
0

Ten kod jest tak pokręcony i nieczytelny (i źle sformatowany), że należy go usunąć i napisać od nowa;

Aby sprawdzić punkt błędu dołożyłem zmienne xb1 i xb2.

Naucz się sensownie nazywać elementy programu, bo nazwa pokroju xb1 kompletnie nic nie mówi o swoim przeznaczeniu; Masz kupkę zmiennych i absolutnie żadna z nich nie jest prawidłowo nazwana;

Na ich podstawie wiem, że warunek if nie jest spełniany, lecz n otrzymuje wartość -1. Dlaczego?

A skąd my mamy to wiedzieć?

Do określenia wartości n używasz zmiennej k1, a ustalenia wartości tej zmiennej nie pokazałeś.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 3x, ostatnio: flowCRANE
KL
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 4 lata
  • Postów:92
0

A co nazwa zmiennej ma Ci mówić?
Jaka różnica w działaniu będzie jeśli nazwę zmienne zamiast xb1, xb2 na przykład ostatni_punkt_pracy i przedostatni_punkt_pracy?
K1 jest to tablica, a n służy do odczytania/zapisania n-tego jej elementu.
To że ktoś pisze inaczej niż Ty i nie nazywa zmiennych pełnymi nazwami, to nie znaczy że kod trzeba napisać od nowa.
Nawet nie zerknąłeś o co w tym chodzi, tylko przyczepiłeś się o nazwy zmiennych itp.
a ważne są tylko 2 linijki: (wszystko z xb można usunąć, gdyż dodałem to szukając gdzie program wywala się).

Kopiuj
 if  CKlnt.Items.IndexOf(CKlnt.Text)=-1 then {}
 else n:=CKlnt.ItemIndex; 

Według mnie po tej linii n powinien wskazywać istniejący element tabeli lub jeśli nie istnieje to stworzyć nowy i go wskazać, jednak czasem warunek if nie jest spełniony (indeks ComboBox-a ma wartość różną od -1), a wykonanie n:=CKlnt.ItemIndex powoduje że n ma wartość -1. Nie wiem dlaczego taka sytuacja powstaje. Później gdy przypisuję wartości elementowi k1[n] to oczywiście mam Access violation.

edytowany 7x, ostatnio: Klakierus
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 4 godziny
  • Lokalizacja:Tuchów
  • Postów:12166
0

Skoro wiesz lepiej oraz lepiej potrafisz pisać kod i go formatować to po co zadajesz pytania na forum?

A co nazwa zmiennej ma Ci mówić?

Ma mówić o tym, jakie dane w sobie zawiera i czym te dane są;

Jaka różnica w działaniu będzie jeśli nazwę zmienne zamiast xb1, xb2 na przykład ostatni_punkt_pracy i przedostatni_punkt_pracy?

A jaka jest różnica pomiędzy nazwaniem zmiennej DefaultFormatSettings a ssdh22? Hmm?

To że ktoś pisze inaczej niż Ty i nie nazywa zmiennych pełnymi nazwami, to nie znaczy że kod trzeba napisać od nowa.

Ten kod wygląda potwornie i jest niezgodny z jakimikolwiek wytycznymi dotyczącymi pisania czytelnego kodu w Delphi (np. z tym - Object Pascal Style Guide); Im bardziej zasyfisz kod, tym trudniej będzie go analizować, więc i trudniej będzie rozwiązać Twój problem; A to Twój problem, nie nasz, więc powinieneś zwiększać szanse na rozwiązanie go przez kogoś, kto tego kodu nie pisał, a nie na odwrót;

Poza tragiczną czytelnością, kod ten jest stanowczo przekombinowany, o czym napisałem na końcu posta;

Nawet nie zerknąłeś o co w tym chodzi, tylko przyczepiłeś się o nazwy zmiennych itp.

Nie zerknąłem? A skąd wiedziałem, że zmienna n otrzymuje długość zmiennej k, która to nie wiadomo jakiego jest typu i jakie dane zawiera? Hmm?

a ważne są tylko 2 linijki: (wszystko z xb można usunąć, gdyż dodałem to szukając gdzie program wywala się).

Skoro ważne są tylko dwie linijki, to po co wstawiłeś ich dziesięć?

Według mnie po tej linii n powinien wskazywać istniejący element tabeli lub (warunek if) stworzyć nowy i go wskazać, jednak czasem ma wartość -1, i nie wiem dlaczego taka sytuacja powstaje.

Według mnie brak Ci podstawowej znajomości VCL i jakichkolwiek chęci do samodzielnego rozwiązania problemu; Wystarczyło w pustej aplikacji okienkowej postawić ComboBox i sprawdzić co zawiera jego ItemIndex w przypadku gdy wartość wpisana jest ręcznie oraz gdy wartość została wybrana z listy; To wystarczyło, aby dojść do poniższego wniosku:

Kopiuj
if ComboBox1.ItemIndex = -1 then
  // wartość wpisana ręcznie
else
  // wartość wybrana z rozwijalnej listy

Następnym razem zastanów się nad swoim postępowaniem i nad tym jak pisać czytelny kod, zamiast miotać się o to, że ktoś zwrócił Ci uwagę - a uwaga została zwrócona jak najbardziej słusznie, co inni użytkownicy pracujący z tym językiem z całą pewnością mogą potwierdzić.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 5x, ostatnio: flowCRANE
KL
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 4 lata
  • Postów:92
0

Nie wiem lepiej, i nie chcę się kłócić, dlatego pytam, gdyż według mnie taka sytuacja nie powinna zaistnieć, a powstaje na pewno w tym fragmencie.
Wiem jak działa ItemIndex. Zgadza się zagmatwałem z IndexOf.
Dziękuję za pomoc.

edytowany 1x, ostatnio: Klakierus
GS
  • Rejestracja:ponad 14 lat
  • Ostatnio:około 7 godzin
1

raz na 100 razy , czyli raz na 100 uruchomień aplikacji czy raz na 100 razy użycia tego kodu podczas jednego uruchomienia aplikacji ?
jeśli to pierwsze (100 uruchomień), to być może nie zerujesz na starcie rozmiaru tablicy k1, czyli brak setlength(k1,0). Chociaż w takiej sytuacji bardziej prawdopodobny był by wyjątek 'index out of range' . Radził bym też sprawdzić w opcjach projektu czy parametr 'Range checking' jest ustawiony na True. Bo bez tego, robiąc podstawienie pod element tablicy będący poza jej rozmiarem nie dostaniesz żadnego wyjątku, ale możesz nadpisać w pamięci inne zmienne czy obiekty i w następstwie tego próba odwołania się do takich nadpisanych obiektów może skutkować wyjątkiem "Acces violation ..."

edytowany 1x, ostatnio: grzegorz_so
KL
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 4 lata
  • Postów:92
0

raz na kilkadziesiąt razy użycia tego kodu, czasem po paru godzinach, około 80 - 100 wywołań, lecz zawsze w tym miejscu. Range checking był na false.

PD
  • Rejestracja:ponad 22 lata
  • Ostatnio:około godziny
2
Kopiuj
n:=CKlnt.Items.IndexOf(CKlnt.Text);
if n=-1 then 
begin
  //dopisz klienta i do n przypisz nowe id
end; 

pozdrawiam
paweld
GS
tak, to zdecydowanie lepsze i czytelniejsze, ale myślę że problemem jest niewłaściwe zarządzanie tablicą k1 z wyłączoną kontrolą "Range check"
PD
wg mnie, po tym co napisał @Klakierus problemem jest to, że użytkownik wpisuje nazwę w comboboxie, nazwa na liście istnieje, ale itemindex=-1. Więc po prostu nie trzeba pobierać wtedy itemindex tylko pobrać index wg nazwy, Tak jak to robi przy sprawdzeniu czy nazwa istnieje.
GS
jeśli nazwa istnieje na liście Items to items.indexof('....') nie będzie równe -1
GS
@PAWEŁ Dmitruk, ok:) już to widzę , masz rację i w tym zapewne jest przyczyna błędu :)
KL
sorki, ale ja już zdurniałem, gdzie jest przyczyna błędu, bo niestety nie widzę
KL
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 4 lata
  • Postów:92
0

Dziękuję za pomoc, na pewno Wasze przykłady tego błędu nie wygenerują.
Jednakże gdy zmieniłem Range Check na true, to uruchomienie programu przy kompilacji Release powoduje błąd

Kopiuj
Project xxx raised exception class ERangeError with message 'Range check error'.

Przy kompilacji Debug nie mam błędu.

edytowany 1x, ostatnio: flowCRANE
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 4 godziny
  • Lokalizacja:Tuchów
  • Postów:12166
0

@Klakierus: podaj aktualnie testowaną wersję kodu i dokładnie wskaż linijkę, która powoduje wyjątek; Aby to określić, najlepiej będzie postawić break point przed tym warunkiem i klawiszami F7 i F8 sprawdzić kolejne linijki.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 2x, ostatnio: flowCRANE
GS
  • Rejestracja:ponad 14 lat
  • Ostatnio:około 7 godzin
0

w jakim środowisku kompilujesz projekt

podaj cały kod

Project xxx raised exception class ERangeError with message 'Range check error'. czyli jak przypuszczałem, próbujesz odwołać się do elementów wykraczających poza rozmiar tablicy

edytowany 1x, ostatnio: flowCRANE
flowCRANE
Nie klep trzech postów pod rząd - edytuj jak trzeba coś dopisać czy poprawić ;)
GS
gdzie widzisz trzy posty ?
flowCRANE
Połączyłem je - każdy paragraf z tego posta to był osobny post; Sugerujesz błąd Coyote? :]
KL
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 4 lata
  • Postów:92
0

Kompilacja: Win32, pracuję na Win7 64bit.
Sorki Furious programming, ale o co pytasz? Jaka wersja kodu?

Cały kod? Tego jest w głównym 2000 linii + 8 form po kilkaset linii.

edytowany 1x, ostatnio: flowCRANE
GS
  • Rejestracja:ponad 14 lat
  • Ostatnio:około 7 godzin
0

pytam o środowisko ? Delhpi w wersja xxx , Lazarus ??

KL
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 4 lata
  • Postów:92
0

RAD Studio 10 Seattle
Kod jest od zmiany w Combo, a błąd powstaje już przy starcie, szukam OnCreate, dlaczego na debug jest ok?

Kopiuj
    if CKlnt.ItemIndex=-1 then begin // dodanie nowego klienta
       xb2:=xb1;
       xb1:=62;
       n:=length(k1);
       SetLength(k1,n+1);
       CKlnt.Items.Add(CKlnt.Text);
   end else n:=CKlnt.ItemIndex;       
   xb2:=xb1;
   xb1:=63;
   xb:=IntToStr(n)+' / '+IntToStr(length(k1));
   k1[n].naz:=CKlnt.Text;
edytowany 2x, ostatnio: Klakierus
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 4 godziny
  • Lokalizacja:Tuchów
  • Postów:12166
0
Klakierus:

Sorki Furious programming, ale o co pytasz? Jaka wersja kodu?

Zakładam, że po naszych sugestiach coś w swoim kodzie zmieniłeś, więc pasuje podać kod który teraz testujesz i króty nadal powoduje błąd;

Cały kod? Tego jest w głównym 2000 linii + 8 form po kilkaset linii.

Nie cały kod, bo w każdej linijce całego kodu błąd nie występuje - tylko ten fragment, który rzuca wyjątek.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 1x, ostatnio: flowCRANE
KL
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 4 lata
  • Postów:92
0

Ok, tylko ze nie mogę "postawić break point przed tym warunkiem i klawiszami F7 i F8 sprawdzić kolejne linijki." bo w debug jest OK, wywala w Release. Szukam wyłączając fragmenty kodu.

flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 4 godziny
  • Lokalizacja:Tuchów
  • Postów:12166
0

W takim razie wyjątek nie pochodzi z kodu, którego o wyjątek podejrzewasz; Poza tym w dalszym ciągu nie podałeś kodu który ten rzekomy wyjątek powoduje.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 1x, ostatnio: flowCRANE
GS
  • Rejestracja:ponad 14 lat
  • Ostatnio:około 7 godzin
0

sprawdź czy w opcjach środowiska IDE "DebuggerOptions -> Embarcadero Debuggers -> Language Exceptions " nie masz na liście "Excepions type to ignore" wyjątku ERangeError

flowCRANE
Gdyby tak było to wyjątku w ogóle by nie widział.
GS
i tak jest, bo w środowisku IDE nie widać wyjątku, a wyjątek jest po odpaleniu aplikacji poza środowiskiem IDE . Ustawienie o którym piszę dotyczy tylko aplikacji odpalonej w środowisku IDE, które ignoruje wyjątki z listy
flowCRANE
Gdyby tak było to... miałbyś rację :P
GS
@furious programming: "Gdyby tak było to... " ... a nie jest ?
flowCRANE
Wcześniejszy komentarz jest żartobliwy - tak jest, przyznałem Ci rację jak zakapowałem o co chodzi :D
KL
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 4 lata
  • Postów:92
0

Tak, już wszystko OK.
Po pierwsze chcąc robić i szybko odpowiadać na posty, zapomniałem że opcje Range checking należy oddzielnie ustawić dla debug i release. Gdy naprawiłem ten błąd, poszło z górki, i znalazłem moje błędy.
Bardzo dziękuję za Waszą pomoc, bez niej dalej bym siedział z ręką w nocniku.
Pozdrawiam i życzę miłego wieczoru.

flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 4 godziny
  • Lokalizacja:Tuchów
  • Postów:12166
0

Czyli podsumowując - zamiast naprawić błąd spowodowany odwoływaniem się do elementu o nieprawidłowym indeksie, Ty wyłączyłeś obsługę tego błędu, ochodząc problem na około.

Uważasz, że to prawidłowe podejście?


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 3x, ostatnio: flowCRANE
flowCRANE
@Klakierus: to o piwie było do mnie? Poza tym ja się nie denerwuję bo nie mam o co (to nie mój problem), a Ty nie rozwiązałeś problemu tylko go zamaskowałeś ustawieniami środowiska. Ale rób sobie jak chcesz - to Twój program.
flowCRANE
Widzę że nie ma sensu dalej tego ciągnąć, bo jak się uprzesz tych ustawień to nie przegada.
KL
Nie rozumiem Cie, ja wcale nie maskowałem celowo, przez to ustawienie miałem problem, gdybym wiedział o tym to bym to włączył i sam rozwiązał problem. Dla mnie było niemożliwe, aby po wykonaniu tych 2 linijek if-else n wynosiło -1 i stąd ten post
flowCRANE
Zrozum, nieważne czy celowo czy przypadkiem, jeśli wyjątek występuje to znaczy, że kod napisany jest źle, a pozbywanie się wyjątków poprzez zmienę ustawień środowiska jest obejściem problemu i mogą pojawić się kolejne problemy w innym miejscu programu; Natomiast kodu podałeś stanowczo za mało żeby jasno wskazać problem. Ale to już nieważne - dajmy temu spokój. Najważniejsze, że jesteś zadowolony.
flowCRANE
To nie oznacza, że nie możesz nauczyć się czegoś nowego, czyli przede wszystkim zgodnego z wytycznymi formatowania kodu. Podałem Ci link do artykułu - zobacz sobie do niego, jest w nim wszystko co potrzeba wiedzieć.
KL
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 4 lata
  • Postów:92
0

Niestety było odwrotnie. Te ustawienia były domyślne, od zainstalowania Delphi nie zmieniałem ich. Przez to szukałem błędu tam gdzie go nie było. Teraz mam Range settings na true, lecz czcionka jest pogrubiona, co jak sądzę informuje użytkownika o wprowadzonych zmianach.

edytowany 1x, ostatnio: Klakierus
GS
  • Rejestracja:ponad 14 lat
  • Ostatnio:około 7 godzin
2

@Klakierus: na etapie budowania i testowania aplikacji ustawienie na True parametru środowiska o nazwie "Range checking" jest konieczne. Może skutkuje to jakimś spadkiem wydajności ale pozwala wyłapać wiele błędów. Po dokładnym przetestowaniu projektu i przed udostępnieniem aplikacji userowi można tę opcję wyłączyć, ale nie polecał bym tego. Jeśli aplikacja nie jest czasowo krytyczna (mam na myśli szybkość działania) to pozostawił bym tę opcję jako True również w aplikacji finalnej (Release)

KL
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 4 lata
  • Postów:92
0

Dzięki Grzegorz_so, a co jeszcze należałoby przestawić w opcjach, abym w przyszłości nie miał podobnych przygód?

GS
  • Rejestracja:ponad 14 lat
  • Ostatnio:około 7 godzin
0

możesz jeszcze włączyć na true "I/O checking"oraz "Overflow checking"
pierwsze dotyczy błędów dostępu do urządzeń we/wy a drugie dotyczy obliczeń numerycznych

edytowany 1x, ostatnio: grzegorz_so
KL
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 4 lata
  • Postów:92
0

Dzięki za pomoc.

edytowany 1x, ostatnio: Klakierus
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)