Das geht vermutlich simpler wenn du die GUI am Anfang erstellst und danach mit GUISetState an-/ausschaltest. Es besteht kein Grund die GUI immer neu zu erzeugen. ![]()
Versuch mal die Funktion Auswahl nur einmal aufzurufen. Wenn du wieder zur Endlosschleife zurückkehren möchtest, kannst du auch per Return die aktuelle Funktion verlassen (wenn sie von Auswahl() aus aufgerufen wurde).
Ich könnte mir vorstellen, dass deine Endlosschleife zumindest Teil des Problems ist, aber ohne den restlichen Code lässt sich das schlecht sagen.
Beiträge von name22
-
-
Alles Gute lieber Admin
!
Einen schönen verbleibenden Geburtstag wünsch ich dir ;). -
@CyRoX Dazu fällt mir gerade das hier wieder ein: http://www.youtube.com/watch?v=Sgn0dWnfFx4.

-
Die Sprache entwickelt sich ja auch nicht unbedingt als Ganzes. Im Prinzip entstehen hier neue Dialekte.
Das Problem mit dieser Entwicklung der Sprache ist die Rechtschreibung. Wir brauchen eine einheitliche Definition der Rechtschreibung, da kann die Sprache so viel abweichen wie sie will. -
General Kaboom Wovon redest du?
[autoit]
Natürlich kann man Schriftarten in GDI+ verwenden um beliebige Strings zu zeichnen... Darauf wollte ich auch hinaus. Buchstaben mit normalen Linien in GDI+ zu zeichnen wäre ein bisschen ineffizient
.
Um zu sehen was ich gemeint habe brauchst du dir nur folgende Funktion anschauen und sie mit der oben beschriebenen Methode kombinieren:_GDIPlus_GraphicsDrawStringEx
[/autoit] -
Erstelle die GUIs doch einfach mit dem erweiterten Stil $WS_EX_TOOLWINDOW. Dann haben sollten die keinen Eintrag in der Taskbar erzeugen.
Aber wo liegt denn das Problem wenn sie gestapelt werden? Durch einen Klick auf den Stapel kann man doch normalerweise zwischen den Fenstern wählen.
-
Jap. Das geht mit GDI+. Du bist, glaube ich, auch nicht der erste der das fragt.
In diesem Thread ist ein Script von mir mit dem du Linien auf den Bildschirm malen kannst. Schau es dir mal an, es sollte nicht all zu schwer sein das auf Text umzustellen. -
Zitat
Naja hoffe mal das der Inhalt/Typ geprüft wird

Muss ja... Wie soll das denn sonst funktionieren? -
Zitat
$oFactory.DrawRect(0,0,100,100,$DRect())
Übersehe ich hier gerade etwas?
Eigentlich kann der Interpreter das doch nur als Funktion betrachten.
Edit: Ach so ist das gemeint... Hierbei wird der Inhalt der Variable berücksichtigt. Sollte er zumindest. Die Variable verhält sich bei Zuweisung einer Funktion wie eine Art Pointer so wie ich das verstanden habe. -
Zitat
Wenn eine Deklarierung sowohl mit als auch ohne Dollarzeichen möglich ist, nicht - ich hatte das jetzt so interpretiert, dass eine Deklaration zukünftig evtl. nur noch ohne Dollarzeichen zulässig ist - beides auf einmal finde ich etwas verwirrend.
Ich glaub du hast mich misverstanden. Das mit dem Ignorieren der Zeilenumbrüche wäre ein Script-breaking change. Die Dollar Zeichen sind optional und deswegen bliebe alles abwärtskompatibel. -
Zitat
Denen fällt wohl nichts Neues mehr ein... Dabei könnten die aus meiner Sicht gerne erstmal dafür sorgen, dass der Compiler u.a. nicht mehr auf Zeilenumbrüche reagiert...
Das wäre aber ein Script-breaking change. Das mit den Variablen nicht. -
Zitat
Dann kommt noch die "Hey Alder" Sprache hinzu und perfekt ist das Glück.
Oh Gott... Das muss ich Tag für Tag ertragen... Ich versteh mitllerweile nicht mehr Bahnhof sondern nur noch Busbahnhof. -
Und das ist, meiner Meinung nach, der beste Weg eine Sprache zu sprechen. Alle nativen Sprecher machen das nämlich auch so ^^.
Unser Gehirn verlässt sich ja sowieso in fast allen Fällen auf vergangene Erfahrungen. Anders funktioniert das wohl auch nicht. Aktiv Entscheidungen zu Problemen treffen für die wir die Lösung nicht kennen und diese nur durch Logik und bekannte Regeln erschließen können, dauert beim Sprechen doch viel zu lange.
-
Zitat
Wir haben das als Muttersprache (die meisten von uns) ja im "Blut" ;D... Aber das alles zu lernen, ist sicher HART xD...
Aus 2 Gründen ist das so. 1. Wir lernen die Sprache von kleinauf, in der Zeit wo wir extrem lernfähig sind und noch keine andere Sprache kennen. 2. Wir lernen und perfektionieren unsere Sprache über einen langen Zeitraum weniger durch systematisches aneignen von Richtlinien und Regeln, sondern durch Kommunikation. Wir gewinnen einfach mehr und mehr an Erfahrung. Wenn man eine zweite Sprache lernt, neigt man dazu anfangs alles in die eigene Sprache zu übersetzen um es zu verstehen. Man "denkt" praktisch nicht mit dieser Sprache sondern ruft nur Übersetzungen ab.
Das ist zumindest meine Ansicht...
Viele Deutsche können ja gut Deutsch aber wären nicht in der Lage die Regeln nach denen sie vorgehen zu definieren. -
Super. Das muss ich gleich morgen probieren. Das wäre bei einigen Projekten nützlich gewesen.
-
Hm... Das erscheint mir noch ein wenig langsam.
Ich habs mal mit ein paar GDI Ergänzungen auf 0.6 Sekunden gebracht (Mein PC ist aber auch relativ flott).Spoiler anzeigen
[autoit]#include <Array.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GDIPlus.au3>
#include <WinAPI.au3>
#include <Timers.au3>Global $n = 50
[/autoit] [autoit][/autoit] [autoit]
Global $components = $n * $n
Global $id[$components]
Global $cells[$n][$n]
Global $Graphics[$n][$n]
Global $tsample = 10000000
Global $thr = 0.592746
Global $time = 0
Global $akt_thr = 0$fac = 5
[/autoit] [autoit][/autoit] [autoit]
$iSize = $n * $fac
$Form = GUICreate("Simulation {" & $n * $n & "}", $iSize, $iSize + 50, 100, 100)
$Label_Comp = GUICtrlCreateLabel("Components: " & $components, 10, $iSize + 10, 200, 17)
$Label_CT = GUICtrlCreateLabel("Cur. Threshold: 0", 10, $iSize + 30, 200, 17)
$Label_T = GUICtrlCreateLabel("Time converge: ", 120, $iSize + 10, 200, 17)
GUICtrlSetColor(-1, 0x000080)
GUISetState(@SW_SHOW)$hDC_Window = _WinAPI_GetDC($Form)
[/autoit] [autoit][/autoit] [autoit]
$hDC_Bitmap = _WinAPI_CreateCompatibleDC($hDC_Window)
$hBitmap = _WinAPI_CreateCompatibleBitmap($hDC_Window, $iSize, $iSize)
_WinAPI_SelectObject($hDC_Bitmap, $hBitmap)_GDIPlus_Startup()
[/autoit] [autoit][/autoit] [autoit]Global $hBuffer = _GDIPlus_GraphicsCreateFromHDC($hDC_Bitmap)
[/autoit] [autoit][/autoit] [autoit]$hBrushBlue = _GDIPlus_BrushCreateSolid(0xFFFF0000)
[/autoit] [autoit][/autoit] [autoit]
$hBrushB = _GDIPlus_BrushCreateSolid(0xFF000000)_GDIPlus_GraphicsFillRect($hBuffer, 0, 0, $iSize, $iSize, $hBrushBlue)
[/autoit] [autoit][/autoit] [autoit]
_WinAPI_BitBlt($hDC_Window, 0, 0, $iSize, $iSize, $hDC_Bitmap, 0, 0, $SRCCOPY)For $i = 0 To $components - 1
[/autoit] [autoit][/autoit] [autoit]
$id[$i] = $i
NextFor $k = 0 To $n - 2
[/autoit] [autoit][/autoit] [autoit]
unite(cell($k, 0), cell($k + 1, 0))
unite(cell($k, $n - 1), cell($k + 1, $n - 1))
Next
For $k = 0 To $n - 1
$cells[$k][0] = True
$cells[$k][$n - 1] = True
Next
_show()
$t = _simulate()
ConsoleWrite("treshold: " & (1 * $t / ($n * $n)) & " - t: " & $t & " - time: " & $time & " - akt_thr: " & $akt_thr & @CRLF)While 1
[/autoit] [autoit][/autoit] [autoit]
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
_WinAPI_ReleaseDC($Form, $hDC_Window)
_WinAPI_DeleteDC($hDC_Bitmap)
_WinAPI_DeleteObject($hBitmap)_GDIPlus_GraphicsDispose($hBuffer)
[/autoit] [autoit][/autoit] [autoit]
_GDIPlus_BrushDispose($hBrushBlue)
_GDIPlus_BrushDispose($hBrushB)
_GDIPlus_Shutdown()
Exit
EndSwitch
WEndFunc _simulate()
[/autoit] [autoit][/autoit] [autoit]
$t = 0
While True
Local $stt = _Timer_Init()
If _root(cell(0, 0), cell($n - 1, $n - 1)) Then Return $t
_step()
;_show()
_WinAPI_BitBlt($hDC_Window, 0, 0, $iSize, $iSize, $hDC_Bitmap, 0, 0, $SRCCOPY)$t += 1
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Local $tsample = _Timer_Diff($stt)
$time += $tsample
$akt_thr = ($thr - ($t / ($n * $n))) * $tsample
GUICtrlSetData($Label_T, "Time converge: " & Round($akt_thr, 2))
GUICtrlSetData($Label_CT, "Cur. Threshold: " & ($t / ($n * $n)))
WEnd
EndFunc ;==>_simulateFunc _show()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
For $r = 0 To $n - 1
For $p = 0 To $n - 1
If $cells[$r][$p] Then
_GDIPlus_GraphicsFillRect($hBuffer, $r * $fac, $p * $fac, $fac, $fac, $hBrushB)
EndIf
Next
Next
EndFunc ;==>_showFunc _step()
[/autoit] [autoit][/autoit] [autoit]
Local $m, $h
While $cells[$m][$h]
$m = Random(0, $n - 1, 1)
$h = Random(0, $n - 1, 1)
WEnd
$cells[$m][$h] = True
_GDIPlus_GraphicsFillRect($hBuffer, $m * $fac, $h * $fac, $fac, $fac, $hBrushB)
If $m < $n - 1 And $cells[$m + 1][$h] Then unite(cell($m, $h), cell($m + 1, $h))
If $m > 0 And $cells[$m - 1][$h] Then unite(cell($m, $h), cell($m - 1, $h))
If $h < $n - 1 And $cells[$m][$h + 1] Then unite(cell($m, $h), cell($m, $h + 1))
If $h > 0 And $cells[$m][$h - 1] Then unite(cell($m, $h), cell($m, $h - 1))
EndFunc ;==>_stepFunc cell($i, $j)
[/autoit] [autoit][/autoit] [autoit]
Return $i + $j * $n
EndFunc ;==>cellFunc _find($x)
[/autoit] [autoit][/autoit] [autoit]
While $x <> $id[$x]
$id[$x] = $id[$id[$x]]
$x = $id[$x]
WEnd
Return $x
EndFunc ;==>_findFunc _root($p, $q)
[/autoit] [autoit][/autoit] [autoit]
Return _find($p) == _find($q)
EndFunc ;==>_rootFunc unite($p, $q)
[/autoit]
$i = _find($p)
$j = _find($q)
If $i == $j Then Return
$id[$i] = $j
$components -= 1
GUICtrlSetData($Label_Comp, "Components: " & $components)
EndFunc ;==>unite -
Zitat
Execute führt bei exen auch autoit code aus. Variablen lassen sich ncht zuweisen.
Allerdings sind mehrere Codezeilen nicht möglich und die Funktion ist überhaupt ziemlich stark eingeschränkt für so einen Zweck. -
Zitat
ich habs versucht aber es führt dann des programm nicht mehr aus sondern sagt da is ein Fehler bei dem Dollar Zeichen

Dann füg mal am Scriptanfang #include <EditConstants.au3> ein (dort ist diese Konstante mit einigen anderen deklariert), oder Benutz stattdessen einfach den Hexadezimalwert von James: 0x2000. -
Zitat
@Name Wenn du die Plugins auf diese Weise ausführst, funktioniert dein System, egal ob kompiliert oder nicht und egal ob AutoIt installiert ist (wenn das Skript kompiliert ist) oder nicht.
Ach so
. Ich wusste nicht, dass der Interpreter in der exe auch auf diese Kommandozeile reagiert. Weißt du zufällig, ob UPX diese Funktion beeinflusst? -
Ich hab mal ein Beispiel gebastelt. Das ist zwar längst noch nicht fertig/optimiert und nicht auf deine Bedürfnisse angepasst, aber es funktioniert immerhin.
Hauptscript mit GUI (Auswahl der Plugins hab ich noch nicht eingebaut):
Main.au3
[autoit]#include <GUIConstants.au3>
[/autoit] [autoit][/autoit] [autoit]Opt("GUIOnEventMode", 1)
[/autoit] [autoit][/autoit] [autoit]Global Const $sPath_PlugIn = @ScriptDir & "\Plugins" ;Der Pfad zum Ordner der alle Plugins (in Form von .au3 Dateien) enthält
[/autoit] [autoit][/autoit] [autoit]
Global Const $sPath_AutoItExe = @AutoItExe ;Der Pfad zum AutoIt InterpreterGlobal $aPlugIn[1] = [0]
[/autoit] [autoit][/autoit] [autoit]
Global $hSearch = FileFindFirstFile($sPath_PlugIn & "\*.au3") ;Nach .au3 Dateien im Plugin Verzeichnis suchenWhile True
[/autoit] [autoit][/autoit] [autoit]
$sFile = FileFindNextFile($hSearch)
If @error Then ExitLoop
If Not @extended Then
$aPlugIn[0] += 1
ReDim $aPlugIn[$aPlugIn[0] + 1]$aPlugIn[$aPlugIn[0]] = Run($sPath_AutoItExe & ' "' & $sPath_PlugIn & '\' & $sFile & '"', @ScriptDir, @SW_HIDE, 3)
[/autoit] [autoit][/autoit] [autoit]
EndIf
WEnd$hWnd = GUICreate("Plugin Test", 400, 400)
[/autoit] [autoit][/autoit] [autoit]
$cButton_Test = GUICtrlCreateButton("Test", 10, 10, 60, 25)
$cButton_AutoIt = GUICtrlCreateButton("AutoIt", 10, 40, 60, 25)
$cEdit = GUICtrlCreateEdit("", 80, 10, 200, 200)
$cInput = GUICtrlCreateInput("", 10, 85, 60, 20)
GUISetState()GUICtrlSetOnEvent($cButton_Test, "_Test")
[/autoit] [autoit][/autoit] [autoit]
GUICtrlSetOnEvent($cButton_AutoIt, "_AutoIt")
GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")For $i = 1 To $aPlugIn[0]
[/autoit] [autoit][/autoit] [autoit]
StdinWrite($aPlugIn[$i], "START")
NextWhile Sleep(20)
[/autoit] [autoit][/autoit] [autoit]
For $i = 1 To $aPlugIn[0]
If $aPlugIn[0] = 0 Then ContinueLoop$sData = StdoutRead($aPlugIn[$i])
[/autoit] [autoit][/autoit] [autoit]
If @extended Then
If $sData = "QUIT" Then
StdioClose($aPlugIn[$i])
$aPlugIn[$i] = 0
ContinueLoop
EndIf$aSplit = StringRegExp($sData, "(?s)([^=]+)=(.*)", 1)
[/autoit] [autoit][/autoit] [autoit]
If UBound($aSplit) < 1 Then ExitLoopSwitch $aSplit[0]
[/autoit] [autoit][/autoit] [autoit]
Case "Set Button_Test Text"
GUICtrlSetData($cButton_Test, $aSplit[1])
Case "Set Button_AutoIt Text"
GUICtrlSetData($cButton_AutoIt, $aSplit[1])
Case "Set Button_AutoIt BKColor"
GUICtrlSetBkColor($cButton_AutoIt, $aSplit[1])
Case "Set Edit Text"
GUICtrlSetData($cEdit, $aSplit[1])
Case "Set Input Text"
GUICtrlSetData($cInput, $aSplit[1])
EndSwitch
StdinWrite($aPlugIn[$i], "OK")
EndIf
Next
WEndFunc _Test()
[/autoit] [autoit][/autoit] [autoit]
MsgBox(64, "Event", "Test Button clicked")
EndFunc ;==>_TestFunc _AutoIt()
[/autoit] [autoit][/autoit] [autoit]
MsgBox(64, "Event", "AutoIt Button clicked")
EndFunc ;==>_AutoItFunc _Exit()
[/autoit]
For $i = 1 To $aPlugIn[0]
StdinWrite($aPlugIn[$i], "STOP")
StdioClose($aPlugIn[$i])
Next
Exit
EndFunc ;==>_Exit
Beispiel Plugin:Test Plugin 1.au3
[autoit];Auf Bereitschaft warten...
[/autoit] [autoit][/autoit] [autoit]
While Sleep(20)
$sData = ConsoleRead()
If @extended Then
If $sData = "START" Then ExitLoop
EndIf
WEndAdlibRegister("_CheckStatus", 100) ;Überprüft alle 100ms ob der Parent Prozess noch aktiv ist
[/autoit] [autoit][/autoit] [autoit]Sleep(2000) ;Wartezeit, damit man verfolgen kann was passiert
[/autoit] [autoit][/autoit] [autoit]
_SetValue("Set Edit Text", "This is a test.")
Sleep(1000) ;Wartezeit, damit man verfolgen kann was passiert
_SetValue("Set Input Text", "Indeed")
_Exit() ;Plugin beendenFunc _SetValue($sControl, $vValue)
[/autoit] [autoit][/autoit] [autoit]
ConsoleWrite($sControl & "=" & $vValue)
While Sleep(20)
$sData = ConsoleRead()
If @extended Then
If $sData = "OK" Then Return ;Bestätigung des Parent Prozesses
EndIf
WEnd
EndFuncFunc _CheckStatus()
[/autoit] [autoit][/autoit] [autoit]
$sData = ConsoleRead()
If @extended Then
If $sData = "STOP" Then Exit ;Parent Prozess ist inaktiv
EndIf
EndFuncFunc _Exit()
[/autoit]
ConsoleWrite("QUIT")
Exit
EndFunc
Beispiel Plugin:Test Plugin 2.au3
[autoit];Auf Bereitschaft warten...
[/autoit] [autoit][/autoit] [autoit]
While Sleep(20)
$sData = ConsoleRead()
If @extended Then
If $sData = "START" Then ExitLoop
EndIf
WEndAdlibRegister("_CheckStatus", 100) ;Überprüft alle 100ms ob der Parent Prozess noch aktiv ist
[/autoit] [autoit][/autoit] [autoit]_SetValue("Set Button_AutoIt BKColor", 0xFF0000)
[/autoit] [autoit][/autoit] [autoit]
_SetValue("Set Button_AutoIt Text", "Works")
_SetValue("Set Button_Test Text", "Plugin")
_Exit()Func _SetValue($sControl, $vValue)
[/autoit] [autoit][/autoit] [autoit]
ConsoleWrite($sControl & "=" & $vValue)
While Sleep(20)
$sData = ConsoleRead()
If @extended Then
If $sData = "OK" Then Return ;Bestätigung des Parent Prozesses
EndIf
WEnd
EndFuncFunc _CheckStatus()
[/autoit] [autoit][/autoit] [autoit]
$sData = ConsoleRead()
If @extended Then
If $sData = "STOP" Then Exit ;Parent Prozess ist inaktiv
EndIf
EndFuncFunc _Exit()
[/autoit]
ConsoleWrite("QUIT")
Exit
EndFunc
Die Plugins müssen in einen Ordner namens "Plugins" im Scriptverzeichnis (lässt sich auch ändern). Danach wird das Hauptscript gestartet, dass die Plugin Scripte als Child Prozesse ausführt und mit diesen über die Standard Streams kommuniziert. Alle Plugins können sich selbst beenden oder werden automatisch beendet sobald der Parent Prozess nicht mehr aktiv ist. Der Pfad zum AutoIt Interpreter wird momentan per Makro ausgelesen (d.h. das funktioniert nur wenn du AutoIt installiert hast und das Script nicht kompiliert ist). Später für den Einsatz bei Leuten die kein AutoIt haben musst du dein Hauptprogramm eben kompilieren und per FileInstall den AutoIt Interpreter in ein beliebiges Verzeichnis entpacken. Den Pfad musst du dann entsprechend anpassen, damit er wieder zur AutoIt.exe führt.
Mir fällt dabei gerade auf, dass für so etwas simples auch eine kleine Ini Kofingurationsdatei reichen würde, aber ich gehe mal davon aus, dass du noch weitaus mehr vorhast.
Im Anhang ist noch ein Template Plugin wo das absolute Minimum für ein leeres Plugin drin ist.
Ich hoffe das ist in etwa das was du wolltest.