|
|
Több buffer terület használata egy konzol alkalmazáshoz
Konzol alkalmazások 4. rész
|
|
Példaprogram letöltése
4011 bájt
|
Ha elindítunk egy konzol alkalmazást, akkor lehetőségünk van több buffer területet használni a megjelenítéshez. Ennek előnye, hogy bármelyikről bármelyikre átkapcsolhatunk és azok tartalma e közben nem változik. E buffer területek és így a konzol ablakának mérete is különbözhet egymástól.
Nézzük miként is valósítható meg mindez.
Lesz egy FHandle1 nevű változónk, melyben tároljuk az elsődleges ablakunk azonosítóját.
FHandle1:=GetStdHandle(STD_OUTPUT_HANDLE);
Az FHandleActive szintén egy THandle típusú változó, melybe mindig az aktív buffer terület azonosítója kerül.
Létrehozunk egy másodlagos buffert, a saját CreateSecondBuffer eljárásunkkal. Ez az FHandle2 változóban tárolja az azonosítóját, melyen keresztül hozzáférhetünk.
A billentyűzet kezeléséhez szükségünk lesz a standard input elérésére.
FInput:=GetStdHandle(STD_INPUT_HANDLE);
Ezt követően írunk az első ablakra szöveget.
SetConsoleTextAttribute(FHandle1, 10);
WriteLnToHandle(FHandle1, 'Switch: enter');
WriteLnToHandle(FHandle1, 'Close: esc');
WriteLnToHandle(FHandle1, '');
WriteLnToHandle(FHandle1, 'Window: 1');
Majd írunk a második ablakra is szöveget.
SetConsoleTextAttribute(FHandle2, 14);
WriteLnToHandle(FHandle2, 'Switch: enter');
WriteLnToHandle(FHandle2, 'Close: esc');
WriteLnToHandle(FHandle2, '');
WriteLnToHandle(FHandle2, 'Window: 2');
Végül egy ciklust kezdeményezünk, melyben figyeljük az Esc és Enter billentyűk lenyomását. Esc esetén befejezzük a program futását, míg Enter esetén a SwitchBuffer belső eljárásunk meghívásával átkapcsolunk a másik bufferre.
while b do begin
ReadConsoleInput(FInput, ir[0], 32, count);
for i:=0 to count-1 do begin
if ir[i].EventType=KEY_EVENT then begin
with ir[i].Event.KeyEvent do begin
if bKeyDown then begin
case Ord(AsciiChar) of
27: b:=false;
13: SwitchBuffer;
…
Vizsgáljuk meg, miként is jön létre a másodlagos buffer.
procedure CreateSecondBuffer;
begin
Ehhez a CreateConsoleScreenBuffer függvényt kell meghívnunk.
FHandle2:=CreateConsoleScreenBuffer(GENERIC_READ or GENERIC_WRITE, 0, nil,
CONSOLE_TEXTMODE_BUFFER, nil);
A SetConsoleScreenBufferSize függvény hívásával lehet beállítani a buffer területét, vagyis hogy hányszor hány karakteres legyen.
SetConsoleScreenBufferSize(FHandle2, coord);
A SetConsoleWindowInfo függvénnyel meghatározhatjuk, hogy a megjelenő konzol ablakban hányszor hány karakteres terület legyen látható. Ha a buffer nagyobb ennél, akkor a nem látható rész egy gördítő sáv segítségével érhető el.
SetConsoleWindowInfo(FHandle2, true, rect);
end;
Egyik bufferről átkapcsolni a másikra a SetConsoleActiveScreenBuffer függvénnyel tudunk. Használata egyszerű, csak meg kell adnunk annak a buffer-nek az azonosítóját, melyeket aktiválni szeretnénk.
procedure SwitchBuffer;
begin
if FHandleActive=FHandle1 then begin
SetConsoleActiveScreenBuffer(FHandle2);
FHandleActive:=FHandle2;
end else begin
SetConsoleActiveScreenBuffer(FHandle1);
FHandleActive:=FHandle1;
end;
end;
|
Könyv
Ez a cikk megtalálható ebben a könyvben:
Delphi Software Offline 2001 évkönyv 645. oldal
Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!
|