Python týden Geek tričko zdarma
Tričko zdarma! Stačí před dobitím bodů použít kód TRIKO15. Více informací zde
Pouze tento sleva až 80% na kurzy Python

Diskuze: Pascal - mazání části obrazovky

Aktivity (1)
Avatar
Lanister
Člen
Avatar
Lanister:30. ledna 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. ledna 13:29
Avatar
Luboš Běhounek Satik
Autoredaktor
Avatar
Odpovídá na Lanister
Luboš Běhounek Satik:30. ledna 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. ledna 13:35
https://www.facebook.com/peasantsandcastles/
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Lanister
DarkCoder:30. ledna 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. ledna 14:41
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Lanister
Martin Dráb:30. ledna 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. ledna 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.