Zdravím, vrhnul jsem se na unit graph s úmyslem si pro jeden svůj prográmek vytvořit nějaké přijatelnější grafické prostředí.
Předpokládejme, že bych si chtěl nakreslit obyčejný kruh. Znám sice dokumentaci Pascalu na Freepascal.org, ale z ní jsem se dověděl jen:
Declaration
Procedure Circle (X,Y : Integer; Radius : Word);
Description
Circle draws part of a circle with center at (X,Y), radius radius.
Nikde ani zmínky o tom, jak by měl vlastně celý program vypadat. :(
Mám totiž dojem, že jen "begin; circle(); end." nestačí, je tam prý třeba inicializovat grafický systém a podobné netriviální příkazy..
Mohl byste mi tedy někdo poradit, jak by měl vypadat jednoduchý prográmek, který pomocí toho unitu Graph nakreslí kružnici?
Něco jak když se pro začátečníky píše Hello_world, jen pro graph unit :)
A nebo, pokud byste byli v googlení zdatnější než já, tak klidně postačí nějaký odkaz..
Díky..
Fórum › Pascal
Začínáme s unitem Graph
KIIV napsal:
treba tady: http://pascalprogramming.byethost15.com/lesson8.php
Wow, to vypadá dobře!
Prozkoumám a pokud bude třeba, ještě se vrátím.. :)
Zajímavá příručka, ale doporučení, aby se mezi apostrofy v Initgraph napsala absolutní cesta k ovladači, je kravina - v takovém případě by pak program šel spustit jenom na těch počítačích, kde tahle cesta existuje a ovladač v ní je. Nejlepší je dát tam prázdný řetězec a EGAVGA.BGI dát do stejného adresáře, v jakém poběží program; mně to fungovalo vždycky (jenom pozor, že "adresář, ve kterém program běží" nemusí být při spouštění z IDE totéž jako "adresář, ve kterém se nachází zkompilovaný EXE soubor").
Potom by trochu chtělo vysvětlit tu detekci. Takže: buď použiješ proceduru Detectgraph(graphicsdriver,graphicsmode), nebo do proměnné graphicsdriver vložíš hodnotu Detect (což je konstanta s hodnotou 0) nebo přímo nulu - tím řekneš Initgraphu, že si to má detekovat sám. Nebo napíšeš rovnou graphicsdriver:=9; graphicsmode:=2; což znamená ovladač VGA a 16barevný režim 640x480 a je to přesně totéž, co by tam vložil Detectgraph (pokud tedy nemáš Hercules nebo něco podobného), a autodetekci ušetříš.
Testování Graphresultu je celkem zbytečné, protože v případě pokusu o kreslení do neinicializované grafiky program spadne sám ("BGI error: Graphics not initialized, use Initgraph").
Minimum v kostce:
program pokus;
uses graph;
var gd,gm:integer;
BEGIN
detectgraph(gd,gm);
initgraph(gd,gm,'');
...
circle(...);
...
closegraph;
END.
Pozor, že v grafice nemusí vždycky fungovat příkazy pro textový vstup a výstup (readln, write, writeln). Sice fungují, když se proměnná Directvideo (jednotka Crt) nastaví na false, ale "čistší" je napsat si vlastní rutiny využívající Outtextxy a spol.
Moje stránka.
Výborně, "Náhled příspěvku" mi příspěvek smazal, tak tedy ještě jednou:
Díky za rady, grafika konečně funguje. :)
Hlavně tu detekci grafiky (initgraph apod.) jsem moc nechápal, ale říkal jsem si "no co, funguje to, nemusím tomu rozumět dopodrobna.."
Dakže ještě jednou dík..
To, že je testování toho graphresult zbytečné, mě celkem překvapilo - totiž, i na freepascal.org jsem četl všude "Make sure you always check graphresult!"
Například v příkladech zde:
http://community.freepascal.org:10000/docs-html/rtl/graph/modes.html
Ale pokud to opravdu není nutné, pak jenom dobře, ušetří mi to práci.. :)
A ještě jednu věc - zajímalo by mě, jaký mají význam všechny ty konstanty "detect", "grOK" apod., když nejsou nic jiného, než "0".
Může mi někdo objasnit, proč je tak výhodné ukládat si nulu pod takovou spoustu konstant? Příjde mi to prostě jako zbytečný příkaz (reserved keyword) navíc.. :-/
Díky..
Proč konstanty místo čísla? Odpovíš si jistě sám při pohledu na tento (sice Cčkový zdoják a nejsou to jenom 0, ale to je jedno):
CreateFile("jmeno_souboru", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
CreateFile("jmeno_souboru", 0x80000000, 1, 0, 3, 128, 0);
Je to 2x totéž, ale jedno z toho je čitelné a druhé musíš louskat. Hádej, který je který :smile1: .
Jeyekomon napsal: ... jsem četl všude "Make sure you always check graphresult!" ...
Je to podobné jako testování chyb při práci se soubory: buď to děláš ručně ({$I-} a Ioresult) a v případě chyby se můžeš rozhodnout, co s tím (ohlásíš to uživateli, zkusíš to znovu apod.). Nebo se na to vykašleš, zapneš automatiku ({$I+}) a pak ti při první chybě program s příslušnou hláškou sám spadne.
Když je spuštění grafiky první věc, kterou tvůj program dělá, automatické spadnutí mu neuškodí. Ale jestli předtím třeba otevíráš soubory, načítáš data, ptáš se na něco uživatele a podobně, mohl přijít o výsledky, takže v takovém případě je lepší Graphresult zkontrolovat a když není 0, nepokoušet se o kreslení.
Moje stránka.
Zdravím, ještě bych se vrátil jednou k unitu Graph v Pascalu.
Asi jsme úplně nepochopil, k čemu ten unit vlastně je, ale - jaktože v něm není možné toto?
program LottaNumbrs;
uses graph;
var GDriver, GMode: smallint;
i: integer;
begin
GDriver:= detect;
GMode:= 0;
initGraph(GDriver, GMode, '');
for i:= 1 to 10 do
begin
OutText(i);
end;
readln;
closeGraph;
end.
To, že s tím oknem nemůžu nijak komunikovat (načítat proměné, čekat na Enter apod), jsem pochopil.
Ale že to ani neumí vypsat hodnotu proměnné?
Tak to je ten unit asi vážně jen na malování obrázků.. :(
Díky za váš názor.
Procedura OutText vypisuje parametry typu string.
Takže abys vypsal číslo, tak musíš provést konverzi:
program LottaNumbrs;
uses graph;
Function ST(i:integer):string;
var s:string;
begin
Str(i,s);
st:=s;
end;
var GDriver, GMode: smallint;
i: integer;
begin
GDriver:= detect;
GMode:= 0;
initGraph(GDriver, GMode, '');
for i:= 1 to 10 do
begin
OutText(st(i));
end;
readln;
closeGraph;
end.
Jinak - čekat na Enter i načítat proměnné samozřejmě můžeš.
Kromě jednotky Graph musíš použít i jednotku na (mimo jiné) ovládání klávesnice - unit Crt (nebo nějaký ekvivalent) a potom přodat trošku elementární programátorské práce na napsání procedury na zadávání textu.
A to už je potom na tobě: buďto jí uděláš úplně triviální na pár řádků, kdy nebudeš zobrazovat blikající kurzor a omezíš se jenom na podporu backspace nebo se trochu zapotíš a napíšeš funkci, kde se bude zobrazovat kurzor, text bude v případě potřeby scrolovat a budeš se v něm moci pohybovat jak libo.
Říká se tomu programování.
Alternativou je použití nějakého existujícího rozšiřujícího balíku pro unit Graph nebo použití jiné, komplexnější, knihovny.
Laaca napsal:
Říká se tomu programování.
:-))
No jo, ale mým hlavním problémem je.. Neznalost postupů.
Moje programátorské schopnosti jsou sice na úrovni bubblesortu, ale to se dá dohnat. Největší problém mívám s tím, JAK to napsat. Kdž se to vymyslí, tak pak konkrétní realizace už mi tak složitá nepříjde.
Třeba ta konverze do stringu mě vůbec nenapadla, spíše bych se snažil hledat nějakou jinou funkci obdobnou tomu OutText.
A samozřejmě, že bych si nejradši napsal vlastní funkci, než někde hledal pomoc v nějaké super-advanced knihovně, ale nemám nejmenší tušení, jak na to.. :(
Stačilo by jen nakopnout - na který web se podívat, který užitečný příkaz se k tomu bude hodit nebo aspoň myšlenku..
Nechci dělat neschopného a brečet tady "Já to neumím, udělejte to za mně.". To rozhodně ne. Snažím se o tom sám co jak nejvíc najít.
Ale je to prostě pro mě něco úplně nového..
Každopádně díky.
Obvykle spamuju nerad, ale vypadá to, že tohle by mohlo být to, co hledáš, alespoň pro začátek: http://mircosoft.ic.cz/texty/ZAKLADY.TXT, hledej kapitolu "Graficky vystup" (úplně na konci). Je to takový přehled funkcí jednotky Graph a stručný návod k použití.
Když jsem s Graph začínal, zajímalo mě mimo jiné:
- Jak smazat to, co jsem nakreslil?
Žádná speciální funkce na to není. Buď tu nakreslenou věc překreslím něčím v barvě pozadí (obvykle Bar - obdélník) nebo si musím pohrát s Getimage a Putimage, původní pozadí si uložit někam stranou a pak ho na dané místo vrátit.
- Viděl jsem program evidentně napsaný v TP a byla v něm použita oranžová barva. Kde ji autor sehnal?
Namíchal přes Setrgbpalette.
- Jak zařídit, aby mi obrázky při animacích neblikaly?
Buď animovat jenom malé věci, u kterých to tolik nevadí, nebo použít stránkování (Setactivepage a Setvisualpage, ale to funguje jenom v některých trochu obskurnějších režimech, tuším 640x350 nebo tak nějak).
- Jak se používá myš?
Graph na to žádné funkce nemá, obvykle se to řeší voláním služeb přerušení int $33. Podrobnosti např. v AThelpu, Sysmanu nebo RBIL. Dobrá zpráva je, že v režimu 640x480 se kurzor hýbe sám a nepotřebuje překreslovat ručně.
- Jak nakreslit vyplněný kruh?
Fillellipse. Circle v cyklu pro poloměr od 1 do maxima úplně vyplněný nebude, ale zase vykreslí zajímavý vzor :-).
Konkrétnější dotazy ti samozřejmě zodpovíme, ale potřebujeme vědět, kterým směrem chceš nakopnout - "jak na grafiku" je dost široké téma ;-).
Moje stránka.
- Jak smazat to, co jsem nakreslil?
Žádná speciální funkce na to není. Buď tu nakreslenou věc překreslím něčím v barvě pozadí (obvykle Bar - obdélník) nebo si musím pohrát s Getimage a Putimage, původní pozadí si uložit někam stranou a pak ho na dané místo vrátit.
funkcia cleardevice;
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Unit Graph — založil devilfish
Graph mode — založil Arkan
Unit Graph — založil Denisa13
Graph knihovna — založil Seph
Zaciname v Assembleru — založil trebuk
Moderátoři diskuze