Víceřádková editace
dEDITMULTI adresa&, vyzva$, sirka%, vyska%, max_delka_textu%
Nejsložitějším příkazem definujícím část dialogu je bezesporu dEDITMULTI. Tento příkaz vloží do dialogu oblast pro editaci víceřádkového textu. Prvním parametrem příkazu je adresa pole, do kterého budou uložena data; po něm následuje text výzvy a šířka a výška okna ve znacích. Posledním parametrem je nejvyšší povolená délka textu.
Text je ukládán přímo do oblasti v paměti; první 4 byte této oblasti obsahují délku textu jako 32bitové číslo a po nich začíná vlastní text, jehož délka je menší nebo rovna poslední proměnné na řádku.
Oblast v paměti je možné rezervovat příkazem ALLOC, nebo použít - pro jednoduchost - pole 32bitových čísel jako v následujícím příkladu. Funkce ADDR(pole&(1)) vrátí adresu prvního prvku pole pro použití na místě prvního parametru. Pole musí být dostatečně veliké, aby do něj bylo možné bezpečně uložit nejvyšší povolenou délku textu. Protože klávesa Enter se používá k přechodu na nový řádek, nesmíme zapomenout uvést v dialogu tlačítka (příkaz dBUTTONS), aby jej bylo možné ukončit i jinak než klávesou Esc.
PROC multi: LOCAL text&(500) text&(1)=0 : REM -- žádný text -- dINIT "Jednoduchý editor" dEDITMULTI ADDR(text&(1)), "Text", 30, 6, (500-1)*4 dBUTTONS "Konec", %e, "Ulož", %s DIALOG ENDP
Do tohoto víceřádkového pole můžeme text nejen zapisovat, ale i používat klávesové zkratky pro kopírování a vkládání textu. Text není možné nijak formátovat, nicméně můžeme používat obecné znaky jako tabulátor (ASCII $09), konec odstavce ($06), konec řádky ($07), nedělitelnou mezeru ($0F) a další - podívejte se do manuálu na příslušné heslo.
Text do pole můžeme vložit například použitím příkazu POKEB, který uloží na adresu, jež je jeho prvním parametrem, byte, který je jeho druhým parametrem. Nesmíme zapomenout uložit do prvních 4 byte pole aktuální délku textu.
PROC multi2: LOCAL text&(65), t$(255), i%, addr& t$="Toto je vzorový text..." text&(1)=LEN(t$) i%=1 addr&=ADDR(text&(2)) WHILE i%<=text&(1) POKEB addr&, ASC(MID$(t$, i%, 1)) i%=i%+1 addr&=addr&+1 ENDWH dINIT "Jednoduchý editor" dEDITMULTI ADDR(text&(1)), "", 30, 6, 255 dBUTTONS "Konec", %e, "Ulož", %s DIALOG ENDP
Po skončení dialogu je pak v prvních 4 byte uložena aktuální délka textu v rámečku a poté následuje vlastní text. Text můžeme číst po znacích funkcí PEEKB, které předáváme adresu v paměti a která vrací byte, který je na ní uložen.
PROC multi3: LOCAL text&(65), i%, addr& text&(1)=0 dINIT "Jednoduchý editor" dEDITMULTI ADDR(text&(1)), "Text", 30, 6, 255 dBUTTONS "Konec", %e, "Ulož", %s IF DIALOG PRINT "Text je: "; addr&=ADDR(text&(2)) WHILE i%<text&(1) IF PEEKB(addr&+i%)>=32 PRINT CHR$(PEEKB(addr&+i%)); ELSE STYLE 4 : PRINT "<";PEEKB(addr&+i%);">"; : STYLE 0 ENDIF i%=i%+1 ENDWH GET ENDIF ENDP
Při použití příkazu dEDITMULTI je potřeba ohlídat si, aby nebyl text delší než pole, do kterého jej ukládáme. Pokud se pokusíme uložit do pole více znaků, než je jeho skutečná velikost v byte, dojde ke kritické situaci a zhroucení operačního systému.