Beiträge von TheLuBu
-
-
Zeile 33 so ändern:
[autoit]Global $Read, $index
[/autoit]
[autoit]
Hinter Zeile 58 (Case go_button):$Read = GUICtrlRead($Antwort)
[/autoit]MfG LuBu
-
-
Sollte alles machbar sein.
[autoit]
Schau dir die Excel UDF an und entweder InetGet oder WinHttp.#include <Excel.au3>
[/autoit][autoit][/autoit][autoit]$oExcel = _ExcelBookOpen($Dateipfad)
[/autoit]
For $i = 1 To 10 ; ich gehe jetzt mal von 10 Sachen aus
$Cell = _ExcelReadCell($oExcel, $i, 1) ; erste Spalte in der Exceltabelle
$Read = Inetget("Der Link mit Suchstring, wonach gesucht werden soll")
$Read = BinaryToString($Read) ; gibt den HTML Quellcode der Suchseite aus
;-------------------------
;Hier der Code, um den Preis auf der Seite rauszusuchen
$Value = "10"
;-------------------------
_ExcelWriteCell($oExcel, $Value, $i, 2) ; schreibt den Preis in die 2 Spalte der Exceldatei
Next -
Ich nutze ebenfalls Outlook, und brauchte ein ähnliches Script.
Bin dann aber unter VBA fündig gewordenCode
Alles anzeigenPrivate Sub Application_NewMail() Dim Ordnername As String Dim objPosteingang As MAPIFolder Dim objNewMail As MailItem On Error Resume Next Set objPosteingang = Application.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox).Folders("Ordnername im Outllok, wo die Dateien hinverschoben werden") Ordnername = "C:\neuer Ordner\test" MkDir Ordnername For Each objNewMail In objPosteingang.Items With objNewMail If .UnRead = True Then Anzahl = .Attachments.Count If Anzahl > 0 Then For i = 1 To Anzahl .Attachments.Item(i).SaveAsFile Ordnername & "\" & .Attachments.Item(i).FileName Next i End If End If End With Next objNewMail End SubFüge das in Outlook (Alt + F11) unter "This outlook Session" ein und der speichert automatisch die neuen Emails aus dem Ordner auf deine Festplatte.
Den Ordner kannst du dann mit
[autoit]If FileExist()...
[/autoit]
überprüfen und automatisch weiterbearbeiten -
Spoiler anzeigen
[autoit]#include <EditConstants.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <GUIConstantsEx.au3>
#include <GuiEdit.au3>
#include <GuiListView.au3>
#include <ListViewConstants.au3>
#include <StructureConstants.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <Array.au3>Opt("GuiCloseOnESC", 0)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Global $avArray[10][2]
For $i = 0 To 9
$avArray[$i][0] = "Item "&$i
$avArray[$i][1] = "SubItem "&$i
NextGlobal $hEdit, $hDC, $hBrush, $Item = -1, $SubItem = 0
[/autoit] [autoit][/autoit] [autoit]Global $Style = BitOR($WS_CHILD, $WS_VISIBLE, $ES_AUTOHSCROLL, $ES_LEFT)
[/autoit] [autoit][/autoit] [autoit]$hGUI = GUICreate("ListView Subitems edit in place", 300, 200)
[/autoit] [autoit][/autoit] [autoit]$hListView = _GUICtrlListView_Create($hGUI, "Items|SubItems", 2, 2, 296, 196, BitOR($LVS_EDITLABELS, $LVS_REPORT))
[/autoit] [autoit][/autoit] [autoit]
_GUICtrlListView_SetExtendedListViewStyle($hListView, $LVS_EX_GRIDLINES)_GUICtrlListView_AddArray($hListView, $avArray)
[/autoit] [autoit][/autoit] [autoit]GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
[/autoit] [autoit][/autoit] [autoit]
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")GUISetState()
[/autoit] [autoit][/autoit] [autoit]Do
[/autoit] [autoit][/autoit] [autoit]Until GUIGetMsg() = $GUI_EVENT_CLOSE
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
[/autoit] [autoit][/autoit] [autoit]
Local $tNMHDR, $hWndFrom, $iCode$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
[/autoit] [autoit][/autoit] [autoit]
$hWndFrom = DllStructGetData($tNMHDR, "hWndFrom")
$iCode = DllStructGetData($tNMHDR, "Code")Switch $hWndFrom
[/autoit] [autoit][/autoit] [autoit]
Case $hListView
Switch $iCode
Case $NM_DBLCLK
Local $aHit = _GUICtrlListView_SubItemHitTest($hListView)
If $aHit[0] <> -1 Then
$Item = $aHit[0]
$SubItem = $aHit[1]
Local $iSubItemText = _GUICtrlListView_GetItemText($hListView, $Item, $SubItem)
Local $iLen = _GUICtrlListView_GetStringWidth($hListView, $iSubItemText)
Local $aRect = _GUICtrlListView_GetSubItemRect($hListView, $Item, $SubItem)
$hEdit = _GUICtrlEdit_Create($hGUI, $iSubItemText, $aRect[0] + 6, $aRect[1], $iLen + 10, 17, $Style)
_GUICtrlEdit_SetSel($hEdit, 0, -1)
_WinAPI_SetFocus($hEdit)
$hDC = _WinAPI_GetWindowDC($hEdit)
$hBrush = _WinAPI_CreateSolidBrush(0)
FrameRect($hDC, 0, 0, $iLen + 10 , 17, $hBrush)
EndIf
EndSwitch
EndSwitchReturn $GUI_RUNDEFMSG
[/autoit] [autoit][/autoit] [autoit]
EndFuncFunc FrameRect($hDC, $nLeft, $nTop, $nRight, $nBottom, $hBrush)
[/autoit] [autoit][/autoit] [autoit]
Local $stRect = DllStructCreate("int;int;int;int")
DllStructSetData($stRect, 1, $nLeft)
DllStructSetData($stRect, 2, $nTop)
DllStructSetData($stRect, 3, $nRight)
DllStructSetData($stRect, 4, $nBottom)DllCall("user32.dll", "int", "FrameRect", "hwnd", $hDC, "ptr", DllStructGetPtr($stRect), "hwnd", $hBrush)
[/autoit] [autoit][/autoit] [autoit]
EndFuncFunc WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
[/autoit] [autoit][/autoit] [autoit]
Local $iCode = BitShift($wParam, 16)Switch $lParam
[/autoit] [autoit][/autoit] [autoit]
Case $hEdit
Switch $iCode
Case $EN_KILLFOCUS
Local $iText = _GUICtrlEdit_GetText($hEdit)
_GUICtrlListView_SetItemText($hListView, $Item, $iText, $SubItem)
_WinAPI_DeleteObject($hBrush)
_WinAPI_ReleaseDC($hEdit, $hDC)
_WinAPI_DestroyWindow($hEdit)
$avArray[$Item][$SubItem] = $iText
$Item = -1
$SubItem = 0
_ArrayDisplay($avArray)
EndSwitch
EndSwitchReturn $GUI_RUNDEFMSG
[/autoit]
EndFuncDer meiste Code kommt von HIER
Habe es nur an ein Array angepasst. Einfach mal Doppelklick auf ein Item, dann siehste was sich ändert

-
Schau dir mal WM_Notify und GuiCtrllistview an.
Die Funktion _arrayDisplay erstellt auch nur ein GUI mit einem Listview und lädt das Array dann in das Listview.
Du könntest dasselbe machen, nur eben mit dem WM_Notify einen z.B. Rechtsklick abwarten, dann das Item bearbeiten, und es dann in das Array schreiben.
Ich schau mal ob ich sowas gebastelt bekomme -
Ich frage mich nur, warum du überaupt die Return Werte genutzt hast?
Beim Switch brauch man keinen Return Wert. -
poste mal dein Script bitte
-
Hallo liebe Community,
ich möchte gerne die Dateiversion eines von mir erstellten AutoIt Scripts auslesen. Erstellt wurde es mit
[autoit]#AutoIt3Wrapper_Res_Fileversion=1.0.0.2
[/autoit]
[autoit]
Sehen kann ich es auch unter den Eigenschaften, nur ich kann es nicht auslesen. Habe es schon mitFileGetVersion
[/autoit]und mit diesem Script versucht, aber mit beidem klappt es nicht.
P.S. benutze Windows 7, falls das einen Unterschied macht.
Kennt jemand den "Trick", die Dateiversion auszulesen?
--EDIT-- Funktioniert doch, wenn man nciht das nicht kompilierte Script nimmt...
-
Debuge mal die Zeile 89 und schau dir dann Run bzw. ShellExecute an, ich denke damit solltest du weiter kommen
-
[autoit]
Global $inhalt = _GUICtrlListView_GetItemText($hSearchLVHandle, $index, $subItem)
[/autoit]Da ist der Fehler, wie bugFix oben schon geschrieben hat, ist subitem die Spalte mit den Dateinamen, Ich nehme jetzt einfach mal an, das es die erste Spalte ist, dann würde es so heißen:
[autoit]Global $subItem = 1
[/autoit]Du musst nicht die Funktion Global setzen, sondern den Parameter der Funktion ( in dem Fall $subitem)
-
Habs jetzt anders gelöst, habe erst eine Abfrage
[autoit]$aSql &= "INSERT OR IGNORE INTO Daten VALUES ('" & $New[$i][1] & "', '" & $New[$i][3] & "', '" & $datenew & "');" & @CRLF
[/autoit]
Damit werden nur die Datensätze hinzugefügt, die es noch nicht gibt, darauf folgt eine Update Anweisung mit WHERE Bedingung.Danke für die Hilfe

-
-
Hallöchen ihr lieben,
Ich habe wiedermal ein SQLite Problem.
Ich habe 2 .csv Dateien, welche in jeweils eine Tabelle einer SQLite Datenbank gespeichert werden.
Soweit kein Problem
Jetzt möchte ich, das die beiden Tabellen verglichen werden, ob die Übereinstimmern. Dazu müssen die Spalten Art_nr und Bestand überprüft werden, ob die gleich sind.
Ich hatte erst gedacht, ich könnte es mit INSERT OR REPLACE machen, aber ich brauche in einer zusatzspalte einen Timestamp, also wann der Datensatz das letzte mal aktualisiert wurde. Wenn die also vollkommen gleich sind, soll kein neuer Timestamp gesetzt werden.
Wenn ich INSERT OR REPLACE aber richtig verstanden habe, ersetzt der die Datensätze, ob die gleich sind oder nicht, und das möchte ich eben nicht.Muss ich jeden Datensatz zuerst mit SELECT abfragen, vergleichen, und dann evtl. ersetzen mit Timestamp, oder gibt es da einen Befehl für?
Wäre für eure Hilfe sehr Dankbar
-
-
Raupi : Vielen Dank, das ist genau das, was ich gesucht habe.
-
Also ich denke mal du willst ein externes Programm starten, vielleicht auch aus einer GUI heraus, aber in einer GUI? GUI ist die Grafische Benutzeroberfläche (Graphical User Interface), nicht das Programm selbst.
Schau dir mal die Befehle
[autoit]Run
[/autoit]
ShellExecute
an, damit sollte es eigentlich gehen -
Hallo ihr lieben,
Ich arbeite derzeit an einer gößeren GUI und möchte dort jetzt Auswahlabhängige Controls setzen.
Als Beispiel:
Man sieht nur eine Combobox, wählt einen Wert aus, es "erscheint" eine Inputbox. Wenn man einen anderen wählt, verschwindet die Inputbox und es erscheint eine weitere Combobox. Beim dritten Wert erscheint ein Label etc...
Also quasi den benutzer führen, welche Werte er überhaupt nehmen kann und welche Kombinationen nicht.Für einige wenige Fälle kann man jeden einzelnen Wert mit IF.../Else oder mit Switch.../Case machen, Ich möchte es aber mit Kategorien machen, also das z.b. Wert 3,5,8 und 10 eine inputbox anzeigen (Kategorie 1), Wert 1,2,4 und 9 eine Weitere Combobox anzeigen (Kategorie 2). Also quasi einen Internen Wert den einzelnen Auswahlmöglichkeiten geben, die nicht angezeigt werden, aber durch die die nächste Anzeige eben zusammengefasst werden kann.
Gedacht hatte ich schon an ein 2-D Array, 1 Spalte der Comboboxwert, 2te Spalte die Kategorie, aber ich möchte eigentlich ungern bei jeder Auswahl ein Array durchsuchen müssen.
Kennt jemand einen Trick, einer Combobox "interne" Werte zuzuweisen?
Ich würde ungern ein seperates Array durchsuchen müssen, um die Kategorie -
Hallöchen liebe Community,
ich habe ein kleines Problem mit einer SQLite Datenbank
Hier erstmal das ScriptSpoiler anzeigen
[autoit]#include <SQLite.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <SQLite.dll.au3>
_SQLite_Startup()
_SQLite_Open(@ScriptDir & "\OBTBF.db")
_SQLite_Exec(-1, "CREATE TABLE tbl_OBTBF(ID VARCHAR(20), Datum DATE, Uhrzeit VARCHAR(8), UNIQUE (ID,Datum,Uhrzeit));") ; Erzeugt Tabelle$File = FileSelectFolder("Ordner mit den OBTBF auswählen", "", 3)
[/autoit] [autoit][/autoit] [autoit]
$array = _GetFilesFolder_Rekursiv($File, '*', 0)
$aSql = 'Begin Transaction ;' & @CRLF
For $i = 1 To $array[0]
$tmpSplit = Stringsplit($array[$i], "\")
$Split = Stringsplit($tmpSplit[$tmpSplit[0]], "_")
$Datumsplit = Stringsplit($Split[2], "")
$Datum = "20"&$Datumsplit[5]&$Datumsplit[6]&"-"&$Datumsplit[3]&$Datumsplit[4]&"-"&$Datumsplit[1]&$Datumsplit[2]
$Uhrzeitsplit = Stringsplit($Split[3], "")
$Uhrzeit = $Uhrzeitsplit[1]&$Uhrzeitsplit[2]&":"&$Uhrzeitsplit[3]&$Uhrzeitsplit[4]&":00"
$aSql &= "INSERT INTO tbl_OBTBF (ID,Datum,Uhrzeit) VALUES ('" & $Split[1] & "','" & $Datum & "','" & $Uhrzeit & "');" & @CRLF
Next
$aSql &= 'Commit Transaction ;' & @CRLF
_SQLite_Exec(-1, $aSql)
_SQLite_Close(-1);==================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; Function Name: _GetFilesFolder_Rekursiv($sPath [, $sExt='*' [, $iDir=-1 [, $iRetType=0 ,[$sDelim='0']]]])
; Description: Rekursive Auflistung von Dateien und/oder Ordnern
; Parameter(s): $sPath der Basispfad für die Auflistung ('.' -aktueller Pfad, '..' -Parentpfad)
; $sExt Erweiterung für Dateiauswahl '*' oder -1 für alle (Standard)
; $iDir -1 Dateien+Ordner(Standard), 0 nur Dateien, 1 nur Ordner
; optional: $iRetType 0 gibt Array, 1 gibt String zurück
; optional: $sDelim legt Trennzeichen für Stringrückgabe fest
; 0 -@CRLF (Standard) 1 -@CR 2 -@LF 3 -';' 4 -'|'
; Return Value(s): Array (Standard) od. String mit den gefundenen Pfaden der Dateien und/oder Ordner
; Array[0] enthält die Anzahl der gefundenen Dateien/Ordner
; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
;==================================================================================================
Func _GetFilesFolder_Rekursiv($sPath, $sExt='*', $iDir=-1, $iRetType=0, $sDelim='0')
Global $oFSO = ObjCreate('Scripting.FileSystemObject')
Global $strFiles = ''
Switch $sDelim
Case '1'
$sDelim = @CR
Case '2'
$sDelim = @LF
Case '3'
$sDelim = ';'
Case '4'
$sDelim = '|'
Case Else
$sDelim = @CRLF
EndSwitch
If ($iRetType < 0) Or ($iRetType > 1) Then $iRetType = 0
If $sExt = -1 Then $sExt = '*'
If ($iDir < -1) Or ($iDir > 1) Then $iDir = -1
_ShowSubFolders($oFSO.GetFolder($sPath),$sExt,$iDir,$sDelim)
If $iRetType = 0 Then
Local $aOut
$aOut = StringSplit(StringTrimRight($strFiles, StringLen($sDelim)), $sDelim, 1)
If $aOut[1] = '' Then
ReDim $aOut[1]
$aOut[0] = 0
EndIf
Return $aOut
Else
Return StringTrimRight($strFiles, StringLen($sDelim))
EndIf
EndFuncFunc _ShowSubFolders($Folder, $Ext='*', $Dir=-1, $Delim=@CRLF)
[/autoit]
If Not IsDeclared("strFiles") Then Global $strFiles = ''
If ($Dir = -1) Or ($Dir = 0) Then
For $file In $Folder.Files
If $Ext <> '*' Then
If StringRight($file.Name, StringLen($Ext)) = $Ext Then _
$strFiles &= $file.Path & $Delim
Else
$strFiles &= $file.Path & $Delim
EndIf
Next
EndIf
For $Subfolder In $Folder.SubFolders
If ($Dir = -1) Or ($Dir = 1) Then $strFiles &= $Subfolder.Path & '\' & $Delim
_ShowSubFolders($Subfolder, $Ext, $Dir, $Delim)
Next
EndFuncDas ganze liest erst alle mp3 Files in einem Ordner + Unterordner, splittet jeweils den Dateinamen in eine ID, ein Datum und eine Uhrzeit ( sind im Dateinamen vorhanden) und speichert das ganze in der Datenbank.
Hier kommt jetzt mein Problem:
Ich arbeite mit BEGIN TRANSACTION und COMMIT TRANSACTION, damit es schneller geht ( es sind bis jetzt ca. 600000 Dateien und es werden täglich mehr).
Ich möchte und kann (größenbedingt) die Dateien nicht umbenennen und/oder verschieben, aber es sollen eben immer auch die neuesten Dateien in die Datenbank gespielt werden.Jetzt bin ich mir aber nicht sicher, ob eine Transaktion Fehler ignoriert und alle andern Datensätze speichert, oder ob er die gesamte Transaktion abbricht.
Als Beispiel, die Datei mit 000001_200911_0922_ODDB.mp3 wurde bereits eingelesen, liegt aber ja noch in dem Ordner.
Wenn das Programm diese Datei jetzt nimmt und einen INSERT INTO Befehl damit erstellt, das ganze mitten in der Transaktion, wird es dann nur eine Fehlermeldung geben, das dieser Datensatz nicht eingespielt werden konnte oder bricht die gesamte Transaktion, mit möglicherweise noch nicht eingespielten Datensätzen, ab?Weiß jemand, wie das ausgeführt wird, oder kennt eine andere (vielleicht bessere) Lösung?