Forum | | | | | Hör often such a thing How 1000 Buttonhandle in Arrays and frägt these then in the Hauptschleife with mouseouver and clicked ex.
For this, time one hint How I something like manage would without Loop, means explicit performant. CompileMarkSeparation the whole can itself discretionary improve,- and each possible Check so to assimilate. but not simply the Buttonhandle in that gänzlich unbenutzte h To pack could one too createbutton in a function Trash redirecting trash(createbutton(hwnd,knop+st$(i),x,y,40,10)). function trash could a list with the Handles fill and at terminate the Program could one these list for Destroywindows benefit. etc... the against make I u.a. in the Source of okrea [...] to. |
| | | | |
| | GDL | Hello iF,
I get not there, if The Objects then moved go. CompileMarkSeparation
proc verschieben
num1&=1
whilenot num1& > objekt&
x%=1
y%=1
CheckMouse objekt_&[num1&],x%,y%,lang_&[num1&],breit_&[num1&]
If result% = 1
num&=num1&
settext kfenster&,oname_$[num1&]
clear result%
whilenot %Mousepressed = 0
UseCursor 3
destroywindow(objekt_&[num1&])
num&=num1&
settext kfenster&,oname_$[num1&]
xpos_&[num1&]=%mousex
ypos_&[num1&]=%mousey
xpos_1&[num1&]=%mousex+xbalken%
ypos_1&[num1&]=%mousey+ybalken%
ifnot style_&[num1&]=99999
objekt_&[num1&]=control(STATIC,,style_&[num1&],xpos_&[num1&],ypos_&[num1&],lang_&[num1&],breit_&[num1&],%hwnd,0,%hinstance,$0)
casenot left$(oname_$[num&],3)=Ger:Sendmessage(objekt_&[num1&],$172,0,bild_&[bilda_&[num1&]])
else
objekt_&[num1&]=create(text,%hwnd,oname_$[num1&],xpos_&[num1&],ypos_&[num1&],lang_&[num1&],breit_&[num1&])
setfont objekt_&[num1&],font&
endif
ja
wend
UseCursor 0
Endif
inc num1&
wend
endproc
do not have whom blassesten Schimmer How I the hinbekommen should.
Hello Georg |
| | | | |
| | | I can with the Source not so plenty begin there it Yes not run is. Mach time Please one Minimalbeispiel then must I not first big einarbeiten. |
| | | | |
| | GDL | @if, if You want,
one Minimalbeispiel bring nothing, there the whole then from the Zusammenhalt torn is.
this was my erstes Profanmodul, therefore iss too everything of Profan7.5 To XProfan10 represent. The code isn't optimiert, but XPSE konform. Since I first my facilities ready bring must, is for me first important that the Module at all runs.
the Program bekommste running, if You whom Content of these Ordner to C:Control copy. [...]
and the Paths in the program änderst, The with ######## fringed are. determining is eigendlich only The Procedure move.
If you my Wettbewerbsproggi Downloaded have, there is it the Module Gleisplan.
Hello Georg |
| | | | |
| | | I poste you yet today evening what! |
| | | | |
| | GDL | | | | | |
| | | Tausendundeinhandle move without not-native Loop *g* - I hope the example helps you to längerer Betrachtung at least the principle behind it To understand.
@Roland: in the aray Search and ItemID-Zurückgabe missing somehow constantly so one as here z.B. Kopfstand make must. (is me already x time noticed) CompileMarkSeparation {$cleq}
const maxNumObjects=1000
set(ErrorLevel,0)
lm_{;return if(getasynckeystate(1)==0,false,true);}// lm steht für leftMouse(pressed)
declare objekt.H&[maxNumObjects],
objekt.X&[maxNumObjects],
objekt.Y&[maxNumObjects],
objekt.XX&[maxNumObjects],
objekt.YY&[maxNumObjects],
objekt.T$[maxNumObjects]
string objectHandlesHelperString:=|
windowstyle 8 | 16 | 512
cls
//decimals 0 damit das unten genutzte str$ keine Kommazahlen auswirft
decimals 0
long x,
y,
h,
i,
//hier erstellen wir die buttons mal, auch wenn Du die sicher anders erzeugst:
usefont MS Sans Serif,10,0,0,0,0
setdialogfont 1
sendmessage(hwnd,wm_setredraw,0,0)//damits controlerstellen schneller geht anzeige abschalten
for y:=0 to height(hwnd) step 15 do begin
for x:=0 to width(hwnd) step 40 do begin
//handle im Array merken - tust du ja auch
h=createstatic(hwnd,str$(i),x,y,39,14)
// hier trick 15 wir merken uns die ID auch im string und nutzen eine Helferfunktion
i+
objekt.pushID(i,h,x,y,39,14)
/* natürlich ist der Umweg über long h hier unnötig, man könnte auch direkt
objekt.pushID(i,createbutton(hwnd,knop+str$(i),x,y,40,10))
schreiben, wäre aber net so anschaulich */
end
end
sendmessage(hwnd,wm_setredraw,1,0)//nun wieder alles anzeigen und neuzeichnen
invalidateRect(hwnd,0,0)
updatewindow(hwnd)
//Hauptereignisschleife
usermessages wm_close,wm_lbuttondown,wm_keydown
do {
getmessage
select umessage//select Konstrukt damit umessage auch nur einmal geprüft wird und sich - warum auch immer - später ruhig ändern könnte ohne das wir falsch reagieren würden
caseof wm_close:break
caseof wm_lbuttondown:klickProc()// hier in der bildlich benannten Klickprog schauen wir ob ein Control verschoben werden möchte
caseof wm_keydown:keybProc()
endselect
}
end//ende
objekt.pushID(long n,h,x,y,xx,yy){
objekt.H&[n]=h
objekt.X&[n]=x
objekt.Y&[n]=y
objekt.XX&[n]=xx
objekt.YY&[n]=yy
objekt.T$[n]=BLUB von +str$(n)
objectHandlesHelperString:=objectHandlesHelperString+str$(h)+/+str$(n)+|
}
objekt.h2ID(long h){//der rückweg bis stringmanipulation, wir geben ein handle und bekommen die ID im Array, quasi verlagert die nicht-native schleife auf eine native xprofan-schleife im substr
return val(substr$(substr$(objectHandlesHelperString,2,|+str$(h)+/),1,|))
}
objekt.moveTo(long item,_dx,_dy){
long h=objekt.h&[item]
objekt.x&[item]=objekt.x&[item]+_dx
objekt.y&[item]=objekt.y&[item]+_dy
setwindowpos h=objekt.x&[item],objekt.y&[item] - objekt.xx&[item],objekt.yy&[item];0
invalidaterect(h,0,0)
updatewindow(h)
}
keybProc{
//wurde eines unserer Objekte bemaust? Holen wir uns erstmal das Handle des Controls:
long h=childWindowFromPoint(hwnd,mousex,mousey)// control unter maus?
long item=objekt.h2ID(h)//hiermit haben wir jetzt in H die ArrayItemID
case item<1 : return false/*kein static geklickt?*/
case getasynckeystate(37)<0 : objekt.moveTo(item,-2,0)
case getasynckeystate(38)<0 : objekt.moveTo(item,0,-2)
case getasynckeystate(39)<0 : objekt.moveTo(item,2,0)
case getasynckeystate(40)<0 : objekt.moveTo(item,0,2)
//erstmal umessage per dulcoiF löschen - wichtig! @ Roland: umessage löschen können!
settimer 1;waitinput;killtimer
//weiter:
}
klickProc{
//erstmal umessage per dulcoiF löschen - wichtig! @ Roland: umessage löschen können!
settimer 1;waitinput;killtimer
//weiter:
//wurde eines unserer Objekte angeklickt? Holen wir uns erstmal das Handle des geklickten Controls:
long h=childWindowFromPoint(hwnd,mousex,mousey)// control unter maus?
long item=objekt.h2ID(h)//hiermit haben wir jetzt in H die ArrayItemID
case item<1 : return false/*kein static geklickt?*/
settext hwnd,objekt.t$[item]
//objekt nach vorne holen in der anzeigehirarchie
destroywindow(h)
//handle aus handleBank entfernen
objectHandlesHelperString=translate$(objectHandlesHelperString,|+str$(h)+/+str$(item),)
h=createstatic(hwnd,str$(item-1),objekt.x&[item],objekt.y&[item],39,14)
objekt.h&[item]=h
//neues Handle in handleBank hinterlegen
objectHandlesHelperString=objectHandlesHelperString+|+str$(h)+/+str$(item)
//verschiebezeugs
long xd:=mousex-objekt.x&[item],yd:=mousey-objekt.y&[item]//xy differenz vom maus zu objektUrsprung merken
while lm_() {
objekt.x&[item]=(mousex-xd)
objekt.y&[item]=(mousey-yd)
setwindowpos h=objekt.x&[item],objekt.y&[item] - objekt.xx&[item],objekt.yy&[item];0
invalidaterect(h,0,0)
updatewindow(h)
}
return item
}
The performance can slight testing because one simply time on of/ one Pfeiltaste remaining and the mouse over The Controls moving. The investigation the Controls with dazugehöriger aray-Item-ID goes right fix. well clear has the Source here and there another couple Unstimmigkeiten The To to fix wären... |
| | | | |
| | GDL | whether I there apiece durchblicke circa this in my Proggi einzustricken?
Hello Georg |
| | | | |
| | Jörg Sellmeyer | Very calm! I wealth, is Rolf too interested for its Roc. |
| | | Windows XP SP2 XProfan X4... und hier mal was ganz anderes als Profan ... | 10/18/07 ▲ |
| |
| | Frank Abbing | in the Context is Get/SetWindowLong with GWL_ID or GWL_USERDATA interestingly. Anhand of/ one this Speicherplätze can each Control recognized go, without any Umwege and probably yet faster. I personally would this lane weg. |
| | | | |
| | | @Jörg: Rolf would warscheinlich sooner that here interested: [...] (exe anhängig)
@Frank: naturally I had too on gwl_userdata virtual. herewith would it too possible in/by gwl_userdata against the lever one further Controls abzuspeichern which against yet plenty More data carry could. (z.B. ne ListBox)
I had whom detour chosen there this too so a couple xprofansche Problemfälle demonstrating and shows the it for some releases vlt. vorgefertigte Native (in XProfan installed) Solutions give ought to.
After gwl_userdata would the so looks: CompileMarkSeparation//Version:0.0.1
{$cleq}
const maxNumObjects=1000
set(ErrorLevel,0)
lm_{;return if(getasynckeystate(1)==0,false,true);}// lm steht für leftMouse(pressed)
declare objekt.H&[maxNumObjects],
objekt.X&[maxNumObjects],
objekt.Y&[maxNumObjects],
objekt.XX&[maxNumObjects],
objekt.YY&[maxNumObjects],
objekt.T$[maxNumObjects]
windowstyle 8 | 16 | 512
cls
//decimals 0 damit das unten genutzte str$ keine Kommazahlen auswirft
decimals 0
long x,
y,
h,
i,
//hier erstellen wir die buttons mal, auch wenn Du die sicher anders erzeugst:
usefont MS Sans Serif,10,0,0,0,0
setdialogfont 1
sendmessage(hwnd,wm_setredraw,0,0)//damits controlerstellen schneller geht anzeige abschalten
for y:=0 to height(hwnd) step 15 do begin
for x:=0 to width(hwnd) step 40 do begin
//handle im Array merken - tust du ja auch
h=createstatic(hwnd,str$(i),x,y,39,14)
// hier trick 15 wir merken uns die ID auch im string und nutzen eine Helferfunktion
i+
objekt.pushID(i,h,x,y,39,14)
/* natürlich ist der Umweg über long h hier unnötig, man könnte auch direkt
objekt.pushID(i,createbutton(hwnd,knop+str$(i),x,y,40,10))
schreiben, wäre aber net so anschaulich */
end
end
sendmessage(hwnd,wm_setredraw,1,0)//nun wieder alles anzeigen und neuzeichnen
invalidateRect(hwnd,0,0)
updatewindow(hwnd)
//Hauptereignisschleife
usermessages wm_close,wm_lbuttondown,wm_keydown
do {
getmessage
select umessage//select Konstrukt damit umessage auch nur einmal geprüft wird und sich - warum auch immer - später ruhig ändern könnte ohne das wir falsch reagieren würden
caseof wm_close:break
caseof wm_lbuttondown:klickProc()// hier in der bildlich benannten Klickprog schauen wir ob ein Control verschoben werden möchte
caseof wm_keydown:keybProc()
endselect
}
end//ende
objekt.pushID(long n,h,x,y,xx,yy){
objekt.H&[n]=h
objekt.X&[n]=x
objekt.Y&[n]=y
objekt.XX&[n]=xx
objekt.YY&[n]=yy
objekt.T$[n]=BLUB von +str$(n)
setwindowlong(h,gwl_userdata,n)
}
objekt.h2ID(long h){//der rückweg über gwl_userdata
return getwindowlong(h,gwl_userdata)
}
objekt.moveTo(long item,_dx,_dy){
long h=objekt.h&[item]
objekt.x&[item]=objekt.x&[item]+_dx
objekt.y&[item]=objekt.y&[item]+_dy
setwindowpos h=objekt.x&[item],objekt.y&[item] - objekt.xx&[item],objekt.yy&[item];0
invalidaterect(h,0,0)
updatewindow(h)
}
keybProc{
//wurde eines unserer Objekte bemaust? Holen wir uns erstmal das Handle des Controls:
long h=childWindowFromPoint(hwnd,mousex,mousey)// control unter maus?
long item=objekt.h2ID(h)//hiermit haben wir jetzt in H die ArrayItemID
case item<1 : return false/*kein static geklickt?*/
case getasynckeystate(37)<0 : objekt.moveTo(item,-2,0)
case getasynckeystate(38)<0 : objekt.moveTo(item,0,-2)
case getasynckeystate(39)<0 : objekt.moveTo(item,2,0)
case getasynckeystate(40)<0 : objekt.moveTo(item,0,2)
//erstmal umessage per dulcoiF löschen - wichtig! @ Roland: umessage löschen können!
settimer 1;waitinput;killtimer
//weiter:
}
klickProc{
//erstmal umessage per dulcoiF löschen - wichtig! @ Roland: umessage löschen können!
settimer 1;waitinput;killtimer
//weiter:
//wurde eines unserer Objekte angeklickt? Holen wir uns erstmal das Handle des geklickten Controls:
long h=childWindowFromPoint(hwnd,mousex,mousey)// control unter maus?
long item=objekt.h2ID(h)//hiermit haben wir jetzt in H die ArrayItemID
case item<1 : return false/*kein static geklickt?*/
settext hwnd,objekt.t$[item]
//objekt nach vorne holen in der anzeigehirarchie
destroywindow(h)
h=createstatic(hwnd,str$(item-1),objekt.x&[item],objekt.y&[item],39,14)
objekt.h&[item]=h
setwindowlong(h,gwl_userdata,item)
//verschiebezeugs
long xd:=mousex-objekt.x&[item],yd:=mousey-objekt.y&[item]//xy differenz vom maus zu objektUrsprung merken
while lm_() {
objekt.x&[item]=(mousex-xd)
objekt.y&[item]=(mousey-yd)
setwindowpos h=objekt.x&[item],objekt.y&[item] - objekt.xx&[item],objekt.yy&[item];0
invalidaterect(h,0,0)
updatewindow(h)
}
return item
}
|
| | | | |
| | Rolf Koch | I know the but already. Aussderdem is by the geniale Umsetzung of Andreas Miethe still a ansehliche Control drin |
| | | | |
|
AnswerThemeninformationenthis Topic has 5 subscriber: |