Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Delphi kontrola - crta (linija)

[es] :: Pascal / Delphi / Kylix :: Delphi kontrola - crta (linija)

[ Pregleda: 764 | Odgovora: 13 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

FranjoZG
Franjo Popović
Programer
Zagreb

Član broj: 328819
Poruke: 242
*.adsl.net.t-com.hr.



+2 Profil

icon Delphi kontrola - crta (linija)09.07.2019. u 13:49 - pre 13 meseci
Da li postoji kontrola crta? Trebam ga za projekt koji je najsličniji dijagramu toka sa puno objekata i strelica između njih. Problem su strelice.

Kreirao sam svoju preko TImage kontrole, ali postoji problem. Potreban mi je na toj kontroli event OnClick. Ako su dvije crte pod kutom, npr: 45 i 135 stupnjeva i sijeku se. Tada, budući da su crte na TImage ili TPaintBox kvadrati, dostupa je samo ona koji je front, donja ne registrira click.

Razmišljao sam napraviti crtu kao više manjih crta, na taj način bi širina prostora oko crte bila manja. Kod ovoga se bojim brzine crtanja jer ako imam npr 50 crta (možda i više), a svak ima 50 (ili više) dijelova, koliko će vremena trebat da se sve iscrta?

Znači: linije koja ima zadatu debljinu bez obzira na to pod kojim je kutom. U Delphi-u je to moguće samo za okomitu i vodoravnu. Kako to izvesti za onu pod nekim kutom? Nisam pronašao gotovu kontrolu.
 
Odgovor na temu

Milan Milosevic

Član broj: 67
Poruke: 908
*.dynamic.isp.telekom.rs.



+30 Profil

icon Re: Delphi kontrola - crta (linija)09.07.2019. u 17:07 - pre 13 meseci
Možda bi ti bilo bolje da probaš sa FM aplikacijom, ona bi bez problema mogao da iscrtaš 50-tak strelica, naravno na jednoj kontroli ili sliku da kreiraš u memoriji i da napravis algoritam za proračun koju si strelici klikno, ali sve na jedan PaintBox. Korišenje 50 PaintBoxa nije solucija.
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2635



+69 Profil

icon Re: Delphi kontrola - crta (linija)09.07.2019. u 17:15 - pre 13 meseci
Mozda ako ima neka u JVCLu ili neka komercijalna.
Ili da pokusas da to uradis u FMXu (tamo moze) a ako je to neki veci program da samo tu FMX formu ubacis u svoj VCL projekat:
https://parnassus.co/open-source/tfiremonkeycontainer/
https://github.com/LaKraven/MonkeyMixer
 
Odgovor na temu

Rapaic Rajko
Bgd

Član broj: 4105
Poruke: 790
31.223.145.*



+61 Profil

icon Re: Delphi kontrola - crta (linija)10.07.2019. u 09:13 - pre 13 meseci
Postoji elegantno resenje za verziju sa kontrolama i OnClick event-om: Region.

E sad, treba malo truda da se regioni savladaju, ali su zapravo vrlo jednostavni za rad.
Svakoj Win kontroli (kontrola koja ima Handle) se moze pridruziti proizvoljan region; samim tim bi OnClick radio posao.

Medjutim, iz opisa projekta meni licno se ne svidja primenjeni pristup.
Pravo resenje je graficki editor. Razlika izmedju grafickog editora i (recimo) Paint-a (win app, obicna crtaljka) je postojanje kolekcije nacrtanih elemenata; svaki element se moze naknadno brisati, pomerati, razvlaciti, bojiti itd. Malo preambiciozno? Mozda, ali su mogucnosti ovakvog resenja neogranicene.

Pozz
 
Odgovor na temu

FranjoZG
Franjo Popović
Programer
Zagreb

Član broj: 328819
Poruke: 242
93.140.37.*



+2 Profil

icon Re: Delphi kontrola - crta (linija)10.07.2019. u 13:29 - pre 13 meseci
Rapaic Rajko. Može li malo detaljnije. Do sada nisam radio sa grafikom osim prikaza gotovih bmb-ova.
 
Odgovor na temu

Rapaic Rajko
Bgd

Član broj: 4105
Poruke: 790
31.223.145.*



+61 Profil

icon Re: Delphi kontrola - crta (linija)10.07.2019. u 14:45 - pre 13 meseci
Pretpostavljam da pitas za region.
Ako zelis da detaljno procitas, onda Delphi7->Help->Windows SDK. Nema tako puno materije o regionima, a koristice ti i nekom drugom prilikom, sigurno.

Evo neki redosled potrebnih API funkcija za primer TImage kontrole koja na sebi ima nacrtanu kosu crtu (recimo).
Zelimo da na nju postavimo polygon region koji 'obuhvata' nacrtanu liniju (sa okolinom od po 1 pixel, radi lakseg 'gadjanja' misem; nepotrebno ako je linija 'debela').

1. CreatePolygonRegion() - ovo kreira region na osnovu array of points; tacke prave path takav da obuhvata tvoju nacrtanu liniju (ili sta vec).
Referentni sistem je upravo BoundRect (Canvas) kontrole za koju pravimo region.

2. SetWindowRegion() - ovo postavlja kreirani region na datu kontrolu; od ovog momenta od kontrole se vidi samo ono sto je pod regionom, takodje vazi i hit test (click misem). Ako ste videli razne app sa kicenim/apstraktnim oblicima, to je upravo to; i TForm je win kontrola.

3. Na kraju, kad se TImage kontrola unistava (Free) treba pozvati SetWindowRegion() sa null parametrom za region, i DeleteObject za sam region.

Umesto CreatePolygonRegion(), mogu da se isprobaju razne druge funkcije (CreateRectRegion itd.), mogucnosti su bezgranicne.

E sad, ovo je jednostavan deo. Komplikovano je ovo naterati da radi u Delphi maniru - znaci, rad u designtime modu i upis/citanje u .dfm fajl.

Za kraj, ima jos lepsih primena, pogledati funkcije BeginPath, EndPath i PathToRegion; moze se napraviti sve sto coveku na pamet padne.

Pozz

P.S. Ne brini se sto su ove funkcije u help-u pisane u C-u; sve one su vec enkapsulirane u Windows unit-u (ako se ne varam).
Samo zapocnes kucanje i code insight ce ti dati Delphi sintaksu i parametre.
 
Odgovor na temu

FranjoZG
Franjo Popović
Programer
Zagreb

Član broj: 328819
Poruke: 242
*.adsl.net.t-com.hr.



+2 Profil

icon Re: Delphi kontrola - crta (linija)11.07.2019. u 10:40 - pre 13 meseci
Hvala na pomoći, isprobao sam na nepravinlom poligonu, radi točno ono što mi treba :)
Ostaju mi igre sa crtanjem strelice na kraju linije i kruga na početku, ali to je manji dio problema...
 
Odgovor na temu

Rapaic Rajko
Bgd

Član broj: 4105
Poruke: 790
31.223.145.*



+61 Profil

icon Re: Delphi kontrola - crta (linija)11.07.2019. u 13:05 - pre 13 meseci
Odlicno

Za komplikovane oblike, koristi BeginPath, EndPath i PathToRegion funkcije.
Jedna od primena je, recimo, izmedju BeginPath i EndPath definisati neki 'krupan' font, podesiti mu neki ugao ispisa i napisati neki text (sto automatski ide u path). Pozivom PathToRegion, kontrola dobija tacan oblik text-a, mozes recimo kliknuti na kontrolu ispod kroz rupu na 'O'.
Kad sam (poodavno) pravio region komponent za formu, omiljeno mi je bilo pravljenje 'djevreka' i 'pereca' (Bezier-ove krive) i slicnih detinjarija

Pozz
 
Odgovor na temu

FranjoZG
Franjo Popović
Programer
Zagreb

Član broj: 328819
Poruke: 242
*.adsl.net.t-com.hr.



+2 Profil

icon Re: Delphi kontrola - crta (linija)11.07.2019. u 16:51 - pre 13 meseci
Riješio sam sa CreatePolygonRgn
Code:

   ...
   Canvas.Brush.Color := FFillColor;
   FRgn := CreatePolygonRgn(FPoints, 6, WINDING);
   SetWindowRGN(Handle, FRgn, True);
   FRgn2 := CreatePolygonRgn(FPoints, 6, WINDING);
   FillRgn(Canvas.Handle, FRgn2, Canvas.Brush.Handle);
   ...


Jedini problem je što poligon ne mogu dobiti transparentan.

Pokušao sam postaviti, ali ne pomaže. Tada je kolor poligona kao kolor forme:
Code:

    Canvas.Brush.Color := clNone;


Kako dobiti da ta kontrola bude transparentna, ali da lovi mouse evente na cijeloj regiji? Može li ili moram drugim putem?

 
Odgovor na temu

Rapaic Rajko
Bgd

Član broj: 4105
Poruke: 790
31.223.145.*



+61 Profil

icon Re: Delphi kontrola - crta (linija)12.07.2019. u 09:11 - pre 13 meseci
Ne razumem, cemu transparencija uopste?

Recimo da imas TImage, i obojis ga odredjenom bojom, cak ni ne crtas liniju.
Sve sto treba da uradis je da kreiras region (recimo slozeni poligon koji oblikom ocrtava strelicu), i postavis ga preko TImage-a.
Ili si mislio na nesto drugo..?

Pozz
 
Odgovor na temu

FranjoZG
Franjo Popović
Programer
Zagreb

Član broj: 328819
Poruke: 242
93.140.40.*



+2 Profil

icon Re: Delphi kontrola - crta (linija)12.07.2019. u 09:46 - pre 13 meseci
crtam strelice koje mogu biti: kose, ravne ili izlomljene.
Ne znam okačiti sliku, pa ću pokušati dočarati:

|
|
----->

Ovo je jedna strelica. Nije problem stvoriti region koji pokriva taj oblik, ali...
- okomito dio mora biti širi od same crte jer ju je inaće teško pogoditi mišem. Svo proširenje oko okomite crte je neke boje i prekriva crtež ispod nje, ružno izgleda...
- vodoravna crta koja završava strelicom: ako napravim kao jedan region, debljina mora biti kolika je strelica, tada sve što nije crta ili srelica bude u boji i prekriva sliku koja je ispod, ako taj dio napravi iz dva dijela: crtaj je jedan, a strelica drugi, tada sa crtom imam problem kao i sa okomitom.

Pokušao sam sa: BeginPath, EndPath i PathToRegion, efekt je isti.
 
Odgovor na temu

Rapaic Rajko
Bgd

Član broj: 4105
Poruke: 790
31.223.145.*



+61 Profil

icon Re: Delphi kontrola - crta (linija)12.07.2019. u 11:35 - pre 13 meseci
Da li crte crtas komandama Canvasa (MoveTo(), LineTo())?

Ako da, onda iste te komande stavi izmedju BeginPath i EndPath, i na kraju PathToRegion. Hm... sad nisam siguran kako crtas, to jest koje funkcije koristis.
Ne bi bilo lose da procitas u onom Windows SDK kako to zapravo radi. Ideja je sa regionima je da oni nose informaciju o obliku (shape), a ne o boji i slicnom.

Pokusajmo ovako.
1) Uzmes TImage i nacrtas na njemu crtu.
2) Postavis za TImage Transparent = true, i postavis odgovarajuci TransparentColor; sad je ovo ono sto nam treba, s izuzetkom hit testa (mouse click).
3) Sad napravis poligon region koji obuhvata crtu, i tresnes ga preko TImage-a. Ovo resava i hit test.
Region nema veze sa transparencijom, bojom niti bilo cim slicnim; on samo ocrtava oblik/konturu koja ce biti dostupna/vidljiva na kontroli (bila ona transparentna ili ne).

Ovo bi trebalo da radi.

Pozz

P.S. Setih se; za slucaj da nisi siguran za TransparentColor - to treba da bude background color TImage slike.
Znaci, ako je TImage pozadina (recimo) clGray, a crta je nacrtana sa clBlack (bilo cim razlicitim od clGray), onda je TImage.TransparentColor := clGray.

 
Odgovor na temu

FranjoZG
Franjo Popović
Programer
Zagreb

Član broj: 328819
Poruke: 242
93.140.40.*



+2 Profil

icon Re: Delphi kontrola - crta (linija)12.07.2019. u 12:08 - pre 13 meseci
Hvala na pomoći.
Uspio sam dobiti dosta dobro s ovim što imam.
U ranijoj verziji sam crtao liniju i strelicu sa LineTO, izbacio sam to i jednostavno nacrtam točan oblik sa CreatePoligonRgn. Uzmem da mi je crta debljine 2 (probat ću i deblje) i izgleda ok, nište ne prekriva u pozadini. Za sada ću se zadovoljiti sa izlomljenom strelicom - prolazi za ovo što mi treba. Dovoljan je poligon on 9 točaka.
Radi ok i čini bi se dosta brzo. Probat ću nakalemiti 100-tinjak pa da vidim kako je...
 
Odgovor na temu

Rapaic Rajko
Bgd

Član broj: 4105
Poruke: 790
31.223.145.*



+61 Profil

icon Re: Delphi kontrola - crta (linija)12.07.2019. u 13:25 - pre 13 meseci
Stavices 100 strelica/TImage-a na formu?

Trebalo bi da bude brzo (skoro) isto kao da su TImages bez regiona. Kako ja to vidim, Windows radi obican bitwise AND, pixel slike na 'pixel' (1 bit) regiona, a to je vrlo brza operacija.
Secam se da kad sam pomerao formu sa regionom (misem), radilo je potpuno glatko, bez obzira sta je bilo ispod (forme).

Pozz
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Delphi kontrola - crta (linija)

[ Pregleda: 764 | Odgovora: 13 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.