IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Lanister
Člen
Avatar
Lanister:30.1.2019 13:29

Ahoj, zajímalo by mě jestli je možné a jak zapsat v Pascalu situaci kdy mám několik stringů a integerů za sebou (řekněme 10) vypsaných na obrazovku a rád bych spodní půlku obrazovky smazal (od 6 do posledního). Existuje nějaký příkaz, který by se dal nakombinovat s příkazem gotoXY ? Že bych řekl gotoXY(osmý řádek) a smaž všechno na tomto řádku + všechno na každém dalším řádku ?

Zkusil jsem: Zatím nic moc, nenapadá mě jak to udělat a na netu jsem nic nenašel

Chci docílit: Smazání celé obrazovky od zadaného řádku

 
Odpovědět
30.1.2019 13:29
Avatar
Odpovídá na Lanister
Luboš Běhounek Satik:30.1.2019 13:35

Staci se nejak dostat k bufferu obrazovky a tam muzes upravovat jednotlivy znaky. Jak se to dela v Pascalu z hlavy netusim, google pomuze :)

Nahoru Odpovědět
30.1.2019 13:35
https://www.facebook.com/peasantsandcastles/
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Lanister
DarkCoder:30.1.2019 14:41

Vytvoř si stránkový buffer do kterého zapisuj vše co pak bys chtěl vypisovat na stránku. Po vymazání obrazovky pak můžeš na obrazovku vypsat ze stránkového bufferu vše co potřebuješ a jak ty chceš.

Nahoru Odpovědět
30.1.2019 14:41
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na Lanister
Martin Dráb:30.1.2019 14:43

V Pascalu (pro DOS) se do bufferu obrazovky v textovém režimu dostávalo přímým zápisem do videopaměti, která je namapovaná na fyzické adrese 0xB8000. Jedná se o posloupnost dvoubajtových hodnot, každá odpovídá jednomu znaku obrazovky (zleva doprava a odshora dolů). Jeden bajt kóduje znak, druhý jeho barvu (pozadí, popředík, blukání).

Pascal pomocí klíčového slova absolute dovoluje umístit proměnnou na určitou adresu. Tudíž pro pohodlný zápis do videopaměti jsi mohl definovat něco jako:

Var
  screen : Array [0..24, 0..79] Of Word absolute $B800:$0000;

Pro textový režim 80 sloupců a 25 řádků pak prvním indexem udáváš řádek, druhým sloupec.

Jak ale říkám, tohle ti bude fungovat dobře pod DOSem, popř. v jeho emulátoru (ať už NTWDM či třeba DOSBox), ale nemyslím, že by klasická konzole Windows toto chování uměla emulovat. Ve FreePascalu ti to myslím taky fungovat nebude, protože ten nepracuje v reálném řežimu procesoru (ani ve v tom virtuálním, ve kterém jinak Windows uměly emulovat prostředí pro DOSové aplikace). Nejschůdnějším řešením asi bude udělat GotoXY a pak provést mazání třeba vyplněním mezerami.

V normálních (rozuměj *nixových) terminálech fungují tzv. escape sekvence, což jsou posloupnosti znaků začínající znakem s kódem 27 kódující různé operace s terminálem. Jednou z nich je třeba "Smaž vše od pozice kurzoru do konce řádku", což by bylo přesně to, co potřebuješ. Ale myslím, že Windowsí konzole takové sekvence nepodporuje (možná na Windows 10 ano, ale pochybuju, že třeba na W7).

Nahoru Odpovědět
30.1.2019 14:43
2 + 2 = 5 for extremely large values of 2
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 4 zpráv z 4.