Español
Foro

Tausend y una Handle...

 
Hör oft así algo como 1000 Buttonhandle en Arrays y frägt esta entonces en el Hauptschleife con mouseouver y clicked de.

Hierzu veces una Tip Yo algo como erledigen sería sin Bucle, also deutlich performant.
KompilierenMarcaSeparación
 {$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>}


Das Ganze lässt se cualquier verbessern,- y jede mögliche Abprüfung derart integrieren. Statt simplemente el Buttonhandle en el gänzlich unbenutzte h a packen podría uno auch createbutton en un Función Trash umleiten trash(createbutton(hwnd,knop+str$(i),x,y,40,10)). Función trash podría una Liste con el Handles füllen y beim final des Programmes podría uno esta Liste para Destroywindows nutzen. Usw... Das wiederum mache Yo u.a. en el Source de okrea  [...]  antes.
 
16.10.2007  
 




GDL
Hola si,

Yo bekomme no hin, si la Objetos entonces movido voluntad.
KompilierenMarcaSeparación
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


Posesiones no el blassesten Schimmer como yo hinbekommen se.

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



Puedo con el Source no así viel anfangen como él sí no lauffähig es. Mach veces Por favor, una Minimalbeispiel entonces muss Yo mich no sólo groß einarbeiten.
 
17.10.2007  
 




GDL
@if, si du möchtest,

una Minimalbeispiel bringt nichts, como todos entonces de el Zusammenhalt gerissen es.

Dies war mein erstes Profanmodul, por lo tanto iss auch alles de Profano7.5 a XProfan10 vertreten.
Der Code es no optimiert, aber XPSE konform.
Desde que sólo mi Anlagen fertig bringen muss, es para mich primero wichtig dass el Modul überhaupt se ejecuta.

Das Programa bekommste para Laufen, si du el Inhalt de diesem Ordner después de C:Steuerung kopierst. [...] 

y el Pfade en el Programa änderst, el con ######## eingefasst son.
Ausschlaggebend es eigendlich sólo el Procedure mover.

Wenn du mein Wettbewerbsproggi heruntergeladen hast, hay es el Modul Gleisplan.

Servus
Georg

62 kB
Hochgeladen:17.10.2007
Ladeanzahl111
Descargar
 
Windows7 Xprofan 8,9,10 [...]  [...] 
17.10.2007  
 



Yo poste Usted todavía heute Abend qué!
 
17.10.2007  
 




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



Tausendundeinhandle mover sin no-native Bucle *g* - Yo hoffe el Ejemplo hilft Usted después de längerer Betrachtung zumindest el Principio detrás de él a verstehen.

@Roland: Im Array suchen y ItemID-Zurückgabe fehlt irgendwie ständig sodass uno como hier z.B. Kopfstand hacer muss. (me está ya x veces aufgefallen)
KompilierenMarcaSeparación
 {$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)

    }

    volver item

}


El Performance puede ser ligeramente testen indem uno simplemente veces en uno Pfeiltaste restos y el Ratón en Controls bewegt. El Ermittlung des Controls con dazugehöriger Array-Item-ID va bastante fix. Na klar ha el Source hier y como todavía unos pocos Unstimmigkeiten el a beheben wären...

747 kB
Hochgeladen:17.10.2007
Ladeanzahl105
Descargar
 
17.10.2007  
 




GDL
Ob Yo como je durchblicke en dies en mein Proggi einzustricken?

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




Jörg
Sellmeyer
Sehr fresco! Yo schätze, el se Rolf auch interés para seinen Roc.
 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
18.10.2007  
 




Frank
Abbing
In el Zusammenhang es Get/SetWindowLong con GWL_ID oder GWL_USERDATA interessant. Anhand uno dieser Speicherplätze kann cada Control erkannt voluntad, sin irgendwelche Umwege y wahrscheinlich todavía más rápido. Yo persönlich sería esta Weg ir.
 
18.10.2007  
 



@Jörg: Rolf sería warscheinlich más que aquí interés:  [...]  (exe anhängig)

@Franco: Natürlich Tuve auch a gwl_userdata pensamiento. Hiermit wäre lo auch posible en/por gwl_userdata wiederum el Handle uno más Controls abzuspeichern welches wiederum todavía viel mehr Daten tragen podría. (z.B. ne ListBox)

Tuve el Umweg gewählt como dieser auch así unos pocos xprofansche Problemfälle demonstriert y zeigt el lo para manche Aufgaben vlt. vorgefertigte Nativo (en XProfan eingebaute) Lösungen geben debería.

Nach gwl_userdata sería el así aussehen:
KompilierenMarcaSeparación
//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)

    }

    volver item

}


229 kB
Hochgeladen:18.10.2007
Ladeanzahl96
Descargar
747 kB
Hochgeladen:18.10.2007
Ladeanzahl115
Descargar
 
18.10.2007  
 




Rolf
Koch
Yo saber el doch ya.
Aussderdem es por el geniale Umsetzung de Andreas Miethe doch una ansehliche Steuerung drin
 
18.10.2007  
 




Respuesta


Título del Tema, max. 100 Signo.
 

Systemprofile:

Kein Systemprofil creado. [anlegen]

XProfan:

 Contribución  Font  Smilies  ▼ 

Bitte registro en una Contribución a verfassen.
 

Tema opciones

2.660 Views

Untitledvor 0 min.
GDL07.09.2014
Ernst18.04.2014
Uwe Lang22.06.2013
Donnie30.03.2013
Más...

Themeninformationen



Admins  |  AGB  |  Applications  |  Autores  |  Chat  |  Política de Privacidad  |  Descargar  |  Entrance  |  Ayuda  |  Merchantportal  |  Pie de imprenta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Juegos  |  Búsqueda  |  Support

Ein Projekt aller XProfan, el lo son!


Mi XProfan
Privado Noticias
Eigenes Ablageforum
Temas-Merkliste
Eigene Beiträge
Eigene Temas
Zwischenablage
Cancelar
 Deutsch English Français Español Italia
Traducciones

Política de Privacidad


Wir uso Cookies sólo como Session-Cookies wegen el technischen Notwendigkeit y en uns hay no Cookies de Drittanbietern.

Wenn du hier en unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung de Informationen en unseren Cookies en XProfan.Net a.

Weitere Informationen a unseren Cookies y dazu, como du el Kontrolle darüber behältst, findest du en unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Yo möchte no Cookie