Français
Forum

mille et un Handle...

 
Hör souvent so quelque chose comment 1000 Buttonhandle dans Arrays et frägt cet ensuite dans qui Hauptschleife avec mouseouver et clicked ab.

Hierzu la fois un Tip comment je quelque chose comme erledigen serait sans Boucle, alors deutlich performant.
KompilierenMarqueSéparation
 {$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>}


cela Ganze peut sich beliebig améliorer,- et chacun mögliche Abprüfung derart intégrer. Statt simple cela Buttonhandle ins gänzlich unbenutzte h trop saisir pourrait on aussi createbutton dans un Funktion Trash détourner trash(createbutton(hwnd,knop+str$(i),x,y,40,10)). Funktion trash pourrait une liste avec den Handles füllen et beim finissons des Programmes pourrait on cet liste pour Destroywindows nutzen. Usw... cela wiederum fais je u.a. im Source de okrea  [...]  avant.
 
16.10.2007  
 




GDL
allô iF,

je bekomme es pas hin, si le Objekte ensuite déménagé volonté.
KompilierenMarqueSéparation
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


Habe pas den blassesten Schimmer comment je cela hinbekommen soll.

salut
Georg
 
Windows7 Xprofan 8,9,10 [...]  [...] 
16.10.2007  
 



je peux avec dem Source pas so viel anfangen là il oui pas courir ist. Mach la fois s'il te plaît un Minimalbeispiel ensuite muss je mich pas seulement grand einarbeiten.
 
17.10.2007  
 




GDL
@si, si du vouloir,

un Minimalbeispiel bringt rien, là cela ganze ensuite aus dem Zusammenhalt malain ist.

ca était mon erstes Profanmodul, tout autor iss aussi alles de Profan7.5 jusqu'à XProfan10 vertreten.
qui Code ist pas optimiert, mais XPSE konform.
là je seulement mon Anlagen fertig apporter muss, ist pour mich erstmal important dass cela Modul überhaupt fonctionne.

cela Programme bekommste zum courir, si du den le contenu de diesem Dossier pour C:Contrôle kopierst. [...] 

et qui Pfade im Programme änderst, qui avec ######## eingefasst sommes.
Ausschlaggebend ist eigendlich seulement qui Procedure Déplacer.

si du mon Wettbewerbsproggi heruntergeladen la hâte, là ist es cela Modul Gleisplan.

salut
Georg

62 kB
Hochgeladen:17.10.2007
Downloadcounter111
Download
 
Windows7 Xprofan 8,9,10 [...]  [...] 
17.10.2007  
 



je Poste Dir encore aujourd'hui soir quoi!
 
17.10.2007  
 




GDL
Thx.
 
Windows7 Xprofan 8,9,10 [...]  [...] 
17.10.2007  
 



Tausendundeinhandle Déplacer sans pas-native Boucle *g* - je hoffe cela Beispiel hilft Dir pour längerer Betrachtung zumindest cela Prinzip derrière elle trop comprendre.

@Roland: Im Array chercher et ItemID-Zurückgabe fehlt irgendwie ständig sodass on comment ici z.B. Kopfstand faire muss. (c'est moi déjà x la fois aufgefallen)
KompilierenMarqueSéparation
 {$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

}


qui Performance peux on léger testen indem on simple la fois sur einer Pfeiltaste bleibt et qui souris sur qui Controls bewegt. qui Ermittlung des Controls avec dazugehöriger Array-Item-ID allez droite fix. Na bien sûr hat qui Source ici et là encore un paire Unstimmigkeiten qui trop beheben wären...

747 kB
Hochgeladen:17.10.2007
Downloadcounter105
Download
 
17.10.2007  
 




GDL
si je là je durchblicke um ca dans mon Proggi einzustricken?

salut
Georg
 
Windows7 Xprofan 8,9,10 [...]  [...] 
18.10.2007  
 




Jörg
Sellmeyer
très cool! je schätze, cela wird Rolf aussi intéresser pour seinen Roc.
 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
18.10.2007  
 




Frank
Abbing
dans dem Zusammenhang ist Get/SetWindowLong avec GWL_ID ou bien GWL_USERDATA intéressant. Anhand einer cette Speicherplätze peux chaque Contrôle erkannt volonté, sans irgendwelche Umwege et wahrscheinlich encore plus rapide. je personnelle serait cette Weg aller.
 
18.10.2007  
 



@Jörg: Rolf serait warscheinlich plutôt que voici intéresser:  [...]  (exe anhängig)

@Frank: Bien sûr J'ai eu aussi à gwl_userdata gedacht. Hiermit wäre es aussi possible dans/per gwl_userdata wiederum cela Handle eines weiteren Controls abzuspeichern welches wiederum encore viel plus données tragen pourrait. (z.B. ne ListBox)

je hatte den le détour gewählt là cette aussi so un paire xprofansche Problemfälle demonstriert et zeigt cela es pour manche Aufgaben vlt. vorgefertigte Native (dans XProfan eingebaute) Lösungen donner sollte.

Pour gwl_userdata serait cela so air:
KompilierenMarqueSéparation
//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:18.10.2007
Downloadcounter96
Download
747 kB
Hochgeladen:18.10.2007
Downloadcounter115
Download
 
18.10.2007  
 




Rolf
Koch
je connais cela doch déjà.
Aussderdem ist par qui geniale Umsetzung de Andreas Miethe doch une ansehliche Contrôle drin
 
18.10.2007  
 




répondre


Topictitle, max. 100 marque.
 

Systemprofile:

ne...aucune Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

s'il te plaît s'inscrire um une Beitrag trop verfassen.
 

Options du sujet

2.692 Views

Untitledvor 0 min.
GDL07.09.2014
Ernst18.04.2014
Uwe Lang22.06.2013
Donnie30.03.2013
plus...

Themeninformationen



Admins  |  AGB  |  Applications  |  Auteurs  |  Chat  |  protection des données  |  Télécharger  |  Entrance  |  Aider  |  Merchantportal  |  Empreinte  |  Mart  |  Interfaces  |  SDK  |  Services  |  Jeux  |  cherche  |  Support

un projet aller XProfaner, qui il y a!


Mon XProfan
Privé Nouvelles
Eigenes Ablageforum
Sujets-La liste de voeux
Eigene Posts
Eigene Sujets
Zwischenablage
Annuler
 Deutsch English Français Español Italia
Traductions

protection des données


Wir verwenden Cookies seulement comme Session-Cookies à cause de qui technischen Notwendigkeit et chez uns gibt es aucun Cookies de Drittanbietern.

si du ici sur unsere Webseite klickst ou bien navigierst, stimmst du unserer Erfassung de Informationen dans unseren Cookies sur XProfan.Net trop.

Weitere Informationen trop unseren Cookies et en supplément, comment du qui Kontrolle par-dessus behältst, findest du dans unserer nachfolgenden Datenschutzerklärung.


d'accordDatenschutzerklärung
je voudrais keinen Cookie