Stránka 1 z 1

Delphi - stayontop?Blbne...

Napsal: sob 25. zář 2004, 13:46
od Borg2of3
A mam jeste jeden problemek... mam udelanou aplikaci.. ktera je nastavena na stayontop.. kdyz si to uzivatel vybere.. ale z niceho nic po nejakym case behu aplikace (nevim za jakych okolnosti.. jsou mi fakt zahadou) se najednou aplikace presune do zadu.. a kazda jina aplikace ji prekryje.. a to se mi vubec nelibi... tak jsem premyslel, ze bych nejak odchytil polohu aplikace.. to ze je pod jinou aplikaci schovana.. a znova pak ji donutil bejt stayontop.. jenze nevim jakou funkci nebo proceduru... proste nejakej figl, kterej tohle dokaze odchytit.. nejsem v programovani moc dobrej... myslel jsem ze by to slo nejak jako treba takhle:

if form1.formposition<>ontop then form1.formstyle=fsstayontop; :roll:

ale nic takovyho jsem v delphi nenasel..
nevi nekdo co s tim? :(

Napsal: sob 25. zář 2004, 21:54
od pavel.minarik
to bude imho způsobeno něčím nepřístojným (api volání?), mě se to nikdy nestalo, nejlíp uděláš když mi pošleš zdrojáček a já se kouknu :)

Napsal: sob 25. zář 2004, 22:01
od Dony
pokud si dobre pamatuju, tak to ze je okno uplne na vrchu je ve vlastnost OnFoccus (ale uz jsem pod winama dlouho neprogramoval, tak fakt nevim jiste :? )

Napsal: sob 25. zář 2004, 22:07
od Borg2of3
pavel.minarik píše:to bude imho způsobeno něčím nepřístojným (api volání?), mě se to nikdy nestalo, nejlíp uděláš když mi pošleš zdrojáček a já se kouknu :)
no to je napad posilat celej zdrojacek :o) kdyz na tom programu delam pul roku :o no jinak API volani je tam fuuura.. jenze v klidu ne.. ono to funguje vpoho.. a pak to najednou nefunguje..

Napsal: ned 26. zář 2004, 07:25
od pavel.minarik
to dony: ne onFocus je když nejaký ovládací prvek (mající vlastní Handle) získá vstupní zaměření

jestli nechceš posílat zdroják tak neposílej, je mi to šumafuk
pokud máš ale spuštěné jiné aplikace, které mají taky stay-on-top okna (třeba miranda, ...), tak je teba si uvědomit, že všechny stay-on-top okna se taky můžou mezi sebou překrývat, není problém tady? (počítám, že stejně nebude)

Napsal: ned 26. zář 2004, 12:11
od Borg2of3
pavel.minarik píše:to dony: ne onFocus je když nejaký ovládací prvek (mající vlastní Handle) získá vstupní zaměření

jestli nechceš posílat zdroják tak neposílej, je mi to šumafuk
pokud máš ale spuštěné jiné aplikace, které mají taky stay-on-top okna (třeba miranda, ...), tak je teba si uvědomit, že všechny stay-on-top okna se taky můžou mezi sebou překrývat, není problém tady? (počítám, že stejně nebude)
v tom bych rekl problem neni... otviram normalne okna exploreru.. notepad... atd... treba to nekolik hodin funguje.. nekdy celej den... a jindy par minut po spusteni je najednou program zase vzadu...a prekryje ho i notepad, kterej rozhodne nastavenej na stayontop neni... ja bych zdrojak poslal.. ono nakonec to neni nijak uzasnej program.. ale preci jen jista obava tu je... ze ho treba ukradnes :o nikdy nevis. Jinak ten program je B-panel, da se najit treba na slunecnici... ale rikam jsem amater :wink: a programuju teprve trictvrte roku. Pokud ti budu posilat zdrojak.. tak komkpletne vsechny formulare?Nebo ti bude stacit form1....?Asi ne co...

Napsal: ned 26. zář 2004, 13:12
od pavel.minarik
já jsem nevěděl co je to za software, chápu, že se Ti to nehce posílat, ale bez toho už nevím co Ti dál poradit, já jsem s tím nikdy žádnej problém neměl

teď jsem koukal na slunečnici, koukám, že je to speciální form style bez ohraničení (BorderStyle: bsNone), jak ten formulář vznikne? klasickou cestou a la Delphi nebo jej nějak vyrobíš přes API?
účastní se smyčky zpracování globálních událostí (odchyt kláves např.), předáváš korektně zprávy o události dál?

Napsal: ned 26. zář 2004, 13:50
od Borg2of3
Je to obycejnej formular vytvorenej delfinou.. je to form1 a presne tak.. je nastavenej na bsnone a jako transparentni. A poloha je dana na form1.align:=left,right... to co nakonec vidis je Tpanel1 v kterym je vsechno nahazeny.
Jedina smycka ktera jede je tohle:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
GetCursorPos(pozice);
kurzorx:=pozice.x;
kurzory:=pozice.y;

if (kurzorx<form1.left-15) and (form1.width=51) or (kurzory>panel1.Height+20) then form1.Width:=1;
if (kurzorx=form1.Left) and (form1.width=1) and (kurzory>20) and (kurzory<panel1.Height) then begin form1.Width:=51;end;
if (kurzorx>form1.left+65) and (form1.width=51) and (form1.align=alleft) or (kurzory>panel1.Height+20) then form1.Width:=1;

end;

ta mi zajistuje, ze se ten program schova a zase zobrazi pri prejeti mysi nad nim... stejne jak se tomu deje u panelu nastroju ve win. No jinak ted jak ti to pisu se to stalo zase.. a vsiml jsem si, ze kratce po startu delphi.. ale fakt nechapu proc.. a jindy delphi mit otevreny nemusim..
Odchyt klaves nemam...
A ostatni funkce se vyvolavaji az pri kliknuti atd...

mozna je asi problem primo v tomhle Timer1Timer(Sender: TObject); co?

Napsal: ned 26. zář 2004, 15:06
od pavel.minarik
možná jo, je to dost nestandardní řešení,
zkus to předělat na detekci najetí myší přes onMouseMove, přesně teď nevím jak, chce se to v tom porejpat
takhle to rozhodně nemá standardní panel woken vyřešený

tomu timeru je dobrý se pokud to jde vyhnout - může se totiž stát, že systém je lehce zabržděn a když se začne vykonávat znovu tato procedura, tak ještě dobíhá vykonávání toho samýho před tím

takže tam ještě zařiď aby ta metoda timeru byla kritická sekce a nemohlo se stát, že se do ní vleze ještě před dokončením jednoho průchodu - bude Ti k tomu stačit jeden globální Boolean

Napsal: ned 26. zář 2004, 15:22
od Borg2of3
No je to nestandartni no.. to souhlasim.. ale nenapadl me jinej zpusob jak dosahnout toho.. aby se program schoval kdyz mam mys az v urcity vzdalenosti od formulare... ale zkusim s tim neco vymyslet... dik
jo.. a zjistil jsem, ze kdyz vyvolam nejakou funkci spojenou s API, tak se to zase vrati do stayontop :D

Napsal: úte 28. zář 2004, 11:35
od Borg2of3
pavel.minarik píše: takže tam ještě zařiď aby ta metoda timeru byla kritická sekce a nemohlo se stát, že se do ní vleze ještě před dokončením jednoho průchodu - bude Ti k tomu stačit jeden globální Boolean
Jak jsi to myslel s tou globalni Boolean?Vrta mi to hlavou

Napsal: úte 28. zář 2004, 11:49
od pavel.minarik
zadefinuju si globálně viditelnou proměnnou typu Boolean, třeba v private sekci příslušného formuláře a vždycky na začátku metody obsluhující onTimer událost udělám tohle:

if Promenna
then begin
{nedelej nic}
end else
begin
Promena:= true;
{vlastni obsluzny kod}
Promenna:= false;
end;

Napsal: úte 28. zář 2004, 19:33
od Borg2of3
Uz chapu :oops: jsem to tam hodil, tak to budu testovat a uvidim :) ale momentalne si od toho moc neslibuju, protoze za celej dnesek se program choval slusne :roll:
Mockrat diky za radu. :P

Napsal: pát 6. led 2006, 15:40
od Angel6
Ahoj mam taky problem s stayontop ale ponekud jiny kdyz mam ty dve aplikace ktere maji tyto vlastnosti stayontop na stejne urovni tak se prekryvaji jak bylo receno, nevite nekdo jak udelat aby ta jedna byla vys s vetsi prioritou, nejak nastavit urovne, atd.?

diky

Napsal: sob 7. led 2006, 10:34
od pavel.minarik
Angel6 píše:Ahoj mam taky problem s stayontop ale ponekud jiny kdyz mam ty dve aplikace ktere maji tyto vlastnosti stayontop na stejne urovni tak se prekryvaji jak bylo receno, nevite nekdo jak udelat aby ta jedna byla vys s vetsi prioritou, nejak nastavit urovne, atd.?

diky
bohuzel, windows rozlišují normální úroveň a stay-on-top úroveň, v každé z těch úrovní se překrývají
jediná možnost jak to obechcat je prohlídnout si win32API a hledat nějakou funkci která umí zjišťiovat překryv oken, ten testovat a vždycky to svý onko poslat plně nejvýš přenesením do popředí (nějak takto by to mohlo jít)

Napsal: sob 7. led 2006, 12:33
od Angel6
pavel.minarik píše:...
bohuzel, windows rozlišují normální úroveň a stay-on-top úroveň, v každé z těch úrovní se překrývají...
no a pouzitim nejake jine fce, procedury? zminovalo se tu OnFoccus, to nevim co je ani jak to pouzit, neumely by jste to nejak vysvetlit? a popr. jestly by to neslo?