Deutsch
Forum

Tausend und ein Handle...

 
Hör oft so etwas wie 1000 Buttonhandle in Arrays und frägt diese dann in der Hauptschleife mit mouseouver und clicked ab.

Hierzu mal ein Tip wie ich sowas erledigen würde ohne Schleife, also deutlich performanter.
KompilierenMarkierenSeparieren
 {$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)

}


Das Ganze lässt sich beliebig verbessern,- und auch jede mögliche Abprüfung derart integrieren. Statt einfach das Buttonhandle ins gänzlich unbenutzte h zu packen könnte man auch createbutton in eine Funktion Trash umleiten trash(createbutton(hwnd,knop+str$(i),x,y,40,10)). Funktion trash könnte eine Liste mit den Handles füllen und beim beenden des Programmes könnte man diese Liste für Destroywindows nutzen. Usw... Das wiederum mache ich u.a. im Source von okrea  [...]  vor.
 
16.10.2007  
 




GDL
Hallo iF,

ich bekomme es nicht hin, wenn die Objekte dann verschoben werden.
KompilierenMarkierenSeparieren
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 nicht den blassesten Schimmer wie ich das hinbekommen soll.

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



Ich kann mit dem Source nicht so viel anfangen da er ja nicht lauffähig ist. Mach mal bitte ein Minimalbeispiel dann muss ich mich nicht erst groß einarbeiten.
 
17.10.2007  
 




GDL
@if, falls du möchtest,

ein Minimalbeispiel bringt nichts, da das ganze dann aus dem Zusammenhalt gerissen ist.

Dies war mein erstes Profanmodul, darum iss auch alles von Profan7.5 bis XProfan10 vertreten.
Der Code ist nicht optimiert, aber XPSE konform.
Da ich erst meine Anlagen fertig bringen muss, ist für mich erstmal wichtig dass das Modul überhaupt läuft.

Das Programm bekommste zum Laufen, wenn du den Inhalt von diesem Ordner nach C:Steuerung kopierst. [...] 

und die Pfade im Programm änderst, die mit ######## eingefasst sind.
Ausschlaggebend ist eigendlich nur die Procedure verschieben.

Wenn du mein Wettbewerbsproggi heruntergeladen hast, dort ist es das Modul Gleisplan.

Servus
Georg

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



Ich poste Dir noch heute Abend was!
 
17.10.2007  
 




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



Tausendundeinhandle verschieben ohne nicht-native Schleife *g* - ich hoffe das Beispiel hilft Dir nach längerer Betrachtung zumindest das Prinzip dahinter zu verstehen.

@Roland: Im Array suchen und ItemID-Zurückgabe fehlt irgendwie ständig sodass man wie hier z.B. Kopfstand machen muss. (ist mir schon x mal aufgefallen)
KompilierenMarkierenSeparieren
 {$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

}


Die Performance kann man leicht testen indem man einfach mal auf einer Pfeiltaste bleibt und die Maus über die Controls bewegt. Die Ermittlung des Controls mit dazugehöriger Array-Item-ID geht recht fix. Na klar hat der Source hier und da noch ein paar Unstimmigkeiten die zu beheben wären...

747 kB
Hochgeladen:17.10.2007
Ladeanzahl105
Herunterladen
 
17.10.2007  
 




GDL
Ob ich da je durchblicke um dies in mein Proggi einzustricken?

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




Jörg
Sellmeyer
Sehr cool! Ich schätze, das wird Rolf auch interessieren für seinen Roc.
 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
18.10.2007  
 




Frank
Abbing
In dem Zusammenhang ist Get/SetWindowLong mit GWL_ID oder GWL_USERDATA interessant. Anhand einer dieser Speicherplätze kann jedes Control erkannt werden, ohne irgendwelche Umwege und wahrscheinlich noch schneller. Ich persönlich würde diesen Weg gehen.
 
18.10.2007  
 



@Jörg: Rolf würde warscheinlich eher das hier interessieren:  [...]  (exe anhängig)

@Frank: Natürlich hatte ich auch an gwl_userdata gedacht. Hiermit wäre es auch möglich in/per gwl_userdata wiederum das Handle eines weiteren Controls abzuspeichern welches wiederum noch viel mehr Daten tragen könnte. (z.B. ne ListBox)

Ich hatte den Umweg gewählt da dieser auch so ein paar xprofansche Problemfälle demonstriert und zeigt das es für manche Aufgaben vlt. vorgefertigte Native (in XProfan eingebaute) Lösungen geben sollte.

Nach gwl_userdata würde das so aussehen:
KompilierenMarkierenSeparieren
//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
Ladeanzahl96
Herunterladen
747 kB
Hochgeladen:18.10.2007
Ladeanzahl115
Herunterladen
 
18.10.2007  
 




Rolf
Koch
Ich kenne das doch schon.
Aussderdem ist durch die geniale Umsetzung von Andreas Miethe doch eine ansehliche Steuerung drin
 
18.10.2007  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

2.687 Betrachtungen

Unbenanntvor 0 min.
GDL07.09.2014
Ernst18.04.2014
Uwe Lang22.06.2013
Donnie30.03.2013
Mehr...

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie