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

Kursor objekta preko hadle

[es] :: Pascal / Delphi / Kylix :: Kursor objekta preko hadle

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

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Milan Milosevic

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



+31 Profil

icon Kursor objekta preko hadle02.02.2014. u 08:19 - pre 123 meseci
Imam handle nekog objekta tipa forme ili panela i na osnovu tog podatka pokusavam da mu podesim kursor.
Pretrazivao sam googl, i naso nekoliko primera ali iz nekog razloga ne funkcionise.
Ovako nekako

var
CursorX: HCURSOR;
begin
CursorX := GetClassLong(Handle, GCL_HCURSOR); // uzimamo kursor iz forme i premestamo je na panel
SetClassLong(Panel1.Handle, // window handle
GCL_HCURSOR, // change cursor
LONG(CursorX));

Ove pokusavam kursor sa forme da prebacim da bude kursor panela, ali ne radi.
Naravno da opcija Panel1.cursor = cursor u mom slucaju nije interesantna jer unapred znam samo handle objekta ciji kursor zelim da modifikujem.


[Ovu poruku je menjao Milan Milosevic dana 02.02.2014. u 11:28 GMT+1]
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
95.180.61.*



+395 Profil

icon Re: Kursor objekta preko hadle02.02.2014. u 10:19 - pre 123 meseci
CursorX sa kojim setujes novi kursor je samo deklarisan. Ne vidim da dobija ovde neku novu vrednost.
Mozda bi trebalo ovako :
Code:
CursorX := GetClassLong(Handle, GCL_HCURSOR); // uzimamo kursor iz forme i premestamo je na panel

Viva lollapalooza
 
Odgovor na temu

Milan Milosevic

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



+31 Profil

icon Re: Kursor objekta preko hadle02.02.2014. u 10:28 - pre 123 meseci
Ma greska pri kucanju stavio sam kao sto si ti napisao, ali ne radi.
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
95.180.61.*



+395 Profil

icon Re: Kursor objekta preko hadle02.02.2014. u 12:07 - pre 123 meseci
Sta kaze GetLastError() posle SetClassLong?
Viva lollapalooza
 
Odgovor na temu

Milan Milosevic

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



+31 Profil

icon Re: Kursor objekta preko hadle02.02.2014. u 12:21 - pre 123 meseci
vraca ERROR_SUCCESS
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
95.180.61.*



+395 Profil

icon Re: Kursor objekta preko hadle02.02.2014. u 13:01 - pre 123 meseci
Probaj da ucitas taj kursor sa LoadCursor pa da ga setujes sa SetClassLong.
Za LoadCursor bi trebalo da imas ikonicu kursora dodatu u resursima app-a.


Viva lollapalooza
 
Odgovor na temu

Milan Milosevic

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



+31 Profil

icon Re: Kursor objekta preko hadle02.02.2014. u 17:15 - pre 123 meseci
Hvala
Ovo je pomoglo.
Evo i resenja

var
HcursorX:HCursor;
begin
HcursorX:=LoadCursor(0, IDC_CROSS);
SetClassLong(Panel1.Handle,GCL_HCURSOR,HcursorX)
end;

ili jos bolje za koriscenje standardnih kursora

var
HcursorX:HCursor;
begin
HcursorX:=CopyIcon(Screen.Cursors[crcross]);
SetClassLong(Panel1.Handle,GCL_HCURSOR,HcursorX)
end;


[Ovu poruku je menjao Milan Milosevic dana 02.02.2014. u 18:37 GMT+1]
 
Odgovor na temu

((BugA))
Igor Djordjevic
Bor, Srbija

Član broj: 29241
Poruke: 196
*.dynamic.sbb.rs.

ICQ: 66516695
Sajt: www.MalamutKlub.com


+17 Profil

icon Re: Kursor objekta preko hadle02.02.2014. u 19:01 - pre 123 meseci
Meni tvoj kod postavljen u prvoj poruci radi sasvim lepo. Medjutim...
Citat:
CursorX := GetClassLong(Handle, GCL_HCURSOR); // dopuna komentara - uzimamo kursor iz klase instance forme

Na prvu loptu, ova linija ne radi ono sto ti mozda ocekujes. Bez obzira koji kursor da izaberemo za svoju formu (kroz "Object Inspector"), vrednost CursorX koja se dobija ce biti ista (crDefault, 65541), jer GetClassLong() vraca trenutnu (obicno Windows default) vrednost kursora za datu klasu (TForm), a ne instancu (tvoja konkretna forma). Medjutim, ako tu liniju zamenimo sa:
Citat:
CursorX := GetWindowLong(Handle, GCL_HCURSOR); // uzimamo kursor iz instance forme

... onda CursorX zaista dobija vrednost kursora koji je (trenutno) dodeljen formi (instanci klase forme), i onda ce i ostatak koda raditi shodno ocekivanju, gde ce Panel1 (i svi ostali paneli iste klase!) dobiti isti taj (ocekivani) kursor.

Probaj, pa javi sluzi li ti sluzi svrsi ovako.

Jos jednom napominjem da tvoj trenutni pristup sa SetClassLong() postavlja taj kursor za sve objekte tog tipa, a ne samo za jedan panel - ukoliko imas vise panela, svima ce kursor biti promenjen, bez obzira sto si koristio Panel1.Handle u pozivu. Ukoliko je to ono sto zelis, u redu je, u suprotnom bi mnogo laksa varijanta bila da ceo svoj kod jednostavno zamenis sa:
Citat:
Panel1.Cursor = Form1.Cursor // (tj. bolje Self.Cursor umesto Form1.Cursor, ako se nalazis u metodi klase kojoj pripada objekat Form1)

... tek da se ne komplikuje bez potrebe :)

Pozdrav, BugA
 
Odgovor na temu

Milan Milosevic

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



+31 Profil

icon Re: Kursor objekta preko hadle02.02.2014. u 19:55 - pre 123 meseci
Hvala BugA
U pravu si
CursorX := GetWindowLong(Handle, GCL_HCURSOR); // uzimamo kursor iz instance forme
radi kao sto bi trebalo da radi, a dolnja procedura podesava kursor za sve promenjive date klase sto predstavlja problem jer
treba da podesava kursor samo jednog panela.
Naravno da nebi komplikovao stvari kad nebi morao.
pozz
 
Odgovor na temu

((BugA))
Igor Djordjevic
Bor, Srbija

Član broj: 29241
Poruke: 196
*.dynamic.sbb.rs.

ICQ: 66516695
Sajt: www.MalamutKlub.com


+17 Profil

icon Re: Kursor objekta preko hadle02.02.2014. u 20:19 - pre 123 meseci
Nema na cemu :) Nego nisam razumeo, iz nekog razloga moras da koristis Get/Set, umesto Panel1.Cursor := Form1.Cursor? Za slucaj da nisi do sad i sam video, onda samo zameni SetClassLong() sa SetWindowLong(), koji ce kada mu prineses Panel1.Handle zameniti kursor samo tog panela (a ne svih panela te klase).

Jos da dodam, sve ove funkcije su "zastarele", i MSDN preporucuje da se koriste varijante sa Ptr na kraju (na primer, GetWindowLongPtr() i SetWindowLongPtr()), koje rade ispravno i za 32bit i za 64bit verzije Windows-a.
 
Odgovor na temu

Milan Milosevic

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



+31 Profil

icon Re: Kursor objekta preko hadle02.02.2014. u 20:43 - pre 123 meseci
Probao sam sa SetWindowLong ali nece da radi.
Razlog je prost, komonentu na kojoj se iscrtava OpenGL scena se dodeljuje tako sto se na pocetku dodeljuje njen handle
i na osnovu toga preko kamere menjam i kursor na pocetku odabrane komponente.
To moze da bude neki panel , forma ili bilo sta, zato se unapred nezna cemu treba da se menja kursor.

Pozz.
 
Odgovor na temu

((BugA))
Igor Djordjevic
Bor, Srbija

Član broj: 29241
Poruke: 196
*.dynamic.sbb.rs.

ICQ: 66516695
Sajt: www.MalamutKlub.com


+17 Profil

icon Re: Kursor objekta preko hadle02.02.2014. u 21:41 - pre 123 meseci
Da, u pravu si, SetWindowLong() ne radi ni kod mene, izvini sto to nisam probao. Ili radi, ali na nacin koji ne ocekujemo? Mada, ni MSDN ne pominje GCL_HCURSOR za SetWindowLong()...

Elem, da ostanemo u Delphi okruzenju, te komponente kojima menjas kursor, one su sastavni deo tvog programa, znas hijerarhiju nasledjivanja? Ili ni to nije sigurno?

Pitam zato sto mozda mozes da uradis nesto ovako:
Code:
procedure SetCursor(ASourceControl, ADestinationControl: TControl); overload;
begin
  ADestinationControl.Cursor := ASourceControl.Cursor;
end;

procedure SetCursor(AControl: TControl; ACursor: TCursor); overload;
begin
  AControl.Cursor := ACursor;
end;

... pa da zatim te dve procedure koristis kako ti odgovara, gde kao TControl parametar/parametre mozes prinositi bilo koju Delphi VCL kontrolu (formu, panel... sta god), a koja na neki nacin potice od TControl. Time ne bi morao da razmisljas kog je tipa kontrola (dokle god je potomak TControl).

Da li bi ti ovo pomoglo, ili ipak nemas kontrolu/dovoljno znanja o komponenti ciji kursor zelis da menjas?
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Kursor objekta preko hadle03.02.2014. u 01:20 - pre 123 meseci
Ako je vlasnik Handle TWinControl, možeš koristiti i FindControl npr:

Code:


procedure TForm1.Button1Click(Sender: TObject);
var
  ctrl: TWinControl;
begin
  ctrl := FindControl(Edit1.Handle);
  ctrl.Cursor := crHourGlass;
end;


 
Odgovor na temu

Milan Milosevic

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



+31 Profil

icon Re: Kursor objekta preko hadle03.02.2014. u 06:31 - pre 123 meseci
Hvala savkic to je to.
Hvala i svim ostalim koji su mi pomogli.
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Kursor objekta preko hadle

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

Postavi temu Odgovori

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