"Dont feed the Troll!" kann ich da nur sagen.
Ich denke, es hat sich jedem erschlossen, was hier passieren soll. :pinch:
Und damit hat sich dieser Thread erledigt.
[CLOSED]
"Dont feed the Troll!" kann ich da nur sagen.
Ich denke, es hat sich jedem erschlossen, was hier passieren soll. :pinch:
Und damit hat sich dieser Thread erledigt.
[CLOSED]
Auch von mir Alles Gute!
Bleib uns noch schön lange erhalten. ![]()
Ich denke es wehre besser
Aua aua aua - Der Thread dient eigentlich nicht dazu, die Sprache noch mehr zu verunglimpfen.
Dieses Wort wird mit dem netten Umlaut ä geschrieben und enthält definitiv kein h. :wacko:
Hi,
Ich habe mal ein kleines Skript geschrieben, das aus der Funktionsdeklaration der aktuellen Zeile einen Header in kleinerem Umfang erstellt.
Dabei werden die Parameter einzeln aufgelistet und evtl. Vorbelegungen als "(Default: Wert)" angegeben.
EDIT:
Nach 10 Jahren habe ich das Skript nochmal etwas aufgefrischt. Es ist jetzt auch für Lua-Skripte nutzbar.
Muster
Funktions Deklarationszeile:
Eingefügt wird darüber:
; #FUNCTION# =======================================================================================
; Name ..........: RandomString
; Description ...:
; Parameter(s)...: $_sType [optional] (Default: '[')
; ....[optional].: $_iLow (Default: 2)
; ....[optional].: $_iHigh (Default: 16)
; Return values .: Success
; ...............: Failure
; Author ........: USER_NAME aus ..\SciTE\properties\au3.properties Wert:UDFCreator
; Remarks .......:
; ==================================================================================================
Alles anzeigen
• In der au3.properties den Usernamen eintragen
• Die Datei HeaderFromCurrFunc.lua abspeichern
• In der SciTEUser.properties einen neuen Eintrag mit Shortcut zum Aufruf der Funktion anlegen (Nummer und Shortcut bei Bedarf anpassen).
# 37 Funktionsheader
command.37.*=dofile "DEIN_PFAD/HeaderFromCurrFunc.lua"
command.name.37.*=Funktionsheader aktuelle Funktion
command.mode.37.*=subsystem:lua,savebefore:yes
command.is.filter.37.*=1
command.shortcut.37.*=Ctrl+Shift+H
Einfach den Cursor in die Zeile mit der Funktionsdeklaration setzen, geht die Deklaration über mehrere Zeilen, dann in die erste Zeile der Deklaration. Mit dem Shortcut wird der Header erstellt und eingefügt.
-- TIME_STAMP 2022-03-21 16:14:43 v 0.4
-- coding:utf-8
local FunctionHeader = {}
FunctionHeader.SelectExt = function(self)
local ext = props['FileExt']:lower()
if ext == 'au3' then
self:AU3()
elseif ext == 'lua' then
self:LUA()
else
print('!> There is no header function for "*.'..ext..'"!')
end
end
FunctionHeader.AU3 = function(self)
local caret = editor.CurrentPos
local line = editor:LineFromPosition(caret)
local textline = editor:GetLine(line)
local text = ''
-- line has continuation mark ?
while true do
text = text .. textline
if not textline:find('%s_[\r\n]-') then break end
line = line +1
textline = editor:GetLine(line)
end
-- remove continuation mark & line break, shorten many %s to one
text = text:gsub('%s_[\r\n]-', ' '):gsub('%s+', ' ')
-- extract name and params
local fname, param = text:match('([%w_]+)%s-(%b())')
if fname == nil then print('!> No function declaration in this line!') return end
param = param:sub(2,-2)
local tTemp, tParam, len = {}, {}, 7 -- {{$var,default-value,Const/ByRef}}, min var-len=7
if param ~= '' then
for m in param:gmatch('%s*([^,]+)') do table.insert(tTemp, m) end
local var, defval
for i=1, #tTemp do
if tTemp[i]:find('^[Cc][Oo][Nn][Ss][Tt]') then
var = tTemp[i]:match('(%$[%w_]+)')
if tTemp[i]:find('%s[Bb][Yy][Rr][Ee][Ff]') then
table.insert(tParam, {var, nil, 'Const ByRef'})
else
table.insert(tParam, {var, nil, 'Const'})
end
elseif tTemp[i]:find('^[Bb][Yy][Rr][Ee][Ff]') then
var = tTemp[i]:match('(%$[%w_]+)')
table.insert(tParam, {var, nil, 'ByRef'})
elseif tTemp[i]:find('%$[%w_]+%s*=%s*') then
var, defval = tTemp[i]:match('^(%$[%w_]+)%s*=%s*(.+)')
table.insert(tParam, {var, defval})
else
var = tTemp[i]:match('^(%$[%w_]+)')
table.insert(tParam, {var})
end
if var:len() > len then len = var:len() end
end
end
local n, sHeader, sIntro, sDots, sOpt, sAdd, sSpace = "\r\n", "", "", "; ...............: ", "; ....[optional].: ", "", ""
sHeader = sHeader .. "; #FUNCTION# " .. string.rep("=", 87) .. n
sHeader = sHeader .. "; Name ..........: " .. fname .. n
sHeader = sHeader .. "; Description ...: " .. n
sHeader = sHeader .. "; Parameter(s)...: "
if #tParam > 0 then
sSpace = (" "):rep(len +2 -tParam[1][1]:len())
if tParam[1][2] ~= nil then sAdd = "[optional] (Default: ".. tParam[1][2] ..")" end
if tParam[1][3] ~= nil then sAdd = "(".. tParam[1][3] ..")" end
sHeader = sHeader .. tParam[1][1] .. sSpace .. sAdd
end
if #tParam > 1 then
sHeader = sHeader .. n
for i=2, #tParam do
sAdd, sIntro, sSpace = "", sDots, (" "):rep(len +2 -tParam[i][1]:len())
if tParam[i][2] ~= nil then sAdd, sIntro = "(Default: ".. tParam[i][2] ..")", sOpt end
if tParam[i][3] ~= nil then sAdd = "(".. tParam[i][3] ..")" end
sHeader = sHeader .. sIntro .. tParam[i][1] .. sSpace .. sAdd .. n
end
else
sHeader = sHeader .. n
end
sHeader = sHeader .. "; Return values .: " .. "Success " .. n
sHeader = sHeader .. "; ...............: " .. "Failure " .. n
sHeader = sHeader .. "; Author ........: " .. props['UDFCreator'] .. n
sHeader = sHeader .. "; Remarks .......: " .. n
sHeader = sHeader .. "; " .. string.rep("=", 98) .. n
local posIns = editor:PositionFromLine(editor:LineFromPosition(caret))
editor:InsertText(posIns, sHeader)
end
FunctionHeader.LUA = function(self)
local caret = editor.CurrentPos
local line = editor:LineFromPosition(caret)
local home = editor:PositionFromLine(line)
local text = editor:GetLine(line)
if text == nil then print('!> No function declaration in this line!') return end
if not text:find('function') then print('!> No function declaration in this line!') return end
-- match "local function fname(param)"
local p, fname, param = text:match('()local function ([%w_]+)%s-(%b())')
-- match "function fname(param)"
if fname == nil then
p, fname, param = text:match('()function ([%w_]+)%s-(%b())')
end
-- match "local fname = function(param)"
if fname == nil then
p, fname, param = text:match('()local ([%w_]+)%s-=%s-function(%b())')
end
-- match "table.fname = function()"
if fname == nil then
p, fname, param = text:match('()([%w_]+%.[%w_]+)%s-=%s-function(%b())')
end
-- match "fname = function(param)"
if fname == nil then
p, fname, param = text:match('()([%w_]+)%s-=%s-function(%b())')
end
param = param:sub(2,-2)
local tParam = {} -- {var}
if param ~= '' then
for m in param:gmatch('%s*([^,]+)') do
m = m:match('%s*([^%s]+)%s*')
table.insert(tParam, m)
end
end
local n, sHeader, sDots, sIndent= "\n", "", ".............: ", ""
if p > 1 then sIndent = (' '):rep(p-1) end
sHeader = sHeader .. sIndent .. "--[[ #FUNCTION# " .. n
sHeader = sHeader .. sIndent .. " Name ........: " .. fname .. n
sHeader = sHeader .. sIndent .. " Description .: " .. n
sHeader = sHeader .. sIndent .. " Parameter(s).: "
if #tParam > 0 then
sHeader = sHeader .. tParam[1]
end
if #tParam > 1 then
sHeader = sHeader .. n
for i=2, #tParam do
sHeader = sHeader .. sDots .. tParam[i] .. n
end
else
sHeader = sHeader .. n
end
sHeader = sHeader .. sIndent .. " Return ......: " .. "Success " .. n
sHeader = sHeader .. sIndent .. " .............: " .. "Failure " .. n
sHeader = sHeader .. sIndent .. " Author ......: " .. props['UDFCreator'] .. n
sHeader = sHeader .. sIndent .. " Remarks .....: " .. n
sHeader = sHeader .. sIndent .. "]]\n" .. sIndent .. string.rep("-", 100) .. n
editor:InsertText(home, sHeader)
end
FunctionHeader:SelectExt()
Alles anzeigen
Als erstes solltest du in den AGB des Seitenbetreibers nachlesen, ob ein automatisierter Zugriff auf diese Daten überhaupt zulässig ist. Viele Anbieter untersagen das explizit, das ist dann für dich bindend und ein Ignorieren dieser Tatsache wäre illegal.
Make-Grafik hatte schon recht^^
Quatsch.
Wenn man eine Frage stellt, die bereits eine falsche Antwort impliziert, kann man niemals recht haben, sondern sollte sich schleunigst das Schulgeld zurückzahlen lassen. ![]()
Die Frage nach dem "fehlenden Euro" kann doch nur gestellt werden, wenn man eine falsche Rechnung durchführt.
Die einzig richtige Antwort lautet:
Es gibt keine Antwort, da keine den Tatsachen entsprechende Frage gestellt wurde. - Ohne Frage keine Antwort. Punkt. ![]()
Für mich noch immer die Nr. 1 (und sollte auf keinem PC fehlen) API-Guide. Funktionen ausführlich mit Beschreibung, Parametern und Beispielen in VB, die sich recht einfach zu AutoIt portieren lassen.
Auch wenn die Seite "AllAPI.net" nicht mehr als solche exitiert ist dieses Werk nicht zu verachten.
Alle (oder die meisten) Funktionen der user32 oder kernel zu extrahieren und in AutoIt gangbar zu machen halte ich für wenig sinnvoll. Z.B. ist es doch eher sinnfrei eine MsgBox oder noch kranker eine GUI mittels der Dll-Befehle zu erstellen. Dann könnte man auch gleich Räder quadratisch gestalten, der Effekt ist ähnlich. ![]()
Eine der meistgenutzten Strukturen ist die RECT-Struktur.
Ich finde es immer lästig, 5 Zeilen Code zu schreiben um die Struktur zu erstellen und mit Werten zu befüllen.
Ich habe jetzt eine Funktion erstellt (und in die WinAPI_more eingefügt), die folgendes ermöglicht:
• Erstellen UND Befüllen einer RECT-Struktur gleichzeitig
• Befüllen einer bestehenden RECT-Struktur
• Übergabe RECT-Struktur ODER Pointer auf RECT-Struktur
• Werte einzeln ODER als 4-Elemente Array übergeben
• Aufruf der RECT-Struktur ohne Werte (Defaultwerte "-1" werden verwendet) leert die Struktur
;===============================================================================
; Function Name..: _WinAPI_DllStructRECT_Set()
; Description....: Erstellt und/oder füllt eine RECT-Struktur, optional Leeren eines RECT
; Parameter(s)...: $_tRECT Leere Variable zur Aufnahme der RECT-Strukt oder Variable m. RECT-Strukt oder Pointer auf eine RECT-Strukt
; ...............: $_iLeft RECT left ODER Array mit allen 4 RECT-Werten (top, right, bottom werden dann ignoriert)!
; ...............: $_iTop RECT top
; ...............: $_iRight RECT right
; ...............: $_iBottom RECT bottom
; ...............: Mit "-1" für alle 4 RECT-Werte (Standard) wird die übergebene Struktur geleert
; Return Value(s): Erfolg 1
; Fehler 0 set @error = Errorwert aus DllCall oder "-1" = Wertearray übergeben mit falscher Dimensionsgröße
; Author(s)......: BugFix ([email='bugfix@autoit.de'][/email])
;===============================================================================
Func _WinAPI_DllStructRECT_Set(ByRef $_tRECT, $_iLeft=-1, $_iTop=-1, $_iRight=-1, $_iBottom=-1)
Local $fSetEmpty = False, $fNewStruct = False
If IsArray($_iLeft) Then
If UBound($_iLeft) <> 4 Or UBound($_iLeft,0) > 1 Then Return SetError(-1,0,0)
$_iTop = $_iLeft[1]
$_iRight = $_iLeft[2]
$_iBottom = $_iLeft[3]
$_iLeft = $_iLeft[0]
EndIf
If $_iLeft = -1 And $_iTop = -1 And $_iRight = -1 And $_iBottom = -1 Then $fSetEmpty = True
If Not IsPtr($_tRECT) Then
If Not IsDllStruct($_tRECT) Then
$_tRECT = DllStructCreate("struct; long Left;long Top;long Right;long Bottom; endstruct")
$fNewStruct = True
EndIf
If $fSetEmpty And (Not $fNewStruct) Then
Local $ret = DllCall("user32", 'long', 'SetRectEmpty', 'ptr', DllStructGetPtr($_tRECT))
If @error > 0 Then Return SetError(@error,0,0)
Else
Local $ret = DllCall("user32", 'long', 'SetRect', 'ptr', DllStructGetPtr($_tRECT), 'long', $_iLeft, 'long', $_iTop, 'long', $_iRight, 'long', $_iBottom)
If @error > 0 Then Return SetError(@error,0,0)
EndIf
Else
If $fSetEmpty Then
Local $ret = DllCall("user32", 'long', 'SetRectEmpty', 'ptr',$_tRECT)
If @error > 0 Then Return SetError(@error,0,0)
Else
Local $ret = DllCall("user32", 'long', 'SetRect', 'ptr', $_tRECT, 'long', $_iLeft, 'long', $_iTop, 'long', $_iRight, 'long', $_iBottom)
If @error > 0 Then Return SetError(@error,0,0)
EndIf
EndIf
Return 1
EndFunc ;==>_WinAPI_DllStructRECT_Set
#include "WinAPI_more.au3"
; == Test 1
; == Struktur Erstellen und gleichzeitig Befüllen
; == Übergabe leere Variable und Werte einzeln, mit denen die Struktur befüllt werden soll
Local $tRectangle
$ret = _WinAPI_DllStructRECT_Set($tRectangle, 10, 10, 110, 50)
If Not $ret Then
ConsoleWrite('Fehler: ' & @error & @CRLF)
Else
ConsoleWrite('!> Test 1 >> ' & _WinAPI_GetRectValue($tRectangle) & @CRLF)
EndIf
; == Test 2
; == bestehenden Struktur Befüllen
; == Übergabe Strukturvariable existierender Struktur und Werte einzeln
$ret = _WinAPI_DllStructRECT_Set($tRectangle, 20, 100, 200, 150)
If Not $ret Then
ConsoleWrite('Fehler: ' & @error & @CRLF)
Else
ConsoleWrite('!> Test 2 >> ' & _WinAPI_GetRectValue($tRectangle) & @CRLF)
EndIf
; == Test 3
; == bestehenden Struktur Befüllen
; == Übergabe Strukturvariable existierender Struktur und Werte im Array
Local $aValue1[4] = [300,100,500,200]
$ret = _WinAPI_DllStructRECT_Set($tRectangle, $aValue1)
If Not $ret Then
ConsoleWrite('Fehler: ' & @error & @CRLF)
Else
ConsoleWrite('!> Test 3 >> ' & _WinAPI_GetRectValue($tRectangle) & @CRLF)
EndIf
; == Test 4
; == bestehenden Struktur Befüllen
; == Übergabe Pointer auf Strukturvariable existierender Struktur und Werte im Array
Local $pRectangle = DllStructGetPtr($tRectangle)
Local $aValue2[4] = [330,110,550,220]
$ret = _WinAPI_DllStructRECT_Set($pRectangle, $aValue2)
If Not $ret Then
ConsoleWrite('Fehler: ' & @error & @CRLF)
Else
ConsoleWrite('!> Test 4 >> ' & _WinAPI_GetRectValue($tRectangle) & @CRLF)
EndIf
; == Test 5
; == bestehenden Struktur Entleeren
; == Übergabe Pointer auf Strukturvariable
$ret = _WinAPI_DllStructRECT_Set($pRectangle)
If Not $ret Then
ConsoleWrite('Fehler: ' & @error & @CRLF)
Else
ConsoleWrite('!> Test 5 >> ' & _WinAPI_GetRectValue($tRectangle) & @CRLF)
EndIf
Die neue Version der WinAPI_more.au3 habe ich in Post #1 aktualisiert
Also WinMove funktioniert tadellos, leider wird das Child nicht als MDI_CHILD registriert, dann brauchtest du es nicht separat bewegen, sondern die Msg vom Parent würde auch für das Child gelten.
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>
Opt("GUIOnEventMode", 1)
[/autoit] [autoit][/autoit] [autoit]Global $notePID = RUN("NOTEPAD.EXE")
$hNotepad = WinWait('[Class:Notepad]')
global $hGui = GuiCreate("BLA", -1, -1, -1, -1, -1, $WS_EX_MDICHILD, $hNotepad)
GUISetOnEvent($GUI_EVENT_CLOSE, "_EXIT")
WinSetTrans($hGUI, "", 150)
;~ ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : Parent = ' & WinGetTitle(_WinAPI_GetParent($hGui)) & @crlf) ;### Debug Console
[/autoit] [autoit][/autoit] [autoit]guisetstate(@SW_SHOW, $hGui)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]HotKeySet("{SPACE}","_MyMove")
[/autoit] [autoit][/autoit] [autoit]while(true)
sleep(300)
WEnd
func _EXIT()
ProcessClose($notePID)
exit
EndFunc
func _MyMove()
WinMove($hGui,"",200,200)
EndFunc
Chesstiger, du solltest lernen die Hilfe zu lesen! ( <AutoIt> <Using AutoIt> <Window Titles and Text (Advanced)> )
Statt Titel kannst du (was auch viel sinnvoller, da eindeutiger ist) immer das Handle verwenden! "When you have a handle you may use it in place of the title parameter in any of the function calls that use the title/text convention."
Also $obj.hGUI=GuiCreate(BLABLA)
Vielleicht zeigst du mal deinen Code. Das hier ist kein natives AutoIt und wäre nur mit der AutoItObject UDF machbar.
AutoIt selbst ist keine objektorientierte Sprache.
Mit nativem Code sieht das so aus:
[autoit]$hGUI = GuiCreate(..)
[/autoit][autoit][/autoit][autoit][/autoit][autoit]WinMove($hGUI,...)
[/autoit]hohe induzierte Spannung entgegengesetzt der Spannung des Netzteils
Ist zwar schon über 30 Jahre her bei mir - aber wenn ich mich recht erinnere, ist es nicht die Spannung, die das Besondere der Induktion ausmacht, sondern der Strom: Dieser ist immer der Ursache des Induktionsvorgangs entgegengesetzt.
Also das der Graph nicht die alten Werte überschreibt (- wieder von vorne anfängt), sondern nur nach links aus dem GUI schiebt?
Das ist die Variante, ständig am rechten Control-Rand zu zeichnen. Machbar ist das sicher, muss allerdings die Verwaltung umgestellt werden. Vielleicht werde ich das noch einbauen. Im Moment habe ich aber viele andere Dinge um die Ohren.
..und im Deutschen Forum gibt es bereits sehr lange eine Lösung dazu: TextMeter ![]()
Es gibt dazu auch etwas neuere Threads. z.B. hier
Was sollte ich den in der Array speichern? Die einzelnen Variablen der Buttons? Weil ich habe ja schone on Textdokoment wo halt die Map drinne steht.
Was nützt dir die Info in dem Textdokument? Willst du jedesmal neu aus dem Textdokument auslesen, wenn du den Wert einer dort gespeicherten Variablen benötigst? Das ist ineffektiv.
Du lädst den gesamten Inhalt der Textdatei in das Array und hast dann jederzeit blitzschnell Zugriff auf die einzelnen Werte. Ändern sich Werte, so änderst du diese im Array und schreibst am Programmende den aktuellen Arrayinhalt zurück in die Textdatei. Somit bist du immer UpToDate. ![]()
Wenn du Probleme hast die einzelnen Elemente über deren Index anzusprechen, da $array[$i][$j] nun mal nicht assoziativ ist, kannst du dir für den Anfang eine Brücke bauen.
Ich zeig das mal am Beispiel einer kleinen Liste:
***** GebDat Wohnort Beziehungsstatus
Peter 11.05.89 A-Dorf Single
Maria 23.04.76 B-Dorf Geschieden
Anton 12.12.94 C-Dorf Verheiratet
Gerda 28.09.87 D-Dorf Single
In deiner Datei kannst du das z.B. so abspeichern:
[font='Courier New, Courier, mono']Peter=11.05.89|A-Dorf|Single
Maria=23.04.76|B-Dorf|Geschieden
Anton=12.12.94|C-Dorf|Verheiratet
Gerda=28.09.87|D-Dorf|Single
[font='Arial, Helvetica, sans-serif']Im Skript definierst du jetzt Index-Variablen für jede Zeile und Spalte (geht natürlich nur bei fester Anzahl von Elementen).
[autoit]
; für die Zeilen:
Global $Peter = 0, $Maria = 1, $Anton = 2, $Gerda = 3
; alternativ kannst du dafür auch mit Enum arbeiten:
Global Enum $Peter, $Maria, $Anton, $Gerda ; Enum startet, wenn nicht anders festgelegt, mit 0 -- somit brauchst du den Indexwert nicht extra vorbelegen
; dasselbe für die Spalten:
Global Enum $GebDat, $Wohnort, $Beziehungsstatus
Nun lassen sich die Zeilen/Spalten-Kombinationen mit "Begriffen" ansprechen:
[autoit]
ConsoleWrite( $array[$Peter][$Beziehungsstatus] & @CRLF ) ; gibt "Single" aus
ConsoleWrite( $array[$Gerda][$Wohnort] & @CRLF ) ; gibt "D-Dorf" aus
Wenn es gelöst ist, setze bitte im Startpost das Präfix auf "gelöst".
Ich möchte aber herausfinden welche Kominationsmöglichkeiten es gibt der oben angegebenen Werte.
Kann es sein, dass du Kombinationen und Variationen verwechselst? ![]()
Ich hab dir mal ein kleines Bsp. erstellt, wie du das übersichtlich lösen kannst:
$gui = GUICreate('Test')
$edit = GUICtrlCreateEdit('', 10, 10, 380, 300)
$Text1 = GUICtrlCreateDummy()
$Text2 = GUICtrlCreateDummy()
$Text3 = GUICtrlCreateDummy()
Global $aAccelerators[3][2] = [['^{NUMPAD1}', $Text1],['^{NUMPAD2}', $Text2],['^{NUMPAD3}', $Text3]] ; Strg+Numpad_1 = Text 1 usw.
GUISetAccelerators($aAccelerators)
GUISetState()
[/autoit] [autoit][/autoit] [autoit]While 1
$msg = GUIGetMsg()
Switch $msg
Case -3
Exit
Case $Text1, $Text2, $Text3
_InsertText($msg)
EndSwitch
WEnd
Func _InsertText($_TextID)
Switch $_TextID
Case $Text1
GUICtrlSetData($edit, GUICtrlRead($edit) & _
"Das ist Textblock 1" & @CRLF)
Case $Text2
GUICtrlSetData($edit, GUICtrlRead($edit) & _
"Das ist Textblock 2" & @CRLF)
Case $Text3
GUICtrlSetData($edit, GUICtrlRead($edit) & _
"Das ist Textblock 3" & @CRLF)
EndSwitch
EndFunc