Grundsätzlich: Solche Aktionen sind immer begrüßenswert.
Ich zeichne häufig bei Petitionen, die Themen ansprechen, von denen auch ich betroffen bin. Das ist im Falle dieser Petition daher aber auch der Pferdefuß: Der Sachverhalt betrifft anhand des dargestellten Vorfalls einen begrenzten Personenkreis. Insofern denke ich, dass hierfür eine Aktion mit der Lokalzeitung mehr erreichen könnte. Eventuell könnte man auch das gewisse große Boulevardblatt dafür einspannen.
Beiträge von BugFix
-
-
...Forensuche hilft. Das Thema habe ich vor 7 Jahren mal abgehandelt: Objekt: WScript.Shell

-
Naja, dazu muss man sagen, dass NULL auch in anderen Sprachen nur dann NICHTS ist, wenn man das explizit vorher festlegt.
Naja, ich bin inzwischen von Lua verwöhnt. Da ist alles, was nicht definiert ist nil. An diesen Luxus gewöhnt man sich schnell.

-
Liege ich da richtig, BugFix?
Wenn ja bitte anpassen?
Ja, das sind die Dinge, die ich an AutoIt wirklich hasse: der fehlende NULL-Wert. Inzwischen gibt es zwar einen NULL-Wert, aber nur als Keywort, nicht als echtes NICHTS.
Werde es mal demnächst ändern. -
Ich empfehle immer, sich die aktuelle SQLite.dll herunterzuladen und den Skripten z.B. per FileInstall mit in das Skriptverzeichnis zu packen. Anschliessend mit
[autoit]_SQLite_Startup(@ScriptDir & "\sqlite3.dll", False, 1)
[/autoit]laden und alles ist gut.
Die Verwendung von _SQLite_Startup() ohne Parameter erfordert bei nicht vorhandener SQLite.dll auf dem PC zwingend einen aktiven Internetzugang und ausserdem darf autoitscript.com nicht gerade down sein (denn darauf verweist der interne DL-Link).Es ist mir absolut unverständlich, warum die Binärform der SQLite.dll aus den Includes entfernt wurde. Die Anbindung an autoitscript.com bleibt durch das jetzige Prozedere doch genauso erhalten. Aber wahrscheinlich bin ich einfach zu unintelligent um die geniale Idee dahinter zu verstehen...

-
Dein Gedanke mit dem Zähler würde bedeuten, dass bei einem Klick auf ein Item der Zähler auf 1 gesetzt, die Funktion wie in einer Schleife neu aufgerufen und damit das zuvor erstellte "Inhalt im Edit anzeigen" ausgeführt wird. Und bei einem erneuten Klick, würde dann sozusagen Option 2 ausgeführt werden - das senden des Inhalts. Würde das dann nicht bedeuten, dass jedes Item zweimal angeklickt werden muss?
Ein Doppelklick hat immer als erstes Element den Single-Klick. Wenn man nur den Doppelklick benötigt ist das schnuppe. Willst du beides ist es am sichersten die Auswertung gänzlich in eigene Verwaltung zu nehmen.
Ich würde einen Mouse-Hook nutzen (begrenzt auf das Treeview).
- Left-Klick ==> startet Timer
- Timer >= Doppelklickzeit (Registryeintrag auslesen) ==> Das ist ein Single-Klick
- Timer < Doppelklickzeit und neuer Leftklick ==> Das ist ein Doppel-Klick
Das ist aber nicht ganz unkompliziert. Du darfst die Klicks nicht an das System weiterleiten. Erst wenn klar ist ob Single/Doubleklick kannst du die gewünschten Aktionen starten. Auch hier hast du das Problem, dass erst wenn die Art des Klicks erkannt ist, das entsprechende Item aktiviert wird. Also musst du eine Ereignisvariable auf Single oder Double setzen und dann in einer folgenden Auswertefunktion anhand dieser Variablen operieren. -
Du hast zwar davor gewarnt, sowohl Klick als auch Doppelklick zu verwenden, ich würde es aber trotzdem versuchen wollen.
Nun, ich erkläre mal im Detail was passiert, wenn du die Message $WM_NOTIFY registrierst und $NM_CLICK und $NM_DBLCLK auswertest und mit welchen weiteren Problemen du zu kämpfen hast:
• Einfach-Klick auf ein Item
- $NM_CLICK wird ausgelöst
- Aber erst wenn die Message-Funktion verlassen wurde, ist auch das angeklickte Item markiert! Eine aus der Funktion heraus gestartete Aktion würde also mit dem zuletzt aktiven Item arbeiten!! Das gilt für alle Events innerhalb der Message-Funktion.• Doppel-Klick auf ein Item
- $NM_CLICK wird ausgelöst
- $NM_DBLCLK wird ausgelöstDu könntest jetzt versuchen durch Timer-Konstrukte o.ä. NM_CLICK von NM_DBLCLK zu trennen - Viel Spaß dabei.
Unabhängig davon wird ja ein Item erst markiert, wenn die Message-Funktion bereits abgearbeitet ist. Das liesse sich lösen, indem man einen internen Zähler setzt. Ist er 1 wird die Funktion verlassen und nochmal aufgerufen mit denselben Parametern (dadurch findet das normale Prozedere statt und die Auswertung beginnt mit dem dann korrekt markiertem Item in Durchlauf 2). Beim 2-ten mal wird der Zähler zurückgesetzt und die gewünschten Operationen werden ausgeführt.Du siehst, das ist nicht ganz soo easy - aber nicht unmöglich. Nun entscheide ob du einen ganz einfachen Weg wählst oder dich hart reinkniest.

-
Ich habe mein voriges Bsp. mal umgemodelt auf Checkboxerstellung. Das ist dynamisch und erstellt nur die Anzahl Checkboxen, die du benötigst.
Ich habe die Erstellung der Checkbox zur An/Abwahl aller Checkboxen an die erste Position der Textdatei gesetzt, kannst du natürlich ändern.Spoiler anzeigen
[autoit]Global $GUI
[/autoit] [autoit][/autoit] [autoit]
Global $aFile, $FilePath = "Deine_Text_Datei" ; Pfad anpassen
_FileReadToArray($FilePath, $aFile); == hier simuliere ich das eingelesene Array - nicht verwenden, wenn aus Datei gelesen wird
[/autoit] [autoit][/autoit] [autoit]
Global $aFile[5] = [4,'Alle auswählen','PC-1','PC-2','PC-3']
; == Ende SimulationGlobal $aCheckBox[$aFile[0]], $x = 10, $yStart = -20, $diff = 30
[/autoit] [autoit][/autoit] [autoit]$GUI = GUICreate('Test', 400, 20)
[/autoit] [autoit][/autoit] [autoit]
For $i = 1 To $aFile[0]
$aWin = WinGetPos($GUI)
WinMove($GUI, '', $aWin[0], $aWin[1], $aWin[2], $aWin[3] + $diff)
$y = $yStart+$i*$diff
$aCheckBox[$i-1] = GUICtrlCreateCheckbox($aFile[$i], $x, $y, 100, 20)
GUICtrlSetResizing(-1, 802) ; $GUI_DOCKALL
Next
GUISetState()While 1
[/autoit]
$nMsg = GUIGetMsg()
Switch $nMsg
Case -3
Exit
EndSwitch
$iAll = 0
$iState = $GUI_CHECKED
For $i = 0 To UBound($aCheckBox) -1
If $nMsg = $aCheckBox[$i] Then
If $i = 0 Then
$iAll = 1
If Not BitAND(GUICtrlRead($aCheckBox[$i]), $iState) Then $iState = $GUI_UNCHECKED
EndIf
EndIf
If $iAll = 1 Then GUICtrlSetState($aCheckBox[$i], $iState)
Next
WEnd -
Ich habe mal in meinem vorigen Post den Code kommentiert.
-
Das Problem in der Jugend ist einfach, dass du noch keinen Bezug zur Anwenderwelt hast.
Ich schreibe Software, die die Dinge macht, an die natürlich kein Entwickler der kommerziellen Software geadacht hat. Und eine funktionierende! Warenwirtschaftssoftware hat mit Basics recht wenig zu tun. Das ist schon eher high end.
Es ist auch völlig unerheblich, ob ich Probleme mit atemberaubend verzwickten Algorithmen löse oder einen zuverlässigen simplen Weg wähle. Es zählt einzig das Ergebnis. Ich würde bei Betrachten von Lösungen auch als vorteilhaft empfinden, wenn der Proband in der Lage ist Dinge "einfach" zu lösen.
-
Mal als Gedanke:
Fast alle Anwendungen sind mit Datenbanken verknüpft. Erstelle als Musterprojekt z.B. eine Warenwirtschaft (Artikel/Kunden/Rechnungen etc.) auf Basis von SQLite. Das ist anspruchsvoll, sinnvoll und bildet deine Fähigkeiten gut ab. Mit solch einer Mustersoftware im Gepäck kann man sich sicher sehen lassen. -
Also Klick und Doppelklick auszuwerten ist nicht empfehlenswert, da der erste Klick des Doppelklicks sofort vom Klick-Event abgefangen wird.
Ich empfehle daher statt Doppelklick den Rechtsklick. Da das Treeview standardmäßig kein Kontextmenü hat, ist das auch ohne Probleme realisierbar.
Ich habe deinenCode mal entsprechend erweitert:Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#include <GUIConstantsEx.au3>
#include <TreeViewConstants.au3>
#include <WindowsConstants.au3>
#include <GuiTreeView.au3>; == Zuweisung Texte an Item, am besten per Dictionary Objekt
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Global $oDict = ObjCreate('Scripting.Dictionary')
$oDict.Add('1', 'Text für "1"')
$oDict.Add('1a', 'Text für "1a"')
$oDict.Add('1b', 'Text für "1b"')
$oDict.Add('2', 'Text für "2"')
$oDict.Add('2a', 'Text für "2a"')
$oDict.Add('2b', 'Text für "2b"')
$oDict.Add('3', 'Text für "3"')
$oDict.Add('3a', 'Text für "3a"')
$oDict.Add('3b', 'Text für "3b"')#Region ### START Koda GUI section ### Form=
[/autoit] [autoit][/autoit] [autoit]
$Form1 = GUICreate("Form1", 253, 342, 192, 124)
$TreeView1 = GUICtrlCreateTreeView(12, 12, 229, 219)
$hTreeview = GUICtrlGetHandle($TreeView1)
$TreeView1_0 = GUICtrlCreateTreeViewItem("1", $TreeView1)
$TreeView1_1 = GUICtrlCreateTreeViewItem("1a", $TreeView1_0)
$TreeView1_2 = GUICtrlCreateTreeViewItem("1b", $TreeView1_0)
$TreeView1_3 = GUICtrlCreateTreeViewItem("2", $TreeView1)
$TreeView1_4 = GUICtrlCreateTreeViewItem("2a", $TreeView1_3)
$TreeView1_5 = GUICtrlCreateTreeViewItem("2b", $TreeView1_3)
$TreeView1_6 = GUICtrlCreateTreeViewItem("3", $TreeView1)
$TreeView1_7 = GUICtrlCreateTreeViewItem("3a", $TreeView1_6)
$TreeView1_8 = GUICtrlCreateTreeViewItem("3b", $TreeView1_6)
$Edit = GUICtrlCreateEdit("",12,230,229,109)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###While 1
[/autoit] [autoit][/autoit] [autoit]
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
Case $GUI_EVENT_PRIMARYDOWN
_GetText(False)
Case $GUI_EVENT_SECONDARYDOWN
_GetText(True)
EndSwitch
WEndFunc _GetText($_fSend)
[/autoit]
Local $sItem, $hItem, $cItem = GUICtrlRead($TreeView1) ; == $cItem ist das Control des aktuell aktiven Item
If $cItem <= 0 Then Return ; == wenn kein gültiges Control - Funktion verlassen
$hItem = GUICtrlGetHandle($cItem) ; == das Handle des aktiven Item holen
$sItem = _GUICtrlTreeView_GetText($hTreeview, $hItem) ; == den Text des aktiven Item auslesen
Local $sText = $oDict.Item($sItem) ; == im Dictionary.Object den Voll-Text für das Item auslesen, Variable $sText enthält jetzt den vollen Text zur weiteren Nutzung
If $_fSend Then ; == wenn $_fSend=True wird der Code zum Senden des Textes aufgerufen (bei Rechtsklick)
; == Sende $sText
Else
GUICtrlSetData($Edit, $sText) ; == bei False wird der Text in das Edit-Control geschrieben (bei Linksklick)
EndIf
EndFuncUm die Item in bestimmter Reihenfolge zu erstellen (u. auch wieder abzuspeichern) habe ich mal eine UDF erstellt. Vielleicht kannst du das auch dabei brauchen.
-
Schau dir mal den Bsp-Code in der Hilfe zu GuiCtrlCreateTreeview an. Das sollte alle Fragen klären.
-
Zum Thema Keylogger finde ich persönlich es schade, wenn es keine Scripts mehr gibt, nur weil das missbräuchlich genutzt werden kann.
Das Problem ist einfach, wie trenne ich die schwarzen von den weissen Schafen?
Ein Keylogger ist ja perse auch nicht schlecht. Ich habe z.B. einen erstellt, den ich bei Problemen unserer User mit einer bestimmten Software anwende. Ist dieser Prozeß aktiv, startet der Logger mit einem vom User zu bestätigendem Hinweis, dass innerhalb dieser Software jeder Tastaturanschlag und jeder Mausklick protokolliert wird. Bei Mausklicks wird ein Screenshot von der Mauszeigerumgebung gespeichert, bei Tastaturereignissen der entsprechende Tastenwert. Mit einem Programm, das dann die Logeinträge wiedergibt mit entsprechenden Texteingaben und Bildern lassen sich auf diese Weise Fehlbedienungen der User wunderbar lokalisieren. Da hilft dann auch nicht die Ausrede "Ich habe gar nichts gemacht, das ging plötzlich nicht mehr."
Leider ist der missbräuchliche Einsatz solcher Programme recht häufig. Und wir möchten hier ungerne Steilvorlagen liefern. Ausserdem ermöglicht allein das Lesen der Hilfe (vernünftige AutoIt-Kenntnisse vorausgesetzt) problemlos ein entsprechendes Programm zu erstellen. Mit dem entsprechenden Hinweis auf die erforderliche Funktion ist doch der Fragestellung genüge getan. Und ich kann nicht mal im Ansatz erkennen, dass hier die Verbreitung von Wissen unterdrückt wird. -
Also müsste ich wahrschinlich ein Script schreiben, was alle Strings über _IsPressed abfragt und welches permanent läuft (Endless Loop)?
So einfach ist es leider nicht. Mit _IsPressed wirst du keine Möglichkeit haben in allen x-beliebigen Editierfeldern wirksam zu werden.
Um das mit AutoIt zu lösen musst du wohl mit einem Keyboard-Hook arbeiten.
Das heisst:
- Abfangen der Keyboard-Taste
- ist dieses Bestandteil deines Textmakros (z.B. das "s" aus "sgf") schaltest du den Ersetzmodus aktiv, das Zeichen wird nicht an das Editfeld weitergesendet
- nächstes Zeichen wird abgefangen: ist es aus einer Kombination eines Textmakros wird auch dieses nicht gesendet, sondern zwischengespeichert
- ist die zwischengespeicherte Sequenz identisch mit einem Makro, wird der hinterlegte Text gesendet
- ergibt die Zwischenspeicherung kein Makro wird diese selbst eingefügt
Hat aber den Nachteil, dass Buchstaben, mit denen ein Makro beginnt zuerst nicht an das Programm gesendet werden obwohl kein Makro genutzt werden soll. Das könntest du dann eventuell umgehen, indem du die Sequenz schreiben läßt und bei Übereinstimmung mit einem Makro für die Anzahl der Zeichen zuerst Backspaces sendest und dann den Ersetzungstext.NB:
Ein Keyboard-Hook läßt sich leider leicht als Keylogger mißbrauchen. Aus diesem Grund wirst du hier keine skriptmässige Unterstützung dafür erhalten. Aus der Hilfe läßt sich aber mit etwas Wissen alles Notwendige erfahren. -
Wenn du im Programmverlauf eine GUI dynamisch erstellst, kannst du so vorgehen (Bsp. mit Inputs)
Spoiler anzeigen
[autoit]Global $GUI, $aInput[2] = [1], $btAdd
[/autoit] [autoit][/autoit] [autoit]$GUI = GUICreate('Test', 400, 50)
[/autoit] [autoit][/autoit] [autoit]
$aInput[1] = GUICtrlCreateInput('', 10, 10, 300, 21)
GUICtrlSetResizing(-1, 802) ; $GUI_DOCKALL
$btAdd = GUICtrlCreateButton('Add Input', 320, 10, 70, 21)
GUICtrlSetResizing(-1, 802) ; $GUI_DOCKALL
GUISetState()While 1
[/autoit] [autoit][/autoit] [autoit]
Switch GUIGetMsg()
Case -3
Exit
Case $btAdd
_NewCtrl()
EndSwitch
WEndFunc _NewCtrl()
[/autoit]
Local $iDiff = 31 ; == Abstand + Höhe ==> 10 + 21
Local Static $iY = 10 ; == Startwert vom ersten Ctrl
$iY += $iDiff
$aInput[0] += 1
ReDim $aInput[$aInput[0]+1]
Local $aWin = WinGetPos($GUI)
WinMove($GUI, '', $aWin[0], $aWin[1], $aWin[2], $aWin[3] + 31)
$aInput[$aInput[0]] = GUICtrlCreateInput('', 10, $iY, 300, 21)
GUICtrlSetResizing(-1, 802) ; $GUI_DOCKALL
EndFunc -
Grössenordnung 1'000'000 Werte
Na da solltest du lieber zu einer kleinen Datenbank greifen. SQLite bietet sich an. Tipp: Speichere dir die SQLite.dll im Ordner deines Skriptes, sonst braucht dein Skript Internetzugang und autoitscript.com darf auch nicht gerade down sein.
Ich würde die Tabelle so erstellen:
[autoit]$sExecute = _
[/autoit]
"CREATE TABLE IF NOT EXISTS [begriffe] (" & _
"[name] TEXT," & _
"[detail_1] TEXT," & _
"[detail_2] TEXT," & _
"[detail_3] TEXT);"Nun kannst du mit SELECT die gewünschten Details abfragen.
-
jjj:
Und - fühlst du dich jetzt wohl, wenn du einem lernresistenten und lösungsunwilligen User die Arbeit abnimmst?
Davon hat er nichts und lernt null. Das wird einfach per C&P übernommen und dann läßt er sich dafür 'nen Doktortitel verleihen.
Ich plädiere hier für absolute Verweigerung von Support. -
Ilse:
Was hast du eigentlich die letzten 3,5 Jahre getrieben? Du bist dauernd online, stellst tausend Fragen und hast bis heute ausser der Bedienung von Koda nix gelernt! Vielleicht solltest du lieber Briefmarken sammeln oder Autoquaretett spielen. Programmierung ist definitiv für dich ungeeignet.
Weiterer Support von meiner Seite nicht mehr. -
Verwende keine Inputboxen - nimm eine kleine GUI mit Input-Ctrl. Sieht eleganter aus und du kannst das weiterschalten z.B. per Enter festlegen.