Kezdőoldal » Számítástechnika » Programozás » Turbo Pascal - Free Pascal...

Turbo Pascal - Free Pascal által létrehozott konzolos alkalmazás teljes képernyőn futtatása. Meg lehet vhogy oldani h jól működjön?

Figyelt kérdés

Ha Turbo Pascal-al megírt DOS konzolos alkalmazást kiteszem teljes képernyőre akkor tökéletesen jól fut teljes képernyőn. Ha azonban FreePascal-által készített alkalmazás teszem ki teljes képernyőre akkor teljesen rossz a kép, a karakterek mások stb. FP-ben ezzel lehet vmit kezdeni h jól fusson?


Meg nem csak a Turbo Pascal alkalmazások hanem amelyek "régiek". (Pl Turbo Assembler, Norton Commander) Kis méretűek, és a gépet eléggé leterhelik. A Free Pascal által készített alkalmazások nagyobbak de nem terhelik annyira a gépet.


Köszönöm, üdv


2012. júl. 12. 16:06
1 2 3
 1/22 ejbenjaro ***** válasza:

Mit értesz azon, hogy teljesen rossz a kép? Ha karakterkódolási problémád van, akkor vagy használod a Free Pascalhoz adott IDE-t, vagy olyan IDE-t használsz, amelyben a karakterkódolást be tudod állítani a 852-es kódlapra, emlékeim szerint a Windows parancssora ezt használja. További lehetőség, hogy nem használsz ékezetet.

Ettől konkrétabb választ akkor fogsz tudni kapni, ha képes leszel rendesen leírni a problémát, esetleg mellékelt képernyőképpel.

2012. júl. 12. 17:43
Hasznos számodra ez a válasz?
 2/22 anonim ***** válasza:
100%

"Ha azonban FreePascal-által készített alkalmazás teszem ki teljes képernyőre akkor teljesen rossz a kép, a karakterek mások stb. "

Rég használtam már Free pascal ide-t Turbo-et meg régebben.

Talán a window menüböből tudod beállítani a 80x25-ös méretű karakteres képernyőmódot, alapból nagyobb ennél úgy emlékszem. Ez csak az IDE-re vonatkozik vagy a program-ra is már nem tudom, mindenesetre rendszerhívásokkal be lehet folyásolni, a programod elején meghívva a szükséges rendszer függvényeket.(régen csináltam ilyet)

Vagy pedig a képernyő puffert állítod 80x25-re, (alapból xp-től kezdve 80x300)

"Meg nem csak a Turbo Pascal alkalmazások hanem amelyek "régiek" ... gépet eléggé leterhelik"

Mivel azokba az időkbe mikor ezeknek a programoknak a fénykora volt, egyszerre csak 1 program futott (általában persze, több csak trükkel) nem volt védett mód sem, minden valós módban futott ... stb Folyamatosan dolgoztatják a CPU-t, akkor is ha csak egy edit "szövegszerkesztő" fut, folyamatosan ellenőrzi a CPU a billentyűzetet hogy nyomtál e gombot, mindegy hogy milyen programot futtatsz a gép 100 CPU használaton volt, vagyis csak aktív várakozás volt, nem is támogatott a hardver más fajta várakozást ezért olyan gépigényesek a régi programok.

2012. júl. 12. 17:44
Hasznos számodra ez a válasz?
 3/22 A kérdező kommentje:

Mivel konzolos alkalmazásnál teljes képernyős módban nem tudok fényképezni így nem tudok sajnos képeket mutatni, így inkább elmondom ami történik még részletesebben.


Amikor elindítok egy Turbo Pascal által készített .exe-t, és kiteszem teljes képernyőre akkor minden szépen fut ahogyan kell.


Ha Free Pascal-al készített .exe indítok el, és kiteszem teljes képernyőre (Tulajdonságok > Megjelenési beállítások > Ablakban/Teljes képernyőn), akkor:


- a képernyő fele van kihasználva csak, vízszintesen megfelezi a monitor képernyőjét, és az alkalmazás a felső részben fut. Az alsó rész teljesen kihasználatlan, fekete.


- a felső részben a betűk kicsiit alacsonyabbak, összeesettnek és egyben széthúzottnak tűnik az egész mert a szélei tökéletesen érintkeznek a képernyő szélével


- az egész program teljesen lassú, a gépet is eléggé lehúzza, a szövegmegjelenítés nem egyszerre és hirtelen történik mint normál esetben hanem: elejétől a végéig lassan kiírja (tudom h normál esetben is így történik csak nagyon gyorsan).


- Az ékezetes karakterek hibásan jelennek meg.

- Ezzel együtt a speciális képernyőkarakterek is, mint pl a dobozvonalak, rácsvonalak és ilyenek.

- Ha szöveget gépelek be az is szintén nagyon lassú. Ha entert ütök egy pillanatra a rácsvonalak és ékezetes karakterek úgy jelennek meg ahogy kellene, de rögtön újra hibásan jelenik meg (a program ezen része nem tartalmaz képernyő-újrafestést)


- Ha hosszabb szöveget ír ki a program akkor is a rácsvonalak és ékezetes karakterek vibrálnak: egyik pillanatban úgy jelennek meg ahogy kellene, a következőben meg hibásan ahogyan a hozzászólásom elején felvázoltam. A programnak ezen része sem tartalmaz képernyő-újrafestést (teljesen biztos vagyok benne mivel én írtam a programot).


Sajnos képet nem tudok mutatni mert nem tudom kifényképezni. Ha ez a leírás sem elég ahhoz h megértsétek h hogyan néz ez ki, akkor legalább abban tudnátok segíteni h a régi alkalmazások miként kezelik másképpen a teljes képernyős módit mint a mai alkalmazások?


Köszönöm a válaszaitokat. Üdv

2012. júl. 12. 18:30
 4/22 anonim ***** válasza:
100%

Első vagyok, kicsit nosztalgiázok az első prog nyelv amit megtanultam az a pascal volt.

"Összeheggesztettem" egy olyan pascal programot ami a 80x25-ös DOS-ba megszokott konzol képernyő videómódba állítja a képernyőt. Nagyrészt windows rendszerhívások ismerete kellett. Kíváncsi vagyok hogy neked hogy fut, nekem jól.


uses

windows;

var

hConsoleOut,hNewScreenBuffer : HANDLE;

c:coord;

begin

//80x25 mode------------------------------------

c.X:=80;

c.Y:=25;

repeat

keybd_event(VK_MENU,$38,0,0);

keybd_event(VK_RETURN,$1c,0,0);

keybd_event(VK_RETURN,$1c,KEYEVENTF_KEYUP,0);

keybd_event(VK_MENU,$38,KEYEVENTF_KEYUP,0);


hConsoleOut := GetStdHandle( STD_OUTPUT_HANDLE );

SetConsoleScreenBufferSize(hConsoleOut,c);

keybd_event(VK_MENU,$38,0,0);

keybd_event(VK_RETURN,$1c,0,0);

keybd_event(VK_RETURN,$1c,KEYEVENTF_KEYUP,0);

keybd_event(VK_MENU,$38,KEYEVENTF_KEYUP,0);

until SetConsoleScreenBufferSize(hConsoleOut,c);

//-------------------------------------------


writeln('asdfghjkl01234567');

readln;

end.

2012. júl. 13. 16:18
Hasznos számodra ez a válasz?
 5/22 anonim ***** válasza:
100%

"Első vagyok, kicsit nosztalgiázok"...

Sorry nem elsőt akartam írni hanem előzőt.

2012. júl. 13. 19:51
Hasznos számodra ez a válasz?
 6/22 A kérdező kommentje:

Ez zseniális!


Köszönöm ezt a kódot.


Így fut: Amikor elindítom akkor (úgy mint a Turbo Pascal grafikai alkalmazásai) kitenné teljes képernyőre (elindítom az .exe-t, bejön az ablak, amely lekicsinyül a tálcára, elsötétül a kép és ott a teljes képernyős grafikus Turbo Pascal program) csakhogy az elsötétülés után kis méretűben marad.


Mind1 ez nem lényeges mert kiteszem teljes képernyőre és szépen fut, teljes képernyőn van a betűk is normálisak. A gépet sem terheli le.


Egyetlen egy probléma: Enter- illetve karakterütésnél megmarad az a jelenség hogy "vibrál". Az ékezetes karakterek és a rácsvonalakon látható ez a jelenség. Habár normál körülmények nem mindig látható, elindítottam egy "régi" alkalmazást amely leterheli a gépet, továbbá egy vírusellenőrzést sok erőforrással ami megintcsak szépen lehúzza a gépet. Ilyenkor a program kicsit lelassult, és szépen látható volt h minden karakterleütésnél látható ez a vibráló jelenség.


program teszt;


uses

windows, crt;

var

hConsoleOut,hNewScreenBuffer : HANDLE;

c:coord;

ciklus : byte;

begin

//80x25 mode------

c.X:=80;

c.Y:=25;

repeat

keybd_event(VK_MENU,$38,0,0);

keybd_event(VK_RETURN,$1c,0,0);

keybd_event(VK_RETURN,$1c,KEYEVENTF_KEYUP,0);

keybd_event(VK_MENU,$38,KEYEVENTF_KEYUP,0);


hConsoleOut := GetStdHandle( STD_OUTPUT_HANDLE );

SetConsoleScreenBufferSize(hConsoleOut,c);

keybd_event(VK_MENU,$38,0,0);

keybd_event(VK_RETURN,$1c,0,0);

keybd_event(VK_RETURN,$1c,KEYEVENTF_KEYUP,0);

keybd_event(VK_MENU,$38,KEYEVENTF_KEYUP,0);

until SetConsoleScreenBufferSize(hConsoleOut,c);

//------


gotoxy(1, 2);

textcolor(lightgreen);

for ciklus := 1 to 78 do write(#196);

gotoxy(1, 24);

for ciklus := 1 to 78 do write(#196);

textcolor(lightgray);

gotoxy(2, 10);

write('Itt ‚kezetes karaktereket jelenˇtnk meg. ‚ ‹ŁűŁ‹”µëé銚™ŕ' );

for ciklus := 1 to 7 do

begin

gotoxy(2, 10+ciklus);

write('Tov bb  karaktereket olvasunk be 7-szer: ' );

readkey;

end;

readkey;

end.



Köszönöm mégegyszer ezt a kódot, hálás vagyok érte.


A HANDLE típusú hNewScreenBuffer változót miért deklaráltad ha nem használtad fel?


Megkérdezhetem hogy a Pascal programozás (gondolom windows modul) ezzel a képernyős részével foglalkozó dolgot honnan sajátíthatom el? FreePascal demo/példaprogramok? Angol nyelvű dokumentációkban?


Mégegyszer köszönöm a kódot, már ez is jelentős eredmény :D


Üdv.

2012. júl. 14. 11:05
 7/22 A kérdező kommentje:

program teszt;


uses

windows, crt;

var

hConsoleOut,hNewScreenBuffer : HANDLE;

c:coord;

ciklus : byte;

begin

//80x25 mode------

c.X:=80;

c.Y:=25;

repeat

keybd_event(VK_MENU,$38,0,0);

keybd_event(VK_RETURN,$1c,0,0);

keybd_event(VK_RETURN,$1c,KEYEVENTF_KEYUP,0);

keybd_event(VK_MENU,$38,KEYEVENTF_KEYUP,0);


hConsoleOut := GetStdHandle( STD_OUTPUT_HANDLE );

SetConsoleScreenBufferSize(hConsoleOut,c);

keybd_event(VK_MENU,$38,0,0);

keybd_event(VK_RETURN,$1c,0,0);

keybd_event(VK_RETURN,$1c,KEYEVENTF_KEYUP,0);

keybd_event(VK_MENU,$38,KEYEVENTF_KEYUP,0);

until SetConsoleScreenBufferSize(hConsoleOut,c);

//------


gotoxy(1, 2);

textcolor(lightgreen);

for ciklus := 1 to 78 do write(#196);

gotoxy(1, 24);

for ciklus := 1 to 78 do write(#196);

textcolor(lightgray);

gotoxy(2, 10);

write('Itt ékezetes karaktereket jelenítünk meg. ‚ éáőúűÜÖÓÜÁÚ' );

for ciklus := 1 to 7 do

begin

gotoxy(2, 10+ciklus);

write('Továbbá karaktereket olvasunk be 7-szer: ' );

readkey;

end;

readkey;

end.



Az előző hozzászólásomban a ékezetes karakterek rosszul jelentek meg.

2012. júl. 14. 11:07
 8/22 anonim ***** válasza:
100%

"A programnak ezen része sem tartalmaz képernyő-újrafestést (teljesen biztos vagyok benne mivel én írtam a programot)."

Megnéztem, teljesen biztos hogy a crt unit a bug-os, az definiálja felül a write működését, többek között úgy hogy sokszor újrarajzolja az egész képernyőt.

Viszont kis ablakba futtatva meg jól működik nálam. Valószínű hogy ők is úgy tesztelték.

..."bejön az ablak, amely lekicsinyül a tálcára, elsötétül a kép és ott a teljes képernyős grafikus Turbo Pascal program) csakhogy az elsötétülés után kis méretűben marad."

Ez az alapértelmezett beállítástól függ, ezt be lehet állítani a "Megjelenési beállítások"-nál hogy teljes képernyőn fusson minden indításkor. Amúgy meg nem minden windows rendszer támogatja a teljes képernyős módot konzol alkalmazásoknál, talán az újabb Windows-ok egyáltalán nem. Ha nagyon precíz akarnék lenni akkor tesztelnem kéne olyan windows-on is.

"A HANDLE típusú hNewScreenBuffer változót miért deklaráltad ha nem használtad fel?"

Felhasználtam még több változót is addig amíg próbálkoztam, csak azt ottfelejtettem, miután bemásoltam ide észrevettem, de nem akartam emiatt szólni, látom legalább hogy figyelsz.


"Megkérdezhetem hogy a Pascal programozás (gondolom windows modul) ezzel a képernyős részével foglalkozó dolgot honnan sajátíthatom el? FreePascal demo/példaprogramok? Angol nyelvű dokumentációkban? "

Ennek lényegében nincs köze a Pascal programozáshoz. GetStdHandle, SetConsoleScreenBufferSize stb. windows-os rendszerfüggvények. A windows unit lényegében csak ezeknek a nevét paraméterlistáját, visszatérési érték típusát és hogy melyik standard DLL-ből kell meghívni, ezen dolgokat tartalmazza.

Hogy mi mire való azt publikálta a microsoft. Kizárólag conzol ablakkal foglalkozó rendszerhívások : [link]

C-s szintaxis-al írja. Amúgy meg inkább c++ - ba vannak rá példák a neten pl.: [link]

Amúgy az aligha találnék rá példát ha csak a pascal-t ismerném. Nem akarok ezzel felvágni, de én egyetemen tanultam szoftverfejlesztést.

2012. júl. 15. 13:58
Hasznos számodra ez a válasz?
 9/22 A kérdező kommentje:
Értem. Nagyon köszönöm a válaszaidat és a kódokat, és főleg a linkeket, nagyon hálás vagyok értük. Üdv.
2012. júl. 15. 14:13
 10/22 anonim ***** válasza:
100%

"Mégegyszer köszönöm a kódot, már ez is jelentős eredmény :D "

Szívesen te kis programozó palánta. :)

Első megközelítésbe a sebességen javíthatunk úgy hogy a "szegély" karaktereket nem 1-esével íratjuk ki:

program teszt;


uses

windows, crt;

var

hConsoleOut : HANDLE;

c:coord;

ciklus : byte;

pufferstr:string;

begin

//80x25 mode------

c.X:=80;

c.Y:=25;

repeat

keybd_event(VK_MENU,$38,0,0);

keybd_event(VK_RETURN,$1c,0,0);

keybd_event(VK_RETURN,$1c,KEYEVENTF_KEYUP,0);

keybd_event(VK_MENU,$38,KEYEVENTF_KEYUP,0);


hConsoleOut := GetStdHandle( STD_OUTPUT_HANDLE );

SetConsoleScreenBufferSize(hConsoleOut,c);

keybd_event(VK_MENU,$38,0,0);

keybd_event(VK_RETURN,$1c,0,0);

keybd_event(VK_RETURN,$1c,KEYEVENTF_KEYUP,0);

keybd_event(VK_MENU,$38,KEYEVENTF_KEYUP,0);

until SetConsoleScreenBufferSize(hConsoleOut,c);

//------


gotoxy(1, 2);

textcolor(lightgreen);

pufferstr:='';

for ciklus := 1 to 78 do pufferstr:=pufferstr+#196;

write(pufferstr);

gotoxy(1, 24);

write(pufferstr);

textcolor(lightgray);

gotoxy(2, 10);

write('Itt ékezetes karaktereket jelenítünk meg. éáőúűÜÖÓÜÁÚ' );

for ciklus := 1 to 7 do

begin

gotoxy(2, 10+ciklus);

write('Továbbá karaktereket olvasunk be 7-szer: ' );

readkey;

end;

readkey;

end.

----------------------------

Végülis ez a lépés nem itt annyira fontos, ha normálisan működik a képernyőkezelés, viszont példa az optimalizálásra.

Igazi precíz megoldás lenne a crt unit-ot kijavítani (nagy munka) és beküldeni a hivatalos oldal-nak. Ezen felül Lehetne saját crt2 unit-ot csinálni amibe sokkal több lehetősége lenne a programozónak mint a "gyári" crt-be.

Viszont az én időm is véges ... végül is megint támaszkodhatunk a windows-os rendszerfüggvényekre, viszont nem lesz platformfüggetlen, így már jól fut nálam:


program teszt;


uses

windows, crt;

var

hConsoleOut : HANDLE;

c:coord;

ciklus : byte;

pufferstr:string;

begin

//80x25 mode------

c.X:=80;

c.Y:=25;

repeat

keybd_event(VK_MENU,$38,0,0);

keybd_event(VK_RETURN,$1c,0,0);

keybd_event(VK_RETURN,$1c,KEYEVENTF_KEYUP,0);

keybd_event(VK_MENU,$38,KEYEVENTF_KEYUP,0);


hConsoleOut := GetStdHandle( STD_OUTPUT_HANDLE );

SetConsoleScreenBufferSize(hConsoleOut,c);

keybd_event(VK_MENU,$38,0,0);

keybd_event(VK_RETURN,$1c,0,0);

keybd_event(VK_RETURN,$1c,KEYEVENTF_KEYUP,0);

keybd_event(VK_MENU,$38,KEYEVENTF_KEYUP,0);

until SetConsoleScreenBufferSize(hConsoleOut,c);

//------


SetConsoleTextAttribute(hConsoleOut,lightgreen);

clrscr;

gotoxy(1, 2);

//textcolor(lightgreen);

pufferstr:='';

//for ciklus := 1 to 78 do write(#196);


for ciklus := 1 to 78 do pufferstr:=pufferstr+#196;

write(stdout,pufferstr);

gotoxy(1, 24);

//for ciklus := 1 to 78 do write(#196);

writeln(stdout,pufferstr);

//textcolor(lightgray);

SetConsoleTextAttribute(hConsoleOut,lightgray);

gotoxy(2, 10);

write(stdout,'Itt ékezetes karaktereket jelenítünk meg. éáőúűÜÖÓÜÁÚ' );

for ciklus := 1 to 7 do

begin

gotoxy(2, 10+ciklus);

write(stdout,'Továbbá karaktereket olvasunk be 7-szer: ' );

readkey;

end;

readkey;

end.


Az stdout azért kellett hogy a crt unit-ot megkerülve írassunk ki, hogy ne rontsa el.

És ügyelj az ékezetekre hogy a Pascal IDE-be is jó legyen!

2012. júl. 15. 14:14
Hasznos számodra ez a válasz?
1 2 3

Kapcsolódó kérdések:





Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!