Začínáme s unitem Graph – Pascal – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Začínáme s unitem Graph – Pascal – Fórum – Programujte.comZačínáme s unitem Graph – Pascal – Fórum – Programujte.com

 

Jeyekomon0
Stálý člen
16. 2. 2010   #1
-
0
-

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..

Nahlásit jako SPAM
IP: 78.128.199.–
jjk
KIIV
~ Moderátor
+43
God of flame
Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Jeyekomon0
Stálý člen
16. 2. 2010   #3
-
0
-
Nahlásit jako SPAM
IP: 78.128.199.–
jjk
Mircosoft+1
Věrný člen
17. 2. 2010   #4
-
0
-

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.

Nahlásit jako SPAM
IP: 130.119.248.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
Jeyekomon0
Stálý člen
17. 2. 2010   #5
-
0
-

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..

Nahlásit jako SPAM
IP: 78.128.199.–
jjk
liborb
~ Redaktor
+18
Guru
18. 2. 2010   #6
-
0
-

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: .

Nahlásit jako SPAM
IP: 85.207.166.–
Mircosoft+1
Věrný člen
18. 2. 2010   #7
-
0
-

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í.

Nahlásit jako SPAM
IP: 130.119.248.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
rainbof0
Newbie
19. 2. 2010   #8
-
0
-

Ta detekce misto konstant je doporucena proto, ze ta cisla jsou cisla grafickych rezimu podle VESA standardu ktera se mohou na jinych OS lisit a ktere podporuje dany BGI. proto.

Nahlásit jako SPAM
IP: 89.233.145.–
Jeyekomon0
Stálý člen
28. 3. 2010   #9
-
0
-

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.

Nahlásit jako SPAM
IP: 78.128.199.–
jjk
Laaca0
Stálý člen
28. 3. 2010   #10
-
0
-

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.

Nahlásit jako SPAM
IP: 193.179.2.–
DOS-u-akbar
Laaca0
Stálý člen
28. 3. 2010   #11
-
0
-

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.

Nahlásit jako SPAM
IP: 193.179.2.–
DOS-u-akbar
Jeyekomon0
Stálý člen
1. 4. 2010   #12
-
0
-

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.

Nahlásit jako SPAM
IP: 78.128.199.–
jjk
Mircosoft+1
Věrný člen
2. 4. 2010   #13
-
0
-

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 ;-).

Nahlásit jako SPAM
IP: 130.119.248.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
MiMi
~ Anonymní uživatel
45 příspěvků
2. 4. 2010   #14
-
0
-



- 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;

Nahlásit jako SPAM
IP: 217.145.199.–
Jeyekomon0
Stálý člen
2. 4. 2010   #15
-
0
-

Mircosoft napsal: ...


Wow, díky za nápady!
Beru to jako svůj nepovinný domácí úkol :) Hned se do toho jdu pustit.

Nahlásit jako SPAM
IP: 78.128.199.–
jjk
chocholda
~ Anonymní uživatel
1 příspěvek
18. 1. 2011   #16
-
0
-

a jak můžu pohybovat s oběkty které nakreslím?

Nahlásit jako SPAM
IP: 188.175.121.–
nervak0
Věrný člen
18. 1. 2011   #17
-
0
-

Tak, že je smažeš a nakreslíš jinde.

Nahlásit jako SPAM
IP: 213.211.51.–
nervak0
Věrný člen
18. 1. 2011   #18
-
0
-

Tak, že je smažeš a nakreslíš jinde.

Nahlásit jako SPAM
IP: 213.211.51.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 6 hostů

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

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý