Ich verstehe nicht, warum du hier diesen Umweg über einen "Aufruf zum Funktionsaufruf" gehst.
Wenn du alle Funktionen, die in deiner "DLL" sind in ein Include packst, kannst du sie stinknormal (und sicher schneller) direkt aufrufen.
Willst du es mit kompilierten Dateien anwenden, so läßt sich das alles über Kommandozeilenparameter steuern. :wacko:
Beiträge von BugFix
-
-
Nutze PDFCreator, der verfügt über eine COM-Schnittstelle und eine entsprechende AutoIt-UDF zu deren Anwendung hatte ich auch schon mal gesehen (such mal hier oder im EN-Forum).
Damit solltest du keine Probleme haben.
Alternativ kannst du natürlich auch OpenOfficeOrg verwenden und von dort dein Excel-Dokument direkt als PDF ausgeben. Mit ca. 90% der Exceldokumente sollte das problemlos möglich sein. Nur wenn umfangreiche Formeln im Einsatz sind, ist eine direkte Umsetzung teils nicht möglich. -
Hi Xeno,
ja Dank progandy's super Hilfe konnte ich das fertigstellen und habe es seitdem ununterbrochen in der Firma im Einsatz.
Ist jetzt speziell auf meine Problemstellung zugeschnitten, aber wenn du es dir ansehen willst, melde dich.Edit:
Ich hab dir mal die betreffenden Funktionen aus meinem Skript rausgesucht. Die Zeilen, die sich auf den Rest des Skripts (GUI etc.) beziehen einfach ignorieren.
Spoiler anzeigen
[autoit]Global Const $tagField = "char name[11];" & _ ; 0-10 | 11 bytes | field name
[/autoit] [autoit][/autoit] [autoit]
"char type;" & _ ; 11 | 1 byte | field type in ASCII
"uint memadress;" & _ ; 12-15 | 32 bit number | field data address
"byte len;" & _ ; 16 | 1 byte | field length
"byte deccount;" & _ ; 17 | 1 byte | field decimal count
"byte reserved[14];" ; 18-31 | 14 bytes | reserved bytes
Global Const $tagFileHeader = "byte ver;" & _ ; 0 | 1 byte | dBASE III version number
"byte date[3];" & _ ; 1-3 | 3 bytes | date of last update
"uint reccount;" & _ ; 4-7 | 32 bit number | number of records in data file
"ushort headerlength;" & _ ; 8-9 | 16 bit number | length of header structure
"ushort reclength;" & _ ; 10-11 | 16 bit number | length of the record
"byte reserved[20];" ; 12-31 | 20 bytes | reserved bytes
;~ $tagField & _ ; 32-n | 32 bytes each | field descriptor array
;~ "byte terminate;" ; n+1 | 1 byte | 0DH as the field terminator
Global $Header = DllStructCreate($tagFileHeader)Func _CreateRecordStruct(ByRef $databaseFieldInfos)
[/autoit] [autoit][/autoit] [autoit]
Local $sText = "char deleted;"
For $i = 1 To UBound($databaseFieldInfos)
$sText &= "char field" & $i & "[" & $databaseFieldInfos[$i - 1][3] & "];"
Next
Return DllStructCreate($sText)
EndFunc ;==>_CreateRecordStructFunc bLoadClick()
[/autoit] [autoit][/autoit] [autoit]
$Path = FileOpenDialog('Rechnungsdatei wählen', $load, 'DBF(*.dbf)')
If @error Then Return MsgBox(0, 'Fehler', 'Keine Datei ausgewählt')
GUICtrlSetState($bLoad, $GUI_DISABLE)
$DBFFile = _WinAPI_CreateFile($Path, 2, 2, 2)
Local $ReadChars
If _WinAPI_ReadFile($DBFFile, DllStructGetPtr($Header), DllStructGetSize($Header), $ReadChars) Then
If DllStructGetData($Header, "ver") <> 3 Then ; Version muss
MsgBox(16, 'Error', "No supportet dbase format (only dbase 3 without .DBT-files)")
_WinAPI_CloseHandle($DBFFile)
Exit
EndIf
; $tagField erstellen
Local $FieldDescriptor = DllStructCreate($tagField)
;, Infos aus Header auslesen
Local $HeaderLength = DllStructGetData($Header, "headerlength")
Local $FieldsCount = Floor(($HeaderLength - DllStructGetSize($Header) - 1) / DllStructGetSize($FieldDescriptor))
Local $RecordLength = DllStructGetData($Header, "reclength")
Local $RecordsCount = DllStructGetData($Header, "reccount")
; Zahl der Felder: (Headergröße - Dateiheadergröße - terminator-byte) / Feldbeschreibungs-größe
If $FieldsCount = 0 Then
MsgBox(16, '', "No fields")
Else
Global $DatabaseArray[$RecordsCount + 1][$FieldsCount]
Global $databaseFieldInfos[$FieldsCount][5]
For $i = 1 To $FieldsCount
_WinAPI_ReadFile($DBFFile, DllStructGetPtr($FieldDescriptor), DllStructGetSize($FieldDescriptor), $ReadChars)
$DatabaseArray[0][$i - 1] = DllStructGetData($FieldDescriptor, "name")
For $s = 0 To 4
$databaseFieldInfos[$i - 1][$s] = DllStructGetData($FieldDescriptor, $s + 1)
Next
Next
Local $CHECKREAD = DllStructCreate("byte terminate")
_WinAPI_ReadFile($DBFFile, DllStructGetPtr($CHECKREAD), 1, $ReadChars)
If DllStructGetData($CHECKREAD, 1) == 0x0D Then
$RecordStruct = _CreateRecordStruct($databaseFieldInfos)
GUICtrlSetState($Progress1, $GUI_SHOW)
GUICtrlSetData($lbMsg, 'Daten werden konvertiert')
$iStep = 100/$RecordsCount
For $i = 1 To $RecordsCount
$iProgress += $iStep
GUICtrlSetData($Progress1, $iProgress)
_WinAPI_ReadFile($DBFFile, DllStructGetPtr($RecordStruct), DllStructGetSize($RecordStruct), $ReadChars)
If $ReadChars = 0 Then
; keine Felder mehr (Fehler)
ReDim $DatabaseArray[$i][$FieldsCount]
ExitLoop
EndIf
For $j = 1 To $FieldsCount
$DatabaseArray[$i][$j - 1] = DllStructGetData($RecordStruct, "field" & $j)
#Region Datentypen konvertieren
Switch $databaseFieldInfos[$j - 1][1]
Case "C" ; characters: nothing
If StringInStr($DatabaseArray[$i][$j - 1], "00:00:00", 1) Then
$DatabaseArray[$i][$j - 1] = StringStripWS(StringRegExpReplace($DatabaseArray[$i][$j - 1], _
"(\d\d)(\.)(\d\d)(\.)(\d{4})(\s00:00:00)", "$1$3$5"), 3)
Else
$DatabaseArray[$i][$j - 1] = OemToChar($DatabaseArray[$i][$j - 1])
If StringLen($DatabaseArray[$i][$j - 1]) > 30 Then _
$DatabaseArray[$i][$j - 1] = StringLeft($DatabaseArray[$i][$j - 1], 30)
EndIf
Case "N" ; numeric
If StringInStr($DatabaseArray[$i][$j - 1], '.') Then
$DatabaseArray[$i][$j - 1] = StringTrimRight(StringStripWS(StringReplace($DatabaseArray[$i][$j - 1], '.', ','), 1), 2)
Else
$DatabaseArray[$i][$j - 1] = Number($DatabaseArray[$i][$j - 1])
EndIf
Case "L"
Switch $DatabaseArray[$i][$j - 1]
Case "?"
$DatabaseArray[$i][$j - 1] = "N/A"
Case 'Y', 'y', 'T', 't'
$DatabaseArray[$i][$j - 1] = True
Case 'N', 'n', 'F', 'f'
$DatabaseArray[$i][$j - 1] = False
EndSwitch
Case "D"
$DatabaseArray[$i][$j - 1] = StringRegExpReplace($DatabaseArray[$i][$j - 1], "\A(\d{4})(\d\d)(\d\d)\Z", "$1/$2/$3")
Case "M" ; not supportet
EndSwitch
#EndRegion Datentypen konvertieren
Next
Sleep(10)
Next
Else
MsgBox(0, 'Error', "Wrong fielddescriptortable")
EndIf
EndIf
_WinAPI_CloseHandle($DBFFile)
EndIf
; Spalten infos hizugügen zu Feld-Info array
;~ ReDim $databaseFieldInfos[UBound($databaseFieldInfos)+1][5]
;~ $databaseFieldInfos[UBound($databaseFieldInfos)-1][0] = "[[ NAME ]]"
;~ $databaseFieldInfos[UBound($databaseFieldInfos)-1][1] = "[[ TYP ]]"
;~ $databaseFieldInfos[UBound($databaseFieldInfos)-1][2] = "[[ ADRESSE ??? ]]"
;~ $databaseFieldInfos[UBound($databaseFieldInfos)-1][3] = "[[ Byte-Länge ]]"
;~ $databaseFieldInfos[UBound($databaseFieldInfos)-1][4] = "[[ Dezimalstellen ]]"
GUICtrlSetData($Progress1, 100)
Sleep(1000)
GUICtrlSetData($vonDat, $DatabaseArray[1][3])
GUICtrlSetData($bisDat, $DatabaseArray[UBound($DatabaseArray)-1][3])
GUICtrlSetData($lbMsg, 'Konvertierung abgeschlossen - Bereit zum Export')
Sleep(500)
GUICtrlSetData($Progress1, 0)
GUICtrlSetState($bExport, $GUI_ENABLE)
EndFunc;===============================================================================
[/autoit] [autoit][/autoit] [autoit]
; Name: OemToChar
; Description: Wandelt einen ASCII- in einen ANSI-String
; Parameter(s): $szSrc = String der umgewandelt werden soll
; Requirement(s): keine
; Return Value(s): bei Erfolg: umgewandelter String
; bei Fehler: "" und @error = 1
; Author(s): bernd670
;===============================================================================
Func OemToChar($szSrc)
;~ Private Declare Function OemToChar Lib "user32.dll" Alias "OemToCharA" (ByVal lpszSrc As String, ByVal lpszDst As String) As Long
Local $placeholder
For $i = 0 To StringLen($szSrc)
$placeholder &= " "
Next
Local $lRetVal = DllCall("user32.dll", "long", "OemToChar", "str", $szSrc, "str",$placeholder)
If IsArray($lRetVal) And $lRetVal[0] = 1 Then
Return SetError(0,0,$lRetVal[2])
EndIfReturn SetError(1,0,"")
[/autoit]
EndFunc ;==>OemToChar -
Die von dir geschilderten Probleme lassen wohl eher auf Treiberkonflikte schliessen. Hast du evtl. die WLAN-Software des Adapters installiert und die Windows-eigene WLAN-Verwaltung vergessen zu deaktivieren? Dann streiten sich zwei um einen Adapter und du mußt es ausbaden, indem du keinen Empfang hast.

Dass ein Subwoofer ein dermaßen starkes Magnetfeld ausstrahlt, dass davon das WLAN-Netz beeinträchtigt wird, kannst du in den Bereich der Märchen und Sagen verbannen. Wenn das Feld so stark wäre, dass es diesen Einfluß hätte, würden schon längst alle eisenhaltigen Metallgegenstände deiner Wohnung am Subwoofer "kleben".

-
also nehme ich dafür StringRegExReplace mit der selben RegEx., das ersetzt mir aber das "\x" und nicht die "20". Bin ich nun total auf dem Holzweg??
AspirinJunkie hat dir schon die optimale Lösung gezeigt.
Hier kurz die Erklärung, warum StringRegExReplace nicht so geht:
Um Replace zu verwenden, mußt du den gesamten String ersetzen gemäß deiner Bedingung. Dazu muß dein Pattern aber auch den gesamten String erkennen, was bei deinem nicht der Fall ist, das erkennt nur die Hexwerte. Das Pattern zur Erkennung des gesamten Strings (mit Gruppierung der Hexwerte) könnte z.B. so aussehen: '(.+")((\\x([\da-fA-F]+)\\x)(?:[\da-fA-F]+))+(".+)'
Aber dadurch, dass die gesuchte Gruppe mehrfach auftritt kannst du keine klare Ersetzung vornehmen. -
Ihr habt sicher alle mitbekommen, als das "Gesetz zur Bekämpfung von Kinderpornographie in Kommunikationsnetzen" verabschiedet wurde.
Politiker ohne jede Ahnung von technischen Abläufen feierten diesen Schwachsinn als Meilenstein in der Bekämpfung der Kinderpornographie im Internet. Tatsächlich ist die Technik (Umleiten des Seitenaufrufs auf eine Warnseite) ein Witz und jeder halbwegs Computerinteressierte 10-jährige ist in der Lage dieses zu umgehen.
Anstatt international gemeinsam gegen die Betreiber dieser Seiten vorzugehen versucht man nur den Zugang zu erschweren. Eine hoffnungslose und von Einfalt geprägte Idee.Nun plant die EU eine europaweite Regelung zur Sperrung des Internetzugangs für Websites. Schon wieder so eine halbherzige Sache. Statt die Ursachen zu bekämpfen soll an den Symptomen rumgedoktort werden. Und das auf eine Weise, die nicht nur eine Zensur im Internet darstellt, sondern auch die User kriminalisiert.
Hier ein Auszug aus der PC-Welt dazu:Spoiler anzeigen
ZitatFünf große deutsche Internet-Provider verpflichteten sich am 17. April 2009 freiwillig dazu, gemäß einer täglich aktualisierten Liste des Bundeskriminalamtes (BKA) eine Internetsperre für strafbare Inhalte einzurichten. Das Problem: Was darunter fällt, bestimmt das BKA allein. Es sind keine richterlichen oder parlamentarischen Kontrollen vorgesehen. In einem zweiten Schritt soll die Internetsperre für alle Provider per Gesetz bindend werden. Dabei sollen die Provider auch speichern, wer versucht hat, auf die verbotenen Adressen zuzugreifen. Wer unbeabsichtigt über eine maskierte Adresse, zum Beispiel per TinyURL, auf eine gesperrte Adresse weitergeleitet wird, könnte so völlig unschuldig ins Fadenkreuz der Ermittlungen geraten.
Zensur, nein danke: Wenn das Gesetz kommt, wird es wahrscheinlich nur für die Provider gelten und diese verpflichten, die Internetsperre einzurichten. Für den einzelnen Nutzer wird es aber keine Verpflichtung geben, sich der Internetsperre zu unterwerfen. Somit ist es nur eine technische, keine juristische Angelegenheit, die Internetsperre zu überwinden.
Die Technik hinter der Internetsperre: Das momentan geplante Verfahren der Internetsperre sieht vor, unerwünschte Sites auf DNS-Ebene auszusperren. DNS steht für "Domain Name System". Das ist die Datenbank, die jedem Rechner-Namen, etwa https://autoit.de/www.pcwelt.de, eine IP-Adresse zuordnet, unter der dieser Computer im Internet erreichbar ist - in diesem Fall 217.111.81.80.
Für Sites, die auf der BKA-Sperrliste stehen, geben die DNS-Server Ihres Internet-Providers dann statt der korrekten IP-Adresse eine andere zurück, die auf einen Server mit einem Warnhinweis in Form eines Stoppschilds führt.
Es besteht durchaus die Gefahr ungewollt auf solch einer Seite zu landen. Da der Zugriff gespeichert werden soll, kann also plötzlich das BKA vor der Tür stehen - sehr unschöne Vorstellung.
Um dieser Kriminalisierung zu entgehen, ist es sinnvoll die verwendete Technik ad absurdum zu führen. Dazu reicht eine Änderung der DNS-Server Adressen beim User. Wie das für die einzelnen Router bzw. OS gemacht werden kann, beschreibt der angeführte Artikel.
Hinweis für Fritz!Box-User: Nach dem Neuladen der geänderten Konfigurationsdatei kann es durchaus 5 min dauern bis man wieder Netzwerkzugriff auf den Router hat. Anschließend könnt ihr in der Ereignisübersicht der Box den Erfolg kontrollieren. Folgender Eintrag sollte erscheinen:
14.06.10 09:16:20 Internetverbindung wurde erfolgreich hergestellt. IP-Adresse: xx.xxx.xx.xxx, DNS-Server: 208.67.222.222 und 208.67.220.220, ...Niemand soll mich hier falsch verstehen: Ich würde es sehr begrüßen, wenn kinderpornographische Seiten aus dem Web verschwinden würden und deren Betreiber/Nutzer ihrer gerechten Strafe zugeführt werden.
Aber eine weitere Beschneidung der Rechte des Einzelnen unter dem Deckmäntelchen des Schutzes für Alle ist ein Holzweg.
Und hier sollte man auch alle legalen Mittel ausnutzen, um sich dem entgegenzustellen. -
ReDim kürzt das Array von oben, d.h. von den hohen Indexwerten zu den niedrigen.
_ArrayDelete verschiebt einfach ab dem Index des zu löschenden Elements alle Items um eins nach unten und 'löscht' dann das letzte Element mit ReDim.
Um mehrere Elemente am Ende eines Array zu löschen, ist es also absolut falsch _ArrayDelete zu verwenden, da dieses nach jedem Element ein ReDim ausführt. Wenn du 10 Elemente kürzen willst also 10x ReDim
Das geht natürlich mit einem einzigen ReDim viel zügiger. -
mit
_ArrayDelete
kann man arrays einfacher löschen
Das macht nix anderes als ReDim (natürlich mit eckigen Klammern für die neue Dimensionsgröße), wenn du die letzten n-Elemente eines Arrays löschen willst. -
Mit ReDim().
-
[autoit]
If StringInStr($string_aus_Combo, "Stein") Then
[/autoit] -
Gibts da auch ne Funktion, die das Script wieder beendet, wenn ich das Spiel wieder beende???
[autoit]
Anscheinend hast du die Lösungen nicht mal getestet, denn genau das macht mein Bsp. mit der Schleife:While ProcessExists($PID)
[/autoit]
;.... -
DIE optimale Variante gibt es hier sicher nicht.
Viel zu viel unterschiedliche Faktoren auf der Userseite sorgen dafür, dass es immer eine Variante geben wird, bei der das Endprodukt "bescheiden" aussieht.
Wenn nicht viel auf der Seite steht, kannst du sie künstlich voller erscheinen lassen. Leg die Navigationsleiste vertikal nach links und platziere den Seiteninhalt als Block daneben. Dann kannst du mit %-Werten arbeiten. Ob du das per CSS löst oder mit Frames bleibt deinem Geschmack überlassen.
Letztlich ist aber auch die Bewertung, ob eine Seite gut aussieht oder nicht immer subjektiv. Da du es für dich machst, sollte es in erster Linie auch dir gefallen. -
Bitte Beachten!
Ich habe mir die geposteten Bilder/Filme nicht weiter angesehen - aber: Haben die jeweiligen Poster abgeklärt, ob sie diese Objekte hier darstellen dürfen? (Stichwort: Urheberrechtsschutz)
Sollten dies keine freigegebenen Objekte sein oder keine Erlaubnis des Rechteinhabers zur weiteren Nutzung vorliegen, so bitte ich ausdrücklich darum, diese Darstellungen umgehend zu entfernen! -
Du hast im Prinzip nur das bereits gesagte wiederholt.

Ich versuche mal eine Problembeschreibung:
...Du hast eine ComboBox aus der du eine Exeldatei auswählst.
Auf deiner GUI hast du 8 (in Worten acht!!) ListView.
Beim Laden der Exceldatei werden die Werte aus Spalte A in das Listview[0] geschrieben
Beim Doppelklick auf (Schlag-mich-tot-ich-weiß-nicht-was) sollen Werte aus den anderen Spalten in die anderen Listview geschrieben werden.Warum machst du nicht ein ListView mit 8 Spalten und befüllst es beim Laden der Exceldatei in einem Rutsch?
-
Probier mal:
[autoit]$read = FileRead('Deine Datei')
[/autoit]
$mails = StringRegExpReplace($read, '(.+\t)(.+)(\t(.+)?\r\n)', '$2' & @CRLF)
Damit solltest du in der Variablen $mails mit @CRLF getrennt alle enthaltenen Mailadressen haben.
Voraussetzung: Es sind wirklich nur diese beiden Tabulatoren enthalten. -
Die Strg Taste muss gehalten bleiben bis die s Taste gedrückt wurde und dann kann man auch die strg Taste los lassen
Send("{CTRLDOWN}s{CTRLUP}") - s. Hilfe zu Send() -
Egal in welche Richtung du nachher gehst:
Es wird immer richtig sein, den Umgang mit Datenbanken zu beherrschen. Die üblichen "Verdächtigen"
hat ja Mahagon schon benannt. Was natürlich ein deutlicher Unterschied zu AutoIt im Umgang mit Werten ist - du mußt immer den exakten Datentyp verwenden und bei Bedarf wandeln. Lad dir einfach mal die Doku für MySQL oder Firebird runter und lies gründlich, 2-3 mal. Dann kannst du dir auch die DB installieren und eigene DB aufbauen. Und wenn das alles sitzt kommt das wirklich Schöne an DB: Arbeiten mit Triggern. Einen Trigger falsch programmiert und schon verschwinden die Daten im Nirvana :D. Sowas sollte man wirklich an einer eigenen DB lernen. -
Du weißt, ich hab dir schon mehrfach bei deinen Excelproblemen geholfen.
Aber eines hat sich leider nicht verbessert: Du schaffst es nicht dein Problem klar in Worte zu fassen.
Denke dabei ganz simpel:
- Beschreibung aktueller Status (wie sehen Musterdaten aus)
- Beschreibung des Zielstatus (wie sollen die Daten dann aussehen, bzw. wo sollen sie stehen)Das ist wesentlich einfacher für den Helfenden, als zu versuchen deine Denkvorgänge aus dem Lösungsansatz nachzuvollziehen und daraus diese Angaben abzuleiten. Gehe immer davon aus, dass der von dir gewählte Weg nicht optimal sein muß und auch andere Lösungen möglich sind.
Also ich kann mit deiner Beschreibung nicht wirklich erkennen, was du willst und warum es nicht funktioniert.
-
dass dort mal eine anklickbarer link stehen sollte ... geht sowas ?
Das ist durchaus machbar:
- nutze OnEventMode
- weise dem Event $GUI_EVENT_PRIMARYUP eine Funktion zu, in der Funktion:
- prüfe ob Maus über Input (ID unter Cursor erhältst du mit GUIGetCursorInfo )
- wenn ja: lies Inhalt des Inputs und selektiere mit StringRegExp einen evtl. Link
- wenn Link vorhanden: ShellExecute($Link)warum ist der inhalt meines inputs immer komplett markiert wenn ich was paste
Wenn das Input den Fokus erhält und es ist nicht leer, wird von Windows immer der Inhalt markiert. Sende einfach an das Control: {HOME} oder {END} - je nachdem, wo der Cursor stehen soll. -
Hi,
starte dein Spiel mit diesem Skript, dann wird automatisch die erzeugte Prozeß-ID (PID) für den Zugriff genutzt und beim Beenden des Spieles wird auch das Skript mitbeendet.Spoiler anzeigen
[autoit]Local $GamePath = 'Pfad deines Spiels'
[/autoit] [autoit][/autoit] [autoit]
Local $PID = Run($GamePath)Local $hWnd
[/autoit] [autoit][/autoit] [autoit]
Do
$hWnd = WinGetHandle($PID)
Until IsHWnd($hWnd)Local $timer = TimerInit()
[/autoit] [autoit][/autoit] [autoit]While ProcessExists($PID)
[/autoit]
If TimerDiff($timer) > 10*60*1000 Then
ControlSend($hWnd, '', '', '^s')
$timer = TimerInit()
EndIf
Sleep(1000)
WEnd