English
Forum

Thousand and a handle...

 
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
 {$cleq}
windowstyle 8 | 16 | 512
cls
long x,y,h,i
for y:=0 to 400 step 10 do begin
for x:=0 to 600 step 40 do begin
i+
h:=createbutton(hwnd,knop+str$(i),x,y,40,10)
end
end
usermessages wm_close

do {

    waitinput
    case umessage==wm_close:break
    //mit einer einzigen Abfrage den Knopf herausbekommen
    //und den hwnd-Titel mit dem Knopf-Titel bestücken:
    settext hwnd,gettext$(lastFocus)

000FF>}


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.
 
10/16/07  
 




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
 
Windows7 Xprofan 8,9,10 [...]  [...] 
10/16/07  
 



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.
 
10/17/07  
 




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

62 kB
Hochgeladen:10/17/07
Downloadcounter111
Download
 
Windows7 Xprofan 8,9,10 [...]  [...] 
10/17/07  
 



I poste you yet today evening what!
 
10/17/07  
 




GDL
Thx.
 
Windows7 Xprofan 8,9,10 [...]  [...] 
10/17/07  
 



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...

747 kB
Hochgeladen:10/17/07
Downloadcounter105
Download
 
10/17/07  
 




GDL
whether I there apiece durchblicke circa this in my Proggi einzustricken?

Hello
Georg
 
Windows7 Xprofan 8,9,10 [...]  [...] 
10/18/07  
 




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.
 
10/18/07  
 



@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

}


229 kB
Hochgeladen:10/18/07
Downloadcounter96
Download
747 kB
Hochgeladen:10/18/07
Downloadcounter115
Download
 
10/18/07  
 




Rolf
Koch
I know the but already.
Aussderdem is by the geniale Umsetzung of Andreas Miethe still a ansehliche Control drin
 
10/18/07  
 




Answer


Topictitle, max. 100 characters.
 

Systemprofile:

no Systemprofil laid out. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

Please register circa a Posting To verfassen.
 

Topic-Options

2.702 Views

Untitledvor 0 min.
GDL09/07/14
Ernst04/18/14
Uwe Lang06/22/13
Donnie03/30/13
More...

Themeninformationen



Admins  |  AGB  |  Applications  |  Authors  |  Chat  |  Privacy Policy  |  Download  |  Entrance  |  Help  |  Merchantportal  |  Imprint  |  Mart  |  Interfaces  |  SDK  |  Services  |  Games  |  Search  |  Support

One proposition all XProfan, The there's!


My XProfan
Private Messages
Own Storage Forum
Topics-Remember-List
Own Posts
Own Topics
Clipboard
Log off
 Deutsch English Français Español Italia
Translations

Privacy Policy


we use Cookies only as Session-Cookies because of the technical necessity and with us there no Cookies of Drittanbietern.

If you here on our Website click or navigate, stimmst You ours registration of Information in our Cookies on XProfan.Net To.

further Information To our Cookies and moreover, How You The control above keep, find You in ours nachfolgenden Datenschutzerklärung.


all rightDatenschutzerklärung
i want none Cookie