[ Milan Milosevic @ 02.02.2014. 08:19 ] @
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]
[ deerbeer @ 02.02.2014. 10:19 ] @
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
[ Milan Milosevic @ 02.02.2014. 10:28 ] @
Ma greska pri kucanju stavio sam kao sto si ti napisao, ali ne radi.
[ deerbeer @ 02.02.2014. 12:07 ] @
Sta kaze GetLastError() posle SetClassLong?
[ Milan Milosevic @ 02.02.2014. 12:21 ] @
vraca ERROR_SUCCESS
[ deerbeer @ 02.02.2014. 13:01 ] @
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.

[ Milan Milosevic @ 02.02.2014. 17:15 ] @
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]
[ ((BugA)) @ 02.02.2014. 19:01 ] @
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
[ Milan Milosevic @ 02.02.2014. 19:55 ] @
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
[ ((BugA)) @ 02.02.2014. 20:19 ] @
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.
[ Milan Milosevic @ 02.02.2014. 20:43 ] @
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.
[ ((BugA)) @ 02.02.2014. 21:41 ] @
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?
[ savkic @ 03.02.2014. 01:20 ] @
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;

[ Milan Milosevic @ 03.02.2014. 06:31 ] @
Hvala savkic to je to.
Hvala i svim ostalim koji su mi pomogli.