Callback Funktionen

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Unsere Datenschutzerklärung wurde aktualisiert. Mit der Nutzung unseres Forums akzeptierst Du unsere Datenschutzerklärung. Du bestätigst zudem, dass Du mindestens 16 Jahre alt bist.

    • Unabhängig von der Geschwindigkeit wären Callbackfunktion aber cool. Da steckt noch viel Potenzial in XProfan.
      XProfan-Semiprofi (XProfan X4a+XPIA+LemonEd)
      Ryzen 1700X/MSI B350 PC MATE/16GB RAM@2933MHz/Radeon HD7770 OC/Creative X-Fi XTreme Music/90TB HDD+256GB Samsung 960 EVO/28" Samsung 4k
      XBox Classic/360S/One S/One X Scorpio Edition/PS3 Super Slim 500GB/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84) auf 60" 4k/3D LG
      OnePlus 7 8GB/256GB
      jacdelad.bplaced.net
    • Es geht ja nicht nur alleine um die Funktion. Das Langsame bei XProfan
      sind ja auch die WhileLoop - Schleifen. Das hast du ja selber mit dem
      neuen ASM-Feature von XProfan bewiesen.
      Du kannst ja mal eine Schleife mit 10000 Durchläufen mit einem
      Interpreter und einem nativen Compiler messen. Je mehr Iterationen,
      um so größer wird der Unterschied.

      Aber, wie ich bereits sagte, spreche ich von Hausgebrauch. Das sind
      für mich etwa 1...1000 Einträge.

      Was die Funktion anbetrifft, könnte man der sogar noch mit ASM
      mehr Speed geben. Steht ja nirgendwo, daß die Proc's unbedingt
      mit XProfan - Befehlen geschrieben sein müssen.

      Eine Funktion mit ASM...ENDASM müßte da natürlich genau
      so gut als Callback passen.

      Von daher habe ich also keine Bedenken.
    • Eigentlich wollte ich antworten, dass das Thema interessant ist, aber es nicht mehr für X4 reicht, ... aber dann hat es mich doch in den Fingern gejuckt. Folgendes wird gehen:

      Quellcode

      1. MoveListProc
      2. Parameters string s, int i
      3. if get("MoveListMode") = 1
      4. AddString str$(i) + " " + s
      5. elseif get("MoveListMode") = 2
      6. AddString left$(s, 2)
      7. endif
      8. EndProc
      9. cls
      10. var string tage[] = "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag"
      11. set("MoveListMode", 1)
      12. move("ArrToList", tage[])
      13. set("MoveListMode", 2)
      14. move("ArrToList", tage[])
      15. set("MoveListMode", 0)
      16. move("ArrToList", tage[])
      17. listbox$("Liste", 1)
      18. WaitInput
      19. End
      Alles anzeigen

      Wenn der MoveListMode 0 ist (Voreinstellung), läuft alles wie bisher. Die Einträge landen blitzschnell und unverfälscht in der ListboxListe. Ist der Modus größer als 0, muss die Prozedur "MoveListProc" existieren. Dieser wird für jeden Eintrag der Quelle (Array, String, File, Mem oder Handle) der String und der Index als Parameter übergeben. Was dann damit angestellt wird, bleibt dem Programmierer überlassen. Man kann den String z.B. bearbeiten und dann mit AddString der ListboxListe hinzufügen. Man könnte ihn aber auch nur anzeigen, oder in ein Grid schreiben oder ...
      Abhängig vom Modus kann die Bearbeitung unterschiedlich sein.

      Der MoveListMode gilt für alle Move("..ToList"-Funktionen.

      Gruß
      Roland

      Ich werde eine neue Subscriptionsversion mit dieser Fähigkeit heute oder in den nächsten Tagen hochladen.
      (Intel Duo E8400 3,0 GHz / 4 GB RAM / 250 GB HDD / ATI Radeon HD4770 512 MB / Windows Vista - ausgemustert zum Verkauf)
      AMD Athlon II X2 2,9 GHz / 8 GB RAM / 500 + 1000 GB HDD / ATI Radeon 3000 (onboard) / Windows 10(64) - XProfan X4


      http://www.xprofan.de
    • Na, das klingt doch gut. Ich will nicht rumningeln, aber da ich es gerade gebrauchen könnte: Ist auch ein Move("FileToHandle",...) geplant? Das fehlt irgendwie noch in der Sammlung. So muss ich die Datei in die Listboxliste einlesen und die dann ins Handle kopieren. Das könnte man vereinfachen.

      Nachtrag: Geht bestimmt nicht. Die Move-Funktion baut immer mit der Listboxliste in einer Seite auf, das ist für Roland bestimmt zu viel Aufwand. :-(
      XProfan-Semiprofi (XProfan X4a+XPIA+LemonEd)
      Ryzen 1700X/MSI B350 PC MATE/16GB RAM@2933MHz/Radeon HD7770 OC/Creative X-Fi XTreme Music/90TB HDD+256GB Samsung 960 EVO/28" Samsung 4k
      XBox Classic/360S/One S/One X Scorpio Edition/PS3 Super Slim 500GB/PS4 Pro (XBL-ID: jacdelad, PSN: jacdelad84) auf 60" 4k/3D LG
      OnePlus 7 8GB/256GB
      jacdelad.bplaced.net
    • RGH schrieb:

      Wenn der MoveListMode 0 ist (Voreinstellung), läuft alles wie bisher. Die Einträge landen blitzschnell und unverfälscht in der ListboxListe. Ist der Modus größer als 0, muss die Prozedur "MoveListProc" existieren. Dieser wird für jeden Eintrag der Quelle (Array, String, File, Mem oder Handle) der String und der Index als Parameter übergeben. Was dann damit angestellt wird, bleibt dem Programmierer überlassen. Man kann den String z.B. bearbeiten und dann mit AddString der ListboxListe hinzufügen. Man könnte ihn aber auch nur anzeigen, oder in ein Grid schreiben oder ...
      Abhängig vom Modus kann die Bearbeitung unterschiedlich sein.

      Der MoveListMode gilt für alle Move("..ToList"-Funktionen.
      Roland, Genial :thumbsup:
      Damit braucht man nur eine Callback-Proc (MoveListProc) für alle.
      Worüber ich jetzt aber grübele :
      In deinem obigen Code hast du den MoveListMode für Move("ArrToList",...) verwendet.
      Wenn ich aber nun mehrere Move("..ToList",...) mit der MoveListProc bedienen
      möchte, dann stimmt zwar der Code für ein Array, aber nicht für eine andere Quelle,
      z.B. eine Gridbox (...|....|). Da bekommst du mit Left$() nicht das Gewünschte raus
      sondern eher mit SubStr$() + Delimitter.
      Man könnte höchstens den MoveListMode als Protokoll verwenden (1 = Array, 2 = String, 3 = Handle, usw.).

      Das ist das Problem : Der MoveListMode gilt für alle Move("..ToList"-Funktionen

      Oder bin ich da mal wieder auf dem Holzweg ?
    • Nachtrag :
      Die MoveListProc weiß ja bei ihrem Aufruf nicht, von welcher Art Liste
      der String und der index kommt. Und ich als Programmierer auch nicht.

      Vielleicht wäre da eine Systemvariable, die nur in der MoveListProc
      gültig ist, hilfreich. Die könnte dann sowas ähnliches, wie pType$()
      ([] für Array {} für Gridbox o.ä.) enthalten. Durch Abfragen dieser
      Systemvariablen hätte man die Art der Liste und könnte den Code
      für die Bearbeitung des Strings entsprechend schreiben.

      Vielleicht auch so was ähnliches wie bei SUBCLASSPROC das
      SubClassMessage(&hWnd, MsgNr%)
      wo man das Handle der gerade aktuellen zu bearbeitenden Liste bekommt :

      Quellcode

      1. If ListProcHandle(HandleDerListe&)
      2. If MoveListMode = 1
      3. .....
      4. ElseIf MoveListMode = 2
      5. ......
      6. EndIf
      7. EndIf


      Den MoveListMode könnte man dann, wie oben gehabt, verwenden.

      Wäre noch ein Vorschlag von mir.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von H.Brill ()

    • Du gibst ja vor Aufruf der "...ToList"-Funktion den MoveList-Modus an, den Du für diese Funktion verwenden willst. Diesen kannst Du ja, wie im Beispiel gezeigt, in der MOVELISTPROC abfragen. Und somit weißt Du, woher der String und der Index kommen.

      Und in allen Fällen handelt es sich um einen einfachen String.

      Gruß
      Roland
      (Intel Duo E8400 3,0 GHz / 4 GB RAM / 250 GB HDD / ATI Radeon HD4770 512 MB / Windows Vista - ausgemustert zum Verkauf)
      AMD Athlon II X2 2,9 GHz / 8 GB RAM / 500 + 1000 GB HDD / ATI Radeon 3000 (onboard) / Windows 10(64) - XProfan X4


      http://www.xprofan.de
    • Wird das eigentlich irgendwann mal nicht zu langsam, wenn z.B.
      50 x oder mehr ?

      Quellcode

      1. If MoveListMode = 1
      2. .....
      3. ElseIf MoveListMode = 2
      4. ......
      5. EndIf
      drin sind. Ich kann ja den Modus beliebig erhöhen und neuen Code schreiben,
      wenn sich die Anforderungen ändern. Wäre z.B. der Fall, wenn eine Gridbox
      viele Spalten hat und bei jeder Spalte ändert sich die Aufgabe. Und so eine
      Callback kann man ja vielseitig nutzen. Es spräche ja auch nichts dagegen,
      die Move(...ToList) - Funktionen zum Aufaddieren, MWST ausrechnen usw.
      für jede Spalte zu mißbrauchen. Die Listboxliste kann man ja dann außen
      vor lassen.

      Da es aber nur eine feste MoveListProc gibt, wird es auch schwierig, bewährte
      selbstgeschriebene Codes darin zu verwalten. Man erfindet das Rad ja nicht
      jedesmal neu, sondern nutzt Altbewährtes. Wenn man sich dann noch den
      gebrauchten Code von älteren Quellcodes zusammen suchen muß ?
      Man will ja schließlich keine riesengroße MoveListProc, sondern eine solche,
      die für den momentanen Einsatzzweck die Anforderungen erfüllt.

      Von daher wäre mir eine selbstgeschriebene Callbackproc lieber gewesen.
      Natürlich mit fester Vorgabe mit :
      Parameters string s, int i
      Dann könnte man die Callbackproc, die man gerade braucht an alle
      Move-Funktionen binden (Set("MoveListCallback", "Proc-Name")) und
      MoveListMode könnte entfallen. Und auch die vielen
      If MoveListMode = x
      -------
      Endif
      bräuchte man dann nicht.
      Vielleicht könntest du auch einen extra Container machen, in der die
      Callback-Procs mit SubProc gesammelt werden. Bei
      Set("MoveListCallback", "Proc-Name"))
      im Container nachschauen und die Proc anbinden.
      Das wäre dann ganz XProfan-konform.

      Wie gesagt: So, wie es jetzt ist, ist es für einige wenige Codes
      sehr gut durchdacht. Aber bei sehr vielen Codes wird das sehr
      unübersichtlich.

      Sind jetzt nur so ein paar Gedanken von mir.
      Ob überhaupt machbar, mußt du entscheiden.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von H.Brill ()

    • Du kannst ja problemlos aus der MOVELISTPROC andere Prozeduren in deinem Programm aufrufen. Dann bleibt die eigentliche MOVELISTPROC übersichtlich. Und es wird ja immer nur exakt ein String bearbeitet, der allerdings bei Gridboxen aus mehreren Teilstrings bestehen kann.

      Gruß
      Roland
      (Intel Duo E8400 3,0 GHz / 4 GB RAM / 250 GB HDD / ATI Radeon HD4770 512 MB / Windows Vista - ausgemustert zum Verkauf)
      AMD Athlon II X2 2,9 GHz / 8 GB RAM / 500 + 1000 GB HDD / ATI Radeon 3000 (onboard) / Windows 10(64) - XProfan X4


      http://www.xprofan.de
    • Hab schon etwas rum gespielt :

      Quellcode

      1. Declare String z, Handle gb, lv, Long summe
      2. z = "Was|ist|das|für|ein|Tag|gewesen !"
      3. Window 600, 400
      4. gb = Create("Grid", 3, 0) ' unsichtbares Grid mit 2 Spalten
      5. lv = Create("Gridbox", %HWnd, "Spalte 1;0;80;Spalte 2;0; 120;Wert;0;60", 0, 50, 200, 280, 100)
      6. WhileLoop 1, 100
      7. AddString(gb, Str$(&LOOP) + "|" + "Zeile" + "|" + Str$(Rnd(100 - 1)+ 1))
      8. EndWhile
      9. MoveListProc
      10. Parameters String s, int i
      11. If Get("MoveListMode") = 1
      12. s = Upper$(s)
      13. Print i, s
      14. ElseIf Get("MoveListMode") = 2
      15. If (i > 48) And (i < 70) ' die Zeilen zwischen 50 und 70 kommen in die Gridbox
      16. AddString(0, s)
      17. EndIf
      18. ElseIf Get("MoveListMode") = 3
      19. summe = summe + Val(SubStr$(s, 3, "|")) ' Spalte 3 zusammenzählen
      20. EndIf
      21. EndProc
      22. Set("MoveListMode", 1)
      23. Print Move("StrToList", z, "|")
      24. Print "Taste für weiter...."
      25. waitkey
      26. Set("MoveListMode", 2)
      27. Move("HandleToList", gb)
      28. Set("MoveListMode", 0)
      29. ClearList lv
      30. Move("ListToHandle", lv)
      31. Print "weiter für Taste..."
      32. waitkey
      33. ClearList lv
      34. ClearList
      35. summe = 0
      36. Move("HandleToList", gb)
      37. Move("ListToHandle", lv)
      38. Set("MoveListMode", 3)
      39. Move("HandleToList", gb)
      40. AddString(lv, "---|SUMME :|" + Str$(summe))
      41. SetCurSel lv, GetCount(lv) - 1
      42. Print "Taste für Ende...."
      43. Waitkey
      Alles anzeigen
      Damit kann man schon einiges anstellen.
    • Und da Roland uns ja die Freiheit gibt, selber zu entscheiden, was mit dem Eintrag
      geschieht, ist auch ein begrenztes Move("HandleToHandle",...) möglich.
      Man muß nur dazu Move("HandleToList",...) benutzen, da ja die SubProcs
      von der neuen Funktionalität nicht profitieren können.
      Man hat auf jeden Fall den Umweg über die Listboxliste gespart.

      Quellcode

      1. Declare Handle gb, lv, btn1, Long ende
      2. ende = 0
      3. Window 600, 400
      4. gb = Create("GridBox", %HWnd, "Spalte 1;0;80;Spalte 2;0; 120;Wert;0;60", 0, 50, 50, 280, 100)
      5. lv = Create("Gridbox", %HWnd, "Spalte 1;0;80;Spalte 2;0; 120;Wert;0;60", 0, 50, 220, 280, 100)
      6. btn1 = Create("Button", %HWnd, "Copy", 50, 180, 60 ,25)
      7. WhileLoop 1, 10
      8. AddString(gb, Str$(&LOOP) + "|" + "Zeile" + "|" + Str$(Rnd(100 - 1)+ 1))
      9. EndWhile
      10. WhileNot ende
      11. WaitInput
      12. If Clicked(btn1)
      13. ClearList lv
      14. Sleep 300
      15. Set("MoveListMode", 1)
      16. Move("HandleToList", gb)
      17. EndIf
      18. Case %Key = 2 : ende = 1
      19. EndWhile
      20. MoveListProc
      21. Parameters String s, int i
      22. If Get("MoveListMode") = 1
      23. AddString(lv, s)
      24. EndIf
      25. EndProc
      Alles anzeigen
    • Das bedeutet dann, das sich auch alle Move("ListTo...",...) nachbilden lassen.

      Auch Listen gleich in HTML einbauen geht dann einfach; genauer gesagt kann mit diesen Strings alles aufgebaut werden.

      Aus Array,Datei,Speicher,String und allen Handle-Listen/-Grids können die Daten kommen. Der Generator sorgt für zeilenweises bereitstellen der Daten.


      Quellcode

      1. Declare string html_start, html_end, line_start, line_mid, line_end
      2. Declare string Quelle[2]
      3. Cls
      4. Print "gelistet wird\n"
      5. html_start = "<!DOCTYPE html><html><head><meta name=\qviewport\q content=\qwidth=device-width, initial-scale=1\q>" + \
      6. "<style>table {border-collapse: collapse; border-spacing: 0; width: 100%; border: 1px solid #ddd;}" + \
      7. "th, td { text-align: left; padding: 16px;} tr:nth-child(even) {background-color: #f2f2f2}" + \
      8. "</style></head><body><h2>Zebra Striped Table</h2>" + \
      9. "<p>Entliehen aus: https://www.w3schools.com/howto/howto_css_table_zebra.asp</p>" + \
      10. "<p>For zebra-striped tables, use the nth-child() selector and add a background-color to all even (or odd) table rows:</p><table>" + \
      11. "<tr><th>First Name</th><th>Last Name</th><th>Points</th></tr>"
      12. html_end = "</table></body></html>"
      13. line_start = "<tr><td>"
      14. line_mid = "</td><td>"
      15. line_end = "</td></tr>"
      16. Quelle[0] = "Jill|Smith|50"
      17. Quelle[1] = "Eve|Jackson|94"
      18. Quelle[2] = "Adam|Johnson|67"
      19. MoveListProc
      20. Parameters String s, int i
      21. Declare string s2
      22. If Get("MoveListMode") = 1
      23. Print SubStr$(s,1,"|"), SubStr$(s,2,"|"), SubStr$(s,3,"|")
      24. s2 = line_start $ SubStr$(s,1,"|") $ line_mid $ SubStr$(s,2,"|") $ line_mid $ SubStr$(s,3,"|") $ line_end
      25. Print #1, s2 : err = %IOResult
      26. EndIf
      27. EndProc
      28. Declare int err, string Testdatei
      29. MkDir "C:\\TEMP"
      30. err = %IOResult
      31. Testdatei = "C:\\TEMP\\TEMP_HTML_TEMP.html"
      32. Assign #1,Testdatei : err = %IOResult
      33. Rewrite #1 : err = %IOResult
      34. Print #1, html_start : err = %IOResult
      35. Set("MoveListMode",1)
      36. Move("ArrToList",Quelle[])
      37. Print #1, html_end : err = %IOResult
      38. Close #1 : err = %IOResult
      39. Print "\nENTER für Ende (es wird mit ShellExec aber noch die HTML-Datei angezeigt)"
      40. ShellExec( Testdatei, "open", 5)
      41. WaitInput
      42. End
      Alles anzeigen
      und nochmal mit mehr als 3 Datenzeilen, damit es klarer wird

      Quellcode

      1. Declare string html_start, html_end, line_start, line_mid, line_end, temp, temp2
      2. Declare string Quelle[52]
      3. Cls
      4. Print "gelistet wird\n"
      5. html_start = "<!DOCTYPE html><html><head><meta name=\qviewport\q content=\qwidth=device-width, initial-scale=1\q>" + \
      6. "<style>table {border-collapse: collapse; border-spacing: 0; width: 100%; border: 1px solid #ddd;}" + \
      7. "th, td { text-align: left; padding: 16px;} tr:nth-child(even) {background-color: #f2f2f2}" + \
      8. "</style></head><body><h2>Zebra Striped Table</h2>" + \
      9. "<p>Entliehen aus: https://www.w3schools.com/howto/howto_css_table_zebra.asp</p>" + \
      10. "<p>For zebra-striped tables, use the nth-child() selector and add a background-color to all even (or odd) table rows:</p><table>" + \
      11. "<tr><th>First Name</th><th>Last Name</th><th>Points</th></tr>"
      12. html_end = "</table></body></html>"
      13. line_start = "<tr><td>"
      14. line_mid = "</td><td>"
      15. line_end = "</td></tr>"
      16. 'Zu faul zum selbst befüllen, und die Namen wurden im Netz **generiert**. Gesucht durch "list of names".
      17. temp = "Jill|Smith,Eve|Jackson,Adam|Johnson,Erick|Grinnell,Elizbeth|Silver,Jordon|Sarkisian,Herma|Beene,Gilberto|Mullenix,Neal|Speed,Jaimee|Mccarthy," + \
      18. "Cherrie|Mcmurry,Rozanne|Eversole,Linh|Schwartzberg,Maxima|Wein,Yuki|Putney,Billie|Claycomb,Lavina|Ungar,Mammie|Bator,Anna|Monteiro,Breann|Traynor," + \
      19. "Lenita|Kula,Ligia|Sherburne,Tijuana|Whitlock,Claretta|Brockwell,Billye|Glymph,Troy|Keown,Ezra|Voll,Inger|Mccraw,Lesha|Eichhorn,Evita|Waybright," + \
      20. "Zack|Taillon,Anjanette|Brien,Paulette|Begum,Elaine|Hartwig,Nick|Briley,Reiko|Martin,Marquis|Knobel,Hal|Mance,Lamonica|Michels,Caroll|Hinson," + \
      21. "Chara|Madrid,Cecile|Beecroft,Robbyn|Velazco,Arvilla|Houlihan,Stacie|Farish,Rosaura|Copper,Quyen|Quinlan,Tomeka|Wilcoxon,Clementina|Cather," + \
      22. "Marth|Brim,Izetta|Goold,Suzanne|Harber,Noella|Passman"
      23. Randomize
      24. Set("Decimals",0)
      25. WhileLoop 0,52
      26. temp2 = SubStr$(temp, &loop + 1, ",") $ "|" $ Str$(Range(rnd(99) + 1,1,100))
      27. Quelle[&loop] = temp2
      28. EndWhile
      29. MoveListProc
      30. Parameters String s, int i
      31. Declare string s2
      32. If Get("MoveListMode") = 1
      33. Print i, SubStr$(s,1,"|"), SubStr$(s,2,"|"), SubStr$(s,3,"|")
      34. s2 = line_start $ SubStr$(s,1,"|") $ line_mid $ SubStr$(s,2,"|") $ line_mid $ SubStr$(s,3,"|") $ line_end
      35. Print #1, s2 : err = %IOResult
      36. EndIf
      37. EndProc
      38. Declare int err, string Testdatei
      39. MkDir "C:\\TEMP" : err = %IOResult
      40. Testdatei = "C:\\TEMP\\TEMP_HTML_TEMP.html"
      41. Assign #1,Testdatei : err = %IOResult
      42. Rewrite #1 : err = %IOResult
      43. Print #1, html_start : err = %IOResult
      44. Set("MoveListMode",1)
      45. Move("ArrToList",Quelle[])
      46. Print #1, html_end : err = %IOResult
      47. Close #1 : err = %IOResult
      48. Print "\nENTER für Ende (es wird mit ShellExec aber noch die HTML-Datei angezeigt)"
      49. ShellExec( Testdatei, "open", 5)
      50. WaitInput
      51. End
      Alles anzeigen
      Programmieren, das spannendste Detektivspiel der Welt.

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Michael Wodrich ()