1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Andy

Beiträge von Andy

  • Adaptiver Huffman Encoder

    • Andy
    • 9. März 2019 um 12:10

    Hi,

    Zitat von Mars

    ist aber ADH_Build

    ich liebe diese Freud´schen "Versprecher":thumbup:

    Ansonsten halte ich diese Idee für sehr gut, habe etwas ähnliches auch schon bei Bildkomprimierung mit verschiedenen anderen Varianten zusammen eingesetzt. Im Deskstream-Programm wurde das aber letztendlich verworfen, später mehr dazu^^

    Wie du schon angesprochen hast, ist das "Problem" ja, die "passende" Kodier/Dekodiertabelle aufzubauen. Der "optimale" Baum muss zwangsläufig IMMER mitgesendet werden, wenn es richtig dumm läuft, unterscheidet dieser sich bei ähnlichen Bildern/Texten/Daten kaum, von daher könnte man direkt einige/mehrere "halboptimale" Bäume beim Empfänger abgespeichert lassen und dann nur noch die "Baumnummer" (passt in EIN Byte) mitsenden!

    Den Vorteil hast du klar erkannt, Rechenersparnis sowohl beim Sender als auch beim Empfänger!

    Bleibt die Zeit, die Nachricht zu übertragen, und letztendlich ist DAS das eigentliche Problem.

    Mit heutiger Prozessortechnik und Rechenleistung ist das aufbauen selbst eines "optimalen" Huffmann-Baums in Mikro/Millisekunden erledigt, sowohl beim Sender, als auch beim Empfänger. Aber der Versand/Übertragung per Netzwerk kostet Faktor hundert bis tausend mal so viel Zeit!

    Von Latenzen garnicht zu sprechen! Warum sehen denn Videokonferenzen immer noch bescheiden aus, trotz massiver Rechen/Rechnertechnik. Warum laden Videoportale/Streamingdienste massivst Daten vor, und hoffen inständig, dass der User eine "gute" Anbindung zu seinem Provider hat?!

    Der Weg zum Empfänger ist zzt. das Problem, nicht die Kodier/Dekodierroutine!

  • Gradientenverlauf mit Multi Colored Maker

    • Andy
    • 8. März 2019 um 17:46

    ruby

    wozu brauchst du solch ein Script überhaupt?

    Ich weiß, das ich etwas ähnliches schon einmal geschrieben hatte, die einzelnen Farben des kompletten Farbverlaufs wurden in eine Datei geschrieben. Aber wozu ich das gebraucht hatte, weiß ich nicht mehr^^

  • Gradientenverlauf mit Multi Colored Maker

    • Andy
    • 7. März 2019 um 20:46

    Hi,

    damit solltest du weiter kommen...

    C
    ;
    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    
    _GDIPlus_Startup()               ;initialize GDI+
    Global Const $iWidth = 800, $iHeight = 300, $iBgColor = 0x303030 ;$iBgColor format RRGGBB
    
    Global $hGUI = GUICreate("GDI+ Gradienten", $iWidth, $iHeight) ;create a test GUI
    GUISetBkColor($iBgColor, $hGUI)  ;set GUI background color
    GUISetState(@SW_SHOW)
    
    Global $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI) ;create a graphics object from a window handle
    _GDIPlus_GraphicsSetSmoothingMode($hGraphics, $GDIP_SMOOTHINGMODE_HIGHQUALITY) ;sets the graphics object rendering quality (antialiasing)
    
    Dim $array[6][2]                 ;anzahl Gradientenverläufe, [Startposition][Startfarbe]
    
    $array[0][0] = 0                 ;Xpos1
    $array[0][1] = 0xFF000000        ;Xcol1
    $array[1][0] = 150               ;Xpos2
    $array[1][1] = 0xFF00FF00        ;Xcol2
    $array[2][0] = 280               ;Xpos3
    $array[2][1] = 0xFF0000FF        ;Xcol3
    $array[3][0] = 370               ;Xpos4
    $array[3][1] = 0xFFFFFF00        ;Xcol4
    $array[4][0] = 550               ;Xpos5
    $array[4][1] = 0xFFFF0FF0        ;Xcol5
    $array[5][0] = 800               ;Xpos6
    $array[5][1] = 0xFFA0F0BB        ;Xcol6
    
    $H = 150                         ;Höhe Gradientenverlauf
    $Y = 80                          ;y-Position
    
    For $x = 0 To UBound($array) - 2 ;alle x-positionen
        $xStart = $array[$x][0]
        $xEnd = $array[$x + 1][0]
        $colStart = $array[$x][1]
        $colEnd = $array[$x + 1][1]
    
        $hbrush = _GDIPlus_LineBrushCreate($xStart, 0, $xEnd, 0, $colstart, $colend) ;create gradient brush
        _GDIPlus_GraphicsFillRect($hGraphics, $xStart, $Y, $xEnd - $xStart, $H, $hbrush)
    
    Next
    
    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE
    
    ;cleanup GDI+ resources
    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_Shutdown()
    GUIDelete($hGUI)
    Alles anzeigen

    Kanashius, beide die gleiche Idee gehabt:thumbup:...altersbedingt war ich mal wieder langsamer 8)

  • Webseite Lessen

    • Andy
    • 3. März 2019 um 10:05

    Hi,

    Zitat von Muecke

    ich nehme es einfach mal als Kompliment

    so war es gemeint! :thumbup:

    Zitat von Muecke

    ja ich habe es geschafft

    DAS wollen wir von dir hören. :rock:Das ist die Motivation, die dazu führt, dass hier geholfen wird!

  • Webseite Lessen

    • Andy
    • 28. Februar 2019 um 16:32

    Hi,

    da das hier ja ein Programmierer-Forum ist, kannst du schon froh sein, überhaupt eine Idee zu haben, was du machen willst und auch (viel wichtiger) einige Leute, die du fragen kannst.

    Also, hau rein! :o)

  • Webseite Lessen

    • Andy
    • 19. Februar 2019 um 22:37

    Hi,

    Zitat von Muecke

    Daher meine Frage, gibt es ein Tool, das man für so etwas verwenden kann? z.B. das man nur etwas Markiert auf einer Webseite und das sagt einem dann wie man es am besten auslesen kann?

    Ja, das Tool ist dein Browser^^

    Bei meinem Opera geht das mit Rechtsklick und dann "Element untersuchen" (Ctrl-Shift-C). Bei Edge ist das bspw. die F12-Taste.

    Es öffnet sich ein Fenster, welches eine Beschreibung der Seitenelemente der Website enthält. Diese wiederum kannst du mit ihrem Namen ansprechen und auslesen.

    Schau mal in der Hilfe nach den _IE-Funktionen, da solltest du fündig werden.

  • WMI Objekt Methode ausführen (hier: Volume.Dismount)

    • Andy
    • 16. Februar 2019 um 10:10

    Hi,

    WENN man schon AutoIt in Verbindung mit WMI anspricht,sollte man ScriptOMatic nicht vergessen.

    Scriptomatic erstellt selbstständig (!) in AutoIt ausführbare WMI-Scripte aller verfügbaren abfragbaren Methoden

    Das ursprüngliche Script findet man hier: https://www.autoitscript.com/forum/files/fi…ents#comment-95

    Mir selbst war die dort bereitgestellte Auswahl der Funktionen zu umfassend, daher habe ich einen zusätzlichen Filter eingebaut.

    Das Script erschlägt zumindest meine Arbeit mit WMI. Ich habe auch noch nie eine einzige Zeile/Abfrage "von Hand" programmiert. Was damit nicht geht, lohnt nicht die Mühe woanders danach zu suchen. Zumindest ist das meine Erfahrung.....

    Scriptomatic.zip

  • Diskussion zum Thema : "AutoIt Interne Funktionen : Erwartetes Ergebnis -> Tatsächliches Ergebnis"

    • Andy
    • 14. Februar 2019 um 19:14

    Hi,

    die eigentliche Frage lautet ja, wieso AutoIt (genau wie die meisten anderen sog. Programmiersprachen auch) nicht in der Lage ist, eine NATIVE Funktion zur Verfügung zu stellen, um "automatisch" ein "richtiges" Ergebnis für eine Fließkommaberechnung bereitzustellen.

    Jeder Vollidiot ist in der Lage, auf seinem Smartphone und/oder dem/einem Windows/Linux "Einfachsttaschenrechner" beliebige Berechnungen mit "richtigem" Ergebnis durchzuführen, ohne dabei auch nur annähernd eine Ahnung von IEEE-754 Fließkommaarithmetik zu haben! Was wiederum die Frage aufwirft, wieso man dieses halbgare Konstrukt benutzt/benutzen muss?!

    *Anm. des Posters* KEINE(R) der o.g. "Einfachstaschenrechner" rechnet mit IEEE-754 Fließkommaarithmetik ;)


    Aber die Anwender einer "Programmiersprache" haben gefälligst selbst dafür zu sorgen bzw. irgendwelche "fremden" Bibliotheken aka UDF´s, bspw. BigNUm.UDF, zu entwickeln bzw. zu benutzen?!

    Ich kenne keinen Programmierer, der nicht mindestens einmal in die Fleisskommaarithmetik-"Falle" getappt ist! Diverse Mond/Weltraummissionen lassen grüßen, und es kann mir niemand erzählen, bei der NASA/ESA sitzen Leute, die vom Thema "keine Ahnung" haben!

    Und das Beispiel

    ConsoleWrite('! 78.08 - 11.07 - 67.01 = ' & 78.08 - 11.07 - 67.01 & @CRLF)

    ist imho einfach nur das Ergebnis eines armselig programmierten Parsers! DER sollte in der Lage sein, selbstständig "richtig" zu Runden, bzw. zu "rechnen".

    Btw. DAS wäre mal ein (AutoIt-) Entwicklungsschritt!

    Per Direktive der Programmiersprache das ganze IEEE-754-Thema auszutreiben und intern auf eine "richtige", aka Festkommaarithmetik mit in der Direktive vorgegebenen Genauigkeit, umzuschalten.

    Denn dann wäre es vollkommen unerheblich, ob ich mein Ergebnis auf 2 oder 200 Nachkommastellen "genau" haben wollte!

  • Funktionssammlung OpenOffice Calc

    • Andy
    • 9. Februar 2019 um 14:52

    Hi,

    du musst das Datum in ein "value", also eine Nummer in AutoIt umwandeln, diese Nummer in das Feld auf dem Datenblatt einfügen und dann als bspw. Datum formatieren.

    ich empfehle die UDF von mLipok https://www.autoitscript.com/forum/files/fi…mlwrapperexau3/ für den weiteren Einsatz mit OpenOffice!

    //EDIT Da hat sich der c&p-Teufel eingeschlichen, eigentlich wollte ich für OpenOffice/LibreOfficedas hier verlinken:

    https://www.autoitscript.com/forum/topic/15…olibo-calc-udf/


    Dort ist auch eine Funktion für das Setzen des Formats, die habe ich allerdings nicht ausprobiert^^

    C
    #include <Array.au3>
    #include <XML.au3>
    #include <_XMLDOMWrapper.au3>
    #include <Date.au3>
    #include <MsgBoxConstants.au3>
    #NoTrayIcon
    AutoItSetOption("WinTitleMatchMode", 2)
    $oMyError = ObjEvent("AutoIt.Error", "_OOErrFunc") ; Implementiert einen eigenen Error-Handler
    
    
    Dim $OpenPar[3];,$cellkoord[2]
    
    Global $setOOoProp, $oSheet, $odoc, $oDesk, $osm, $oCell, $errormodul
    Global $cellkoord[2]
    
    $sXmlFile = FileOpenDialog("XML bsp", @ScriptDir , "XML (*.xml)", 1,"bsp.xml")
    If @error Then
        MsgBox(16, "XML bsp", "Nix zu tun, beendet", 10)
        Exit (99)
    EndIf
    
    $oXMLDoc = _XML_CreateDOMDocument(Default)
    $XMLopen = _XML_Load($oXMLDoc, $sXmlFile);_XMLFileOpen($XML)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $XMLopen = ' & $XMLopen & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    $XMLcount = _XmlGetNodeCount($XMLopen,"Orders/Order")
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $XMLcount = ' & $XMLcount & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    Dim $arOrders[$XMLcount + 1][3]
    $arOrders[0][0] = "Value" ;'Datum VK' ;0
    $arOrders[0][1] = "String" ;'Datum GE' ;1
    
    For $i = 1 To $XMLcount
    $aTemp = _XMLGetValue($XMLopen,"Order[" & $i & "]/CreationDate") ;Bestelldatum
    $atemp1=$atemp[1]
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $aTemp1 = ' & $aTemp1 & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    
    
    
    $aTemp = _XMLGetValue($XMLopen,"Order[" & $i & "]/PaidOn") ;Rechnungsdatum
    $atemp2=$atemp[1]
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $aTemp2 = ' & $aTemp2 & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    
    Next
    
    ;_ArrayDisplay($arOrders)
    ; ### und jetzt in die Calc Tabelle Schreiben
    _OOInit() ;verbindung zu openoffice
    _OOAddNewBook() ;datei erstellen
    
    winwait("OpenOffice")
    ;WinSetState("OpenOffice","",@SW_MAXIMIZE)
    WinActivate("OpenOffice", "")
    
    if WinActive("OpenOffice", "")=0 then  ;sometimes the OO-window is not activated automatically ...
        msgbox(262144,     "OpenOffice CALC-Functions", _
                        "AutoIt can´t activate the OpenOffice-Window!" & @CRLF & _
                        "Please activate the OpenOffice-Window and press OK")
    endif
    If WinActive("OpenOffice", "")=0 then exit
    
    
    
    ;datum kalkulieren
    Local $iDateCalc1 = _DateDiff('d', "1899/12/30 00:00:00", $atemp1)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $iDateCalc1 = ' & $iDateCalc1 & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    Local $iDateCalc2 = _DateDiff('d', "1899/12/30 00:00:00", $atemp2)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $iDateCalc2 = ' & $iDateCalc2 & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    
    $Zeile=0
    $spalte =0
    _OOSheetSetCell($spalte, $zeile,$iDateCalc1,"value" ) ;$ref= angabe, ob "string" "value" "formula"
    
    $oCell = $oSheet.getCellByPosition($spalte,$zeile)
    $ocell.NumberFormat=37  ;siehe bspw http://www.dannenhoefer.de/faqstarbasic/ZellenStandardformat.html
    
    Msgbox(0,$iDateCalc1,"als Datum formatiert")
    
    
    _OOSheetSetCell($spalte, $zeile,$iDateCalc2,"value" ) ;$ref= angabe, ob "string" "value" "formula"
    
    Msgbox(0,$iDateCalc2,"neues datum")
    
    
    exit
    
    
    
    
    
    Func _OOSetProp($cName, $uValue) ;Eigenschaften in struct übergeben
        $errormodul = "_OOSetProp"
        $osm = ObjCreate("com.sun.star.ServiceManager")
        $oPropertyValue = $osm.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
        $oPropertyValue.Name = $cName
        $oPropertyValue.Value = $uValue
        $setOOoProp = $oPropertyValue
        Return $setOOoProp
    EndFunc   ;==>_OOSetProp
    
    Func _OOInit($pass = "", $readonly = False, $hidden = False) ;verbindung zu OO herstellen
        $errormodul = "_OOINIT"
        $osm = ObjCreate("com.sun.star.ServiceManager")
        $oDesk = $osm.createInstance("com.sun.star.frame.Desktop")
        $OpenPar[0] = _OOSetProp("ReadOnly", $readonly)
        $OpenPar[1] = _OOsetProp("Password", $pass) ;setzt das passwort des dokuments
        $OpenPar[2] = _OOsetProp("Hidden", $hidden)
    EndFunc   ;==>_OOInit
    
    Func _OOAddNewBook() ; neue Tabellendatei erstellen
        $errormodul = "_OOAddNewBook"
        $odoc = $oDesk.loadComponentFromURL("private:factory/scalc", "_blank", 0, $OpenPar)
        $oSheet = $odoc.CurrentController.ActiveSheet
    EndFunc   ;==>_OOAddNewBook
    
    Func _OOOpenFile($fname) ; bestehende *.Datei öffnen, OO importiert mit Filter wenn möglich
        $errormodul = "_OOOpenFile"
        $fname = StringReplace($fname, ":", "|")
        $fname = StringReplace($fname, " ", "%20")
        $fname = "file:///" & StringReplace($fname, "\", "/")
        $odoc = $oDesk.loadComponentFromURL($fname, "_blank", 0, $OpenPar)
    EndFunc   ;==>_OOOpenFile
    
    Func _OOOpenBook($fname) ; bestehende Tabellendatei öffnen
        $errormodul = "_OOOpenBook"
        $fname = StringReplace($fname, ":", "|")
        $fname = StringReplace($fname, " ", "%20")
        $fname = "file:///" & StringReplace($fname, "\", "/")
        $odoc = $oDesk.loadComponentFromURL($fname, "_blank", 0, $OpenPar)
        $oSheet = $odoc.CurrentController.ActiveSheet ;auskommentieren, um alle importierbaren Formate zu öffnen
    EndFunc   ;==>_OOOpenBook
    
    Func _OOStoreBook($fname, $filter = "StarOffice XML (Calc)") ;speichert Datei , angewandt wird der Dateifilter
        ;Alle EXPORT-Filter von dieser Page sind anwendbar, es gelten die internen Namen!
        ;http://wiki.services.openoffice.org/wiki/Framework/Article/Filter/FilterList_SO_7
        $errormodul = "_OOStoreBook"
        $fname = StringReplace($fname, ":", "|")
        $fname = StringReplace($fname, " ", "%20")
        $fname = "file:///" & StringReplace($fname, "\", "/")
        ;MsgBox(0, "File saved", $filter)
        $oSave = _ArrayCreate(_OOsetProp("FilterName", $filter))
        $odoc.storetourl($fname, $oSave)
    EndFunc   ;==>_OOStoreBook
    
    Func _OOSheetActivate($sheetnameornumber, $activeflag = 1) ;Tabellenname oder nummer zum schreiben/lesen aktivieren
        ;mit $activeflag=1 kommt die Tabelle in den Vordergrund
        ;mit $activeflag=0 wird die Tabelle verdeckt aktiviert z.B.um im Hintergrund Daten zu ändern
        $errormodul = "_OOSheetactivate"
        If IsString($sheetnameornumber) Then
            $activesheet = $odoc.sheets.getbyname($sheetnameornumber)
        Else
            $activesheet = $odoc.sheets.getbyindex($sheetnameornumber) ;index starts with 0
        EndIf
    
        If $activeflag = 1 Then
            $oSheet = $odoc.CurrentController.setActiveSheet($activesheet)
        EndIf
        $oSheet = $activesheet
    EndFunc   ;==>_OOSheetActivate
    
    Func _OOBookAddNewSheet($sheetname) ;erstellt neues Tabellenblatt mit dem Namen $sheetname
        $errormodul = "_OOAddNewsheet"
        $eSheets = $odoc.getSheets.createEnumeration
        $flag = 0
        While $eSheets.hasMoreElements ;abfrage, ob sheet schon existiert
            $oElement = $eSheets.nextElement()
            If $oElement = $sheetname Then $flag = 1 ;wenn ja, merken
        WEnd
        If $flag = 0 Then
            $Inst = $odoc.createInstance("com.sun.star.sheet.Spreadsheet")
            $odoc.Sheets.insertByName($sheetname, $Inst)
        EndIf
    EndFunc   ;==>_OOBookAddNewSheet
    
    Func _OOSheetGetCellValue($col, $row) ;Inhalt der Zelle bsp; "A3" oder F22
        $errormodul = "_OOSheetGetCellValue"
        If IsString($col) Then
            _OOAdress2Koord($col)
            $col = $cellkoord[0]
            $row = $cellkoord[1]
        EndIf
        $oCell = $oSheet.getCellByPosition($col, $row).value
        Return $oCell
    EndFunc   ;==>_OOSheetGetCellValue
    
    Func _OONumberOfSheets() ; Anzahl der Tabellenblätter
        $errormodul = "_OONumberofsheets"
        Return $odoc.getsheets.getcount
    EndFunc   ;==>_OONumberOfSheets
    
    Func _OOAdress2Koord($cellname) ;wandelt "C1" in $cellkoord[0]=2 und $cellkoord[1]=0
        $errormodul = "_OOAdress2Koord"
        Local $textchar[3]
        Local $numchar[3]
        $cellname = StringUpper($cellname)
        $numchar = StringRegExp($cellname, '\d+', 1) ;y-Koordinate der Zelle, findet Zahlen im Zellennamen;
        ;    msgbox (0,$cellname,$textchar[0]&" "&$numchar[0])
        $cellkoord[1] = $numchar[0] - 1
        $textchar = StringRegExp($cellname, '[[:alpha:]]{0,2}', 1) ;findet A oder AA im Zellennamen
        $x = (Asc(StringMid($textchar[0], 1, 1)) - 65) ;ascii erster Buchstabe
        If StringLen($textchar[0]) = 2 Then
            $x = (($x + 1) * 26) + (Asc(StringMid($textchar[0], 2, 1)) - 65)
        EndIf
        $cellkoord[0] = $x
        Return $cellkoord
    EndFunc   ;==>_OOAdress2Koord
    
    Func _OOKoordToAddress($row,$col) ;wandelt 2,3 in "C4"
        $x = Int($col / 26)
        $y = Mod($col, 26)
    
        If $x = 0 Then
            $char = Chr(64 + $y) ;A B C
        Else
            $char = Chr(64 + $x) & Chr(65 + $y) ; AA AB AC...
        EndIf
        Return $char & String($row + 1)
    EndFunc   ;==>_OOKoordToAddress
    
    Func _OONameOfActiveSheet()
        $errormodul = "_OONameofAvtiveSheet"
        Return $oSheet.name
    EndFunc   ;==>_OONameOfActiveSheet
    
    Func _OOSheetSetRowProperties($row, $height, $optheight = Default, $visible = Default, $newpage = Default) ;Eigenschaften der Zeile
        ; $optheight, $visible $newpage all     OO_true or OO_False
        $errormodul = "_OOSheetSetRowProperties"
        $orow = $oSheet.getRows().getByIndex($row)
        If IsNumber($height) Then $orow.Height = $height ;column height (in 100ths of mm)
        $orow.OptimalWidth = Number($optheight)
        $orow.IsVisible = Number($visible)
        $orow.IsStartOfNewPage = Number($newpage)
    EndFunc   ;==>_OOSheetSetRowProperties
    
    Func _OOSheetSetColProperties($col, $width, $optwidth = Default, $visible = Default, $newpage = Default) ;Eigenschaften Spalte
        ; $opt, $visible $newpage all OO_true or OO_False
        $errormodul = "_OOSheetSetColProperties"
        If IsString($col) Then
            $ocol = $oSheet.getColumns().getByName($col)
        Else
            $ocol = $oSheet.getColumns().getByIndex($col)
        EndIf
        $ocol.Width = $width ;column width (in 100ths of mm)
        $ocol.OptimalWidth = Number($optwidth)
        $ocol.IsVisible = Number($visible)
        $ocol.IsStartOfNewPage = Number($newpage)
    EndFunc   ;==>_OOSheetSetColProperties
    
    Func _OOSheetdeleteRow($startrow, $numberofrows = 1) ;Zeile löschen
        $errormodul = "_OOSheetDeleteRow"
        $oSheet.getrows.removeByIndex($startrow, $numberofrows)
    EndFunc   ;==>_OOSheetdeleteRow
    
    Func _OOSheetinsertRow($startrow, $numberofrows = 1) ;Zeile einfügen
        $errormodul = "_OOSheetInsertRow"
        $oSheet.getrows.insertbyindex($startrow, $numberofrows)
    EndFunc   ;==>_OOSheetinsertRow
    
    Func _OOSheetdeleteCol($startcol, $numberofcols = 1) ;Spalte löschen
        $errormodul = "_OOSheetDeleteCol"
        $oSheet.getcolumns.removeByIndex($startcol, $numberofcols)
    EndFunc   ;==>_OOSheetdeleteCol
    
    Func _OOSheetinsertCol($startcol, $numberofcols = 1) ;spalte einfügen
        $errormodul = "_OOSheetInsertCol"
        $oSheet.getcolumns.insertbyindex($startcol, $numberofcols)
    EndFunc   ;==>_OOSheetinsertCol
    
    Func _OOSheetGetCellType($row, $col) ;Rückgabe: Zellentyp: value, string, formula, empty
        $errormodul = "_OOSheetGetCellType"
        If IsString($row) Then
            $cell = _OOAdress2Koord($row)
            $row = $cell[0]
            $col = $cell[1]
        EndIf
        $oCell = $oSheet.getcellbyposition($row, $col)
        Select
            Case $oCell.type = 1
                $celltype = "VALUE"
            Case $oCell.type = 2
                $celltype = "STRING"
            Case $oCell.type = 3
                $celltype = "FORMULA"
            Case $oCell.type = 0
                $celltype = "EMPTY"
            Case Else
                $celltype = "UNKNOWN"
        EndSelect
        Return $celltype
    EndFunc   ;==>_OOSheetGetCellType
    
    Func _OOSheetMoveOrCopyRange($fromsheetnameornumber, $fromrange, $tosheetnameornumber, $tocell, $flag) ;$fromrange="B2:c4"  $tocell="F4" flag: 0=move, 1=copy
        $errormodul = "_OOSheetMoveOrCopyRange"
        If IsString($fromsheetnameornumber) Then
            $fromsheet = $odoc.sheets.getbyname($fromsheetnameornumber)
        Else
            $fromsheet = $odoc.sheets.getbyindex($fromsheetnameornumber) ;index starts with 0
        EndIf
        If IsString($tosheetnameornumber) Then
            $tosheet = $odoc.sheets.getbyname($tosheetnameornumber)
        Else
            $tosheet = $odoc.sheets.getbyindex($tosheetnameornumber) ;index starts with 0
        EndIf
        $oRangeOrg = $fromsheet.getCellRangeByName($fromrange).RangeAddress ; copy range
        $oCellCpy = $tosheet.getCellrangeByname($tocell).CellAddress ; insert position
        If $flag = 0 Then ;move
            $oSheet.MoveRange($oCellCpy, $oRangeOrg)
        Else
            $oSheet.CopyRange($oCellCpy, $oRangeOrg)
        EndIf
    EndFunc   ;==>_OOSheetMoveOrCopyRange
    
    Func _OOSheetSetCell($xkoord, $ykoord, $data, $ref = "string") ;$ref= angabe, ob "string" "value" "formula"
        $errormodul = "_OOSheetSetCell"
        If IsString($xkoord) Then
            $cell = _OOAdress2Koord($xkoord)
            $xkoord = $cell[0]
            $ykoord = $cell[1]
    
        EndIf
        $ref = StringUpper($ref)
        Select
            Case $ref = "STRING"
                $oCell = $oSheet.getCellByPosition($xkoord, $ykoord)
                $oCell.setString($data)
    
            Case $ref = "VALUE"
                $oCell = $oSheet.getCellByPosition($xkoord, $ykoord)
                $ret=vargettype($data)
                $oCell.setvalue($data)
    
            Case $ref = "FORMULA"
                $oCell = $oSheet.getCellByPosition($xkoord, $ykoord)
                $oCell.setformula($data)
            Case Else
                $oCell = $oSheet.getCellByPosition($xkoord, $ykoord)
                $oCell.setstring($data)
        EndSelect
    EndFunc   ;==>_OOSheetSetCell
    
    Func _OOCloseBook() ;Datei beenden
        $errormodul = "_OOCloseBook"
        $odoc.close(True)
    EndFunc   ;==>_OOCloseBook
    
    Func _OOSheetSetCellColor($col, $row, $front = Default, $back = Default) ;RRGGBB
        $errormodul = "_OOSheetSetCell"
        If IsString($col) Then
            $cell = _OOAdress2Koord($col)
            $col = $cell[0]
            $row = $cell[1]
        EndIf
        $oCell = $oSheet.getCellByPosition($col, $row)
        $oCell.CharColor = $front
        $oCell.CellBackColor = $back
    EndFunc   ;==>_OOSheetSetCellColor
    
    Func _OOSheetSetRowColor($row, $front = Default, $back = Default) ;RRGGBB
        $errormodul = "_OOSheetSetRowColor"
        $orow = $oSheet.getRows().getByIndex($row)
        $orow.CharColor = $front
        $orow.CellBackColor = $back
    EndFunc   ;==>_OOSheetSetRowColor
    
    Func _OOSheetSetColColor($col, $front = Default, $back = Default) ;RRGGBB
        $errormodul = "_OOSheetSetColColor"
        $ocol = $oSheet.getColumns().getByIndex($col)
        $ocol.CharColor = $front
        $ocol.CellBackColor = $back
    EndFunc   ;==>_OOSheetSetColColor
    
    Func _OOSheetRangeToArray($sheetnameornumber, $startcell, $endcell, $all = "ALL") ;gibt ein Array der Daten aus dem Bereich des Tabellenblatts
        $errormodul = "_OOSheetRangeToArray"
        If IsString($sheetnameornumber) Then
            $oSheet = $odoc.sheets.getbyname($sheetnameornumber)
        Else
            $oSheet = $odoc.sheets.getbyindex($sheetnameornumber) ;index starts with 0
        EndIf
    
        If StringUpper($all) = "ALL" Then ;used data of the whole sheet
            $oCursor = $oSheet.createCursor()
            $oCursor.GotoStartOfUsedArea(0) ;von der ersten ausgefüllten Zelle
            $start = $oCursor.getrangeaddress()
            $Start_row = $start.startRow
            $Start_col = $start.startColumn
            $oCursor.GotoEndOfUsedArea(1);bis zur letzten ausgefüllten Zelle
            $end = $oCursor.getrangeaddress()
            $end_row = $end.endRow
            $end_col = $end.endColumn
        Else
            If IsString($startcell) Then
                $cell = _OOAdress2Koord($startcell)
                $Start_row = $cell[1]
                $Start_col = $cell[0]
            EndIf
            If IsString($endcell) Then
                $cell = _OOAdress2Koord($endcell)
                $end_row = $cell[1]
                $end_col = $cell[0]
            EndIf
        EndIf
    
        $ooarray = $oSheet.getCellRangeByPosition($Start_col, $Start_row, $end_col, $end_row).getDataArray() ;verschachteltes array, in [0] ist die erste zeile, in [2] die 2. usw
    
        Dim $array[UBound($ooarray)][UBound($ooarray[0])]
        For $rows = 0 To UBound($ooarray) - 1
            $row = $ooarray[$rows]
            For $cols = 0 To UBound($row) - 1
                $array[$rows][$cols] = $row[$cols]
            Next
        Next
        Return $array
        ;ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $GetUsedRangeAddress = ' & $GetUsedRangeAddress & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    ;~   ; return $Range
    EndFunc   ;==>_OOSheetRangeToArray
    
    Func _OOSheetArrayToRange($sheetnameornumber, $cellname, $array) ;Array ins Tabellenblatt am Position cellname ("B4")
        $errormodul = "_OOSheetArrayToRange"
        If IsString($sheetnameornumber) Then
            $oSheet = $odoc.sheets.getbyname($sheetnameornumber) ;"Tabelle1"
        Else
            $oSheet = $odoc.sheets.getbyindex($sheetnameornumber) ;index starts with 0
        EndIf
        If IsString($cellname) Then
            $cell = _OOAdress2Koord($cellname)
            $row = $cell[1]
            $col = $cell[0]
        Else
            return seterror(1,0,0)
        EndIf
        $rangestring = $cellname & ":" & _OOKoordToAddress($row + UBound($array, 1) - 1, $col + UBound($array, 2)) ;calculate the cellname of the last arrayitem in the sheet
        ;build ooArray
        $dimensions = UBound($array, 0)
        If $dimensions > 2 Then Return SetError(1, 0, 0) ;nur maximal 2-dimensionale arrays
        If $dimensions = 1 Then ;eine zeile im Array wird zu einer spalte im sheet!!!
            Dim $ooarray[1]
            $ooarray[0] = $array
        Else
            Dim $ooarray[UBound($array, 1)] ;anzahl der Zeilen
            Dim $arows[UBound($array, 2)]     ;länge der zeilen
            For $row = 0 To UBound($array, 1) - 1 ;alle Zeilen abarbeiten
                For $col = 0 To UBound($array, 2) - 1 ;alle Spalteneinträge in dieser Zeile
                    $arows[$col] = $array[$row][$col] ;die Spalteneinträge als Reihe ins array
                Next
                $ooarray[$row] = $arows ;das array der gesamten Zeile in das ooarray an index $row
            Next
        EndIf
        $oRange = $oSheet.getCellRangeByName($rangestring)
        $oData = $oRange.setDataArray($ooarray)
     EndFunc   ;==>_OOSheetArrayToRange
    
     Func _ArrayCreate($v_0, $v_1 = 0, $v_2 = 0, $v_3 = 0, $v_4 = 0, $v_5 = 0, $v_6 = 0, $v_7 = 0, $v_8 = 0, $v_9 = 0, $v_10 = 0, $v_11 = 0, $v_12 = 0, $v_13 = 0, $v_14 = 0, $v_15 = 0, $v_16 = 0, $v_17 = 0, $v_18 = 0, $v_19 = 0, $v_20 = 0)
    Local $av_Array[21] = [$v_0, $v_1, $v_2, $v_3, $v_4, $v_5, $v_6, $v_7, $v_8, $v_9, $v_10, $v_11, $v_12, $v_13, $v_14, $v_15, $v_16, $v_17, $v_18, $v_19, $v_20]
    ReDim $av_Array[@NumParams]
    Return $av_Array
    EndFunc ;==>_ArrayCreate
    
    ; Das ist unser eigener Error-Handler
    Func _OOErrFunc() ;COM-Error-Handler
        $HexNumber = Hex($oMyError.number, 8)
        MsgBox(0, "COM-Error OpenOffice Script", "Ein COM-Fehler wurde abgefangen!" & @CRLF & _
                "Fehlernummer: " & $HexNumber & @CRLF & _
                "WinDescription: " & $oMyError.windescription & @CRLF & _
                "Error in Modul " & $errormodul)
        SetError(1)
    EndFunc   ;==>_OOErrFunc
    Alles anzeigen
  • Funktionssammlung OpenOffice Calc

    • Andy
    • 4. Februar 2019 um 13:08

    Hi,

    Zitat von C01

    Ich bekomme immer nur einen Text rein, also mit Hochkomma.

    Schreib man ein Minimalscript, um das nachvollziehen zu können

  • Funktionssammlung OpenOffice Calc

    • Andy
    • 3. Februar 2019 um 10:13

    Hi,

    habe im Startpost das Script als Download angehängt. Da ich das Script nicht neu formatiert und somit lesbar einfügen konnte, weil "...der Text mehr als 20.000 Zeichen hat...".

    Somit "nur" als Download.

    Btw., das Script ist jetzt seit 10 Jahren unverändert und funktioniert mit der neuesten Version sowohl von AutoIt als auch von OpenOffice einwandfrei. Fragt sich nur, wie lange noch....

  • StringRegExp

    • Andy
    • 14. Januar 2019 um 22:38

    naja, wenn man die Frage nicht richtig liest.....

    Zitat von donpascal

    Ich habe eine Variable die in Anführungszeichen steht. Also "34534".

    Jetzt will ich die Anführungszeichen löschen und nur den Wert dazwischen weiter verwenden.

    omfg...AutoIt rulez...

    Code
    $a="12345"
    msgbox(0,$a*3,int($a)*3)

    Je nachdem, was für ein Wert in der Variable steht, braucht man nur "casten"

  • StringRegExp

    • Andy
    • 14. Januar 2019 um 20:29

    ...ich werfe mal _StringBetween() in den Ring....

    Code
    #include <String.au3>
    $string = '"bla"'
    $ret = _StringBetween($string, '"','"')
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $ret = ' & $ret[0] & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console

    wobei ein Stringmid() bei bekanntem String ja noch einfacher wäre^^

  • Ein NewsDisplay mit AutoIt und Arduino

    • Andy
    • 14. Januar 2019 um 20:22

    Sehr nice!

    Da ich gerade den Arduino (UNO) andersweitig belege, und noch einige ATtiny85 und 45 rumliegen habe, ist mir direkt in den Sinn gekommen, den ATtiny85 zu benutzen. Auch dafür gibt es angepasste wire- und LCD-libraries!

    Da der ATtiny85 für unter ein Euro zu haben ist, halten sich die Kosten incl. LCD mit ca. 10€ im Rahmen^^

    Das LCD ist sowieso in jedem guten Arduino Einsteiger-Set dabei!

    //EDIT

    Sackzement....jetzt muss ich doch den Arduino beanspruchen, den benötige ich nämlich als ISP (Programmiermodul) für die ATtinys....:Face:

    Und übrigens ist es auch sehr einfach, das LCD mit einem ESP8266 anzusprechen, den kann man dann auch direkt übers WLAN betreiben.

    Es soll ja Leute geben, die nicht permanent ihr Smartphone mit sich rumschleppen und trotzdem per BEEP über Vorgänge auf ihrem PC (Maileingang, AutoIt-Scriptausführung, Katze hat beim Laufen über die Tastatur ne Waschmaschine bei Amazon bestellt, uswusf.) benachrichtigt werden wollen!

  • Alter neuer PC gesucht

    • Andy
    • 13. Januar 2019 um 21:18

    @Musashi,

    da hast du Glück, es ist die aktuelle Ausgabe 2/2019, Titel: "Die Lunte brennt" ab Seite 29. Entweder kaufst du dir das Heft im Geschäft und kannst dabei schon mal reinschauen, oder den Artikel gibt es online hier: https://shop.heise.de/katalog/die-lunte-brennt-1ee0de

    Ich würde allerdings das ganze Heft holen, da sind zu diesem Thema noch viele weitere Artikel drin, u.a. auch Linuxe als Alternative uvm.

  • Alter neuer PC gesucht

    • Andy
    • 13. Januar 2019 um 12:03

    Hi,

    Zitat von Musashi

    Wie verhält sich eigentlich Win7, wenn man es auf einem 'modernen' PC mit Win10 in der virtuellen Box laufen lässt ? Mit welchen Einschränkungen muss man ggf. leben ?

    Wie schon oben gesagt, die Hardwarevoraussetzungen für die Windows-Versionen seit Win7 (also auch 8, 8.1, 10) sind gleich geblieben.

    In einer VM gestaltet sich das alles noch viel geschmeidiger, denn da braucht man sich "keinen Kopf" machen. Genau dafür wurden die VM´s ja entwickelt, egal auf welchem Host einen x-beliebigen Client laufen lassen zu können.

    Was meinst du mit "Einschränkungen"?

    Bei einem vernünftig aufgesetzten System hast du keine Einschränkung. Jedenfalls als "Otto-Normal-PC-User". Da bin ich ganz im Gegenteil davon überzeugt, die allermeisten Anwender würden nicht mal merken, wenn ihr System in einer VM läuft!

    In den letzten c´t´s (hehe 2x Apostroph^^) wurde der Umzug vom bestehenden Win7 (der Support läuft im Januar 2010 wohl aus) auf Win10 thematisiert. Diese Lektüre kann ich nur empfehlen!

    Ich selbst sehe das SEHR entspannt, denn es gibt trotz der Warnungen von hochqualifizierten Sicherheitsexperten immer noch Millionen (!) einwandfrei laufende Systeme mit XP...

    Würden sich diese hochqualifizierten Sicherheitsexperten lieber mal drum kümmern, AKTUELLE Systeme "zuzunageln", anstatt sich über 15 Jahre alte Software zu mokieren, wäre die Zeit wesentlich besser investiert. Aber da ist wohl einiges mit der Bezeichnung "hochqualifiziert" im argen....

    Jedenfalls ist es kein Problem, beide Systeme (Win7 als Client in einer Win10-VM) "gleichzeitig" zu verwenden, bei meiner Tochter hatte ich das anfangs auf deren 2-Bildschschirm-Desktop so eingerichtet, dass Win10 auf dem einen Bildschirm lief und Win7 in einer VM (testweise mit abgeschaltetem Netzwerk/Internet) auf dem anderen. Mittlerweile hat sich die Nutzung von Win7 auf nahezu null eingespielt.

    Die von ihr dort verwendete Software läuft auch auf Win10 "nativ" und wurde dann auch dort installiert, und so hat der Umzug schleichend stattgefunden....

    Ich selbst habe noch einen Rechner mit XP am laufen, da hängen an den Schnittstellen noch einwandfrei funktionierende Geräte dran die ich ab und zu brauche und für die es keine Möglichkeiten für die Nutzung an einem modernen Rechner mit entsprechendem Betriebssystem gibt.

    Wenn du das mit "Einschränkungen" meinst, ja, das muss man dann einfach ausprobieren....aber XP und Win7 sind schon Welten auseinander.

    Und btw. "ausprobieren" kostet NICHTS! Versuch macht kluch, heißt es! Eine VM ist auch durch einen Laien schnell eingerichtet.

    Der imho riesengroße Vorteil eines Systems in einer VM ist der, ich kann damit einfachst "umziehen". Die VM ist nix weiter wie eine Datei, ab auf eine Festplatte damit, oder noch besser, wie bereits oben erwähnt "in die Cloud". Egal auf welchem Unterbau, den Client mounten, starten, fertig. Und da haben auch dann die Desktop-Linuxer ihre Existenzberechtigung, wenn der Frust mal wieder überhand nimmt, einfach in der VM mit einem "richtigen" System arbeiten:rofl:


    //EDIT

    Zitat von Tuxedo

    Ich hoffe ich werde nicht falsch verstanden, es geht mir nicht ums letzte Quentchen Leistung,

    aber falls ich doch eine richtige Grafikkarte verbauen müsste für meine Zwecke, dann wäre eine im Prozessor integrierte Grafik ja irgendwie

    blos eine Resourcenverschwendung.

    Für die 10 Euro mehr, die du für den Ryzen 2600 (mit GPU) bezahlst, lohnt die diskutiererei wirklich nicht!. Ich würde den kaufen!

    Die nächste, wirklich spürbar performantere Grafikkarte liegt dann im 50€-Bereich, die kannst du dann immer noch nachinstallieren. Aber so wie ich deine Anforderungen einschätze, wirst du mit dem 2600 sehr zufrieden sein!

    //EDIT2

    Hat auch den großen Vorteil, wenn wirklich mal die Grafikkarte kaputt gehen sollte, einfach auf die interne GPU wechseln und weiterarbeiten.

  • Warum langsam durch mehrere Prozesse ?

    • Andy
    • 12. Januar 2019 um 11:38

    Hi,

    Zitat von Larsson

    Wenn ich dieses Script als .exe starte, verbraucht es 3% der max. CPU-Auslastung.

    Zitat von Larsson

    Sobald ich aber das Script 2-3 mal öffne.....,

    Zitat von Larsson

    dann springt die CPU-Auslastung von jedem einzelnen Prozess auf 0-1%

    sagt wer?

    Ohne Angabe des verwendeten Systems (Prozessor), des Betriebssystem und dessen Einstellungen der ANZEIGE (!) dieser Daten ist nicht nur die Fragestellung, sondern auch jede Antwort obsolet.

    In deinem speziellen Fall noch besonders, da in einer "unendlich" schnellen Schleifenkonstruktion (While 1) der einzige limitierende Faktor ein endlich schneller Zugriffsprozess mit (Achtung!) GLEICHEM (und auch aus der Sicht eines Anwenders sehr schnellem) Zeitverlauf ist.

    Einfaches Beispiel:

    Der Refresh der Anzeige,also die Messdauer, in einem "Auslastungsanzeigetool" eines bestimmten Prozesses ist auf 1 Sekunde (1000 Millisekunden) eingestellt. Du fragst die "Auslastung" eines Prozesses1 ab, der 100 Millisekunden dauert. In diesen 100 Millisekunden läuft der Prozessor mit 100% Leistung. Es ergibt sich eine "Auslastung" des Prozessors mit diesem Vorgang von ...naja, da muss man kein Mathegenie sein, von 10%. Das Anzeigetool zeigt "Prozessorauslastung Prozess1 von 10%" an.

    Die gleiche Auslastung ermittelt das Tool, wenn innerhalb dieser einen Sekunde ein Prozess2 tausend(!) Mal mit einer Dauer von einer zehntel Millisekunde die volle Prozessorleistung beansprucht. "Prozessorauslastung Prozess2 von 10%".

    Prozess1: Messdauer 1000 Millisekunden, Prozessorauslastung Prozess1 von 1 Mal 100 Millisekunden > Anzeige Auslastung 10%.

    Prozess2: Messdauer 1000 Millisekunden, Prozessorauslastung Prozess2 von 1000 Mal 1/10 Millisekunden > Anzeige Auslastung 10%.

    Soweit so klar!

    Jetzt verkürzen wir den Anzeigerefresh (die Messdauer) auf eine halbe Sekunde. Was macht das Tool? Es misst die Zeit und die Prozessorauslastung und bildet das Verhältnis. In x Zeit y Prozessorlast.

    Für obige zwei Beispiele:

    Prozess1: Messdauer 500 Millisekunden, Prozessorauslastung Prozess1 von 1 Mal 100 Millisekunden > Anzeige Auslastung 20%.

    Prozess2: Messdauer 500 Millisekunden, Prozessorauslastung Prozess2 von 500 Mal 1/10 Millisekunden > Anzeige Auslastung 10%.

    ....

    Prozess1: Messdauer 200 Millisekunden, Prozessorauslastung Prozess1 von 1 Mal 100 Millisekunden > Anzeige Auslastung 50%.

    Prozess2: Messdauer 200 Millisekunden, Prozessorauslastung Prozess2 von 200 Mal 1/10 Millisekunden > Anzeige Auslastung 10%.

    ....

    Prozess1: Messdauer 100 Millisekunden, Prozessorauslastung Prozess1 von 1 Mal 100 Millisekunden > Anzeige Auslastung 100%.

    Prozess2: Messdauer 100 Millisekunden, Prozessorauslastung Prozess2 von 100 Mal 1/10 Millisekunden > Anzeige Auslastung 10%.

    ....

    Oha!

    Je nachem, welche die "Bedingungen" eingestellt sind, ergeben sich spektakulär erscheinende Unterschiede!

    Wenn also jemand von

    Zitat von Larsson

    verbraucht es 3% der max. CPU-Auslastung.

    spricht, und daraus folgert, dass die "Anzeige" für alle (!) möglichen Prozesse genau ist, dann irrt er sich gewaltig! Das Anzeigetool gibt nur SEHR grobe "Tendenzen" wieder.


    Neben den von misterspeed schon dargebrachten Erklärungen kommt noch hinzu, dass die im Startpost verwendete Funktion "FileExists()" natürlich NICHT bei jedem Aufruf das Verzeichnis auf dem Datenträger scannt!

    Wozu auch?! Das Betriebsystem lädt beim ersten (!) Aufruf dieser Funktion den Ordnerinhalt in den RAM, also den Speicher (caching) und stellt diese Daten dann sehr schnell, da aus dem Cache gelesen, zur Verfügung. Erst wenn sich der Ordnerinhalt ändert, wird der "Dateicache" gelöscht und neu aufgebaut. DAS dauert. Ein Zugriff auf eine Festplatte und auch eine SSD sind um ein Vielfaches langsamer als ein Speicherzugriff!

    Von daher ist bei "Geschwindigkeitsüberprüfungen" immer sicherzustellen, dass exakt die gleichen Bedingungen vorherrschen.

    Aber genau DAS ist bei den heutigen hochoptimierten Betriebssystemen und Prozessoren, die nebenbei auch natürlich versuchen, richtige "Vorhersagen" zu treffen und Daten schon "auf Vorrat" im RAM zu speichern (cachen), damit der User die Daten dann "schnell" aus dem Cache bereitgestellt bekommt, schlicht UNMÖGLICH!

    Wenn jetzt auch noch Multithreading/tasking Betriebssysteme und Multicoreprozessoren mit Hyperthreading ins Spiel kommen, ist es ganz aus....

    Da stellt sich dann die Frage nach einer "cleveren" Lösung!

    Und die sieht imho im Fall von Larsson ganz einfach aus.

    Frag nicht hunderte oder tausende Mal pro Sekunde die Existenz einer Datei ab, sondern lasse dich vom Betriebssystem einfach darüber informieren, wenn diese Datei erstellt/gelöscht/geändert wurde!(<das ist ein Link!)

    Nebenbei "rödelt" die Platte/SSD nicht permanent, sondern kann ggf. im Tiefschlaf energiesparend warten, und der Prozessor, der jetzt mit 3% Last permanent UNNÖTIGE Arbeit verrichten muss, auch!

  • Zeilenumbruch

    • Andy
    • 5. Januar 2019 um 11:47

    Weder noch...6, setzen!

    Guckt eigentlich jemand mal im 1. Post das Beispiel und das gewünschte Ergebnis an? Und lässt anhand dessen seinen Code durchlaufen? Da sind definitiv LEERE ZEILEN drin, also mehrfach auftretende CRLF...:Face:

    Und die sollen mit EINEM (!) Leerzeichen ersetzt werden. Und das mit dem amp...."übersehen"? Alle?

    Ich hab für das neue Jahr an meine Mitarbeite die Direktive rausgegeben "Wir müssen besser werden, und NICHT schneller!"

    Ich hoffe, dass sich das einige zu Herzen nehmen, ein falsches Ergebnis bleibt falsch, egal in welchem kurzen Zeitraum es ermittelt wurde, und nicht selbst geprüfte falsche Ergebnisse sind doppelt ärgerlich, da damit wieder andere gezwungen sind, sich mit dem Thema zu beschäftigen.

    yoschga, das sollte funktionieren,

    C
    $sSource = "??The One and Only??" & @CRLF & @CRLF & "FREICLUBEMPFEHLUNG 2013 &amp; 2014" & @CRLF & @CRLF & "Mein Motto"
    ConsoleWrite("> Vorher  : " & @CRLF & $sSource & @CRLF)
    $sNewStr = StringRegExpReplace($sSource, "\R+", " ")
    $sNewStr = StringReplace($sNewStr, "&amp;", "@@@WCF_LITERAL_AMP@@@") ;wenn du lieber das &-Zeichen haben möchtest, hier ist der Platz dafür
    ConsoleWrite("> Nachher : " & @CRLF & $sNewStr & @CRLF)


    wenn du weitere HTML-Tags bzw. Sonderzeichen wie das "&amp;" in & ersetzen willst/musst, geht das über eine Funktion so

    C
    Global $oMyError = ObjEvent("AutoIt.Error", "COMError")
    ;InetGet("http://blablub.com/?s=", @ScriptDir & "\html.html")  ;hier ggf deine Website eintragen
    ;$sSource = FileRead(@ScriptDir & "\html.html")
    $sSource = "??The One and Only??" & @CRLF & @CRLF & "FREICLUBEMPFEHLUNG 2013 &amp; 2014" & @CRLF & @CRLF & "Mein Motto"
    $sPlainText = _HTML_StripTags($sSource)
    ConsoleWrite($sPlainText & @CRLF)
    
    
    Func _HTML_StripTags($sHTML)
        If Not StringStripWS($sHTML, 8) Then Return SetError(1, 0, "")
        Local $oHTML = ObjCreate("HTMLFILE")
        If @error Then Return SetError(2, 0, "")
        $oHTML.Open()
        $oHTML.Write($sHTML)
        If Not $oHTML.Body.InnerText Then Return SetError(3, 0, "")
        Return SetError(0, 0, $oHTML.Body.InnerText)
    EndFunc   ;==>_HTML_StripTags
    
    Func COMError()
        MsgBox(16, "AutoItCOM Test", "We intercepted a COM Error !" & @CRLF & @CRLF & _
                "err.description is: " & @TAB & $oMyError.description & @CRLF & _
                "err.windescription:" & @TAB & $oMyError.windescription & @CRLF & _
                "err.number is: " & @TAB & Hex($oMyError.number, 8) & @CRLF & _
                "err.lastdllerror is: " & @TAB & $oMyError.lastdllerror & @CRLF & _
                "err.scriptline is: " & @TAB & $oMyError.scriptline & @CRLF & _
                "err.source is: " & @TAB & $oMyError.source & @CRLF & _
                "err.helpfile is: " & @TAB & $oMyError.helpfile & @CRLF & _
                "err.helpcontext is: " & @TAB & $oMyError.helpcontext _
                )
        SetError(1)
    EndFunc   ;==>COMError
    Alles anzeigen
  • Alter neuer PC gesucht

    • Andy
    • 2. Januar 2019 um 21:43

    Um da jetzt mal voll ins OT abzudriften...:party:

    Zitat von Moombas

    Nie wieder einen fertig PC bei dem man nicht mal den RAM nachrüsten kann oder eine Festplatte (von den anderen bereits genannten Punkten mal abgesehen) weil einfach keine freien Steckplätze existieren.

    Ich kann auch einen fertigen PC kaufen, der noch Steckplätze frei hat;)

    Zitat von Moombas

    aber man weiß was man hat und (normalerweise) das die Komponenten miteinander Harmonieren

    genau DAS weißt du "vorher" eben NICHT! Außer du hast dich bzgl. dieser, und genau eben DIESER (!) funktionierenden Kombination der Bauteile informiert.

    Als langjähriger "Betreuer" diverser Schrauber (was daher kommt, dass ich selbst sehr oft geschraubt habe:rofl:) kann ich dir sagen, der Teufel liegt im Detail. Mal "eben schnell" das "müsste eigentlich passen" RAM dazustecken, oder gar ein "warum soll das nicht funktionieren"-Austauschboard montieren, bei dem die Kanäle 5+6 der SATA-Ports kein AHCI sondern nur den IDE-Modus "verstehen" und somit nicht von der dort angeschlossenen SSD booten können, geht schief. Das Elend zieht sich von den für das Frontpanel vorgesehenen Audiosteckern auf dem Mainboard, die, wenn beschaltet, die Audioausgänge auf der Boardrückseite abschalten, bis zu Grafikkarten, die ums verrecken nicht auf DIESEM EINEN BOARD zum laufen zu bekommen waren. Zwei andere, baugleiche Graka, aber schon. Besagte Grafikkarte war aber auch im "baugleichen" Ersatzboard problemlos in Betrieb zu nehmen....:theke:

    Über "plötzlich" gestorbene USB-Buchsen (nachher auch ganze diverse Mainboards) die infolge fehlerhafter Montage nicht kurzschlussfest waren, könnte ich Bücher schreiben, direkt gefolgt von "Wärmeleitpastensupergaus". Seit ich die Stunde "Fehlersuche" mit 150€ netto (natürlich mit offizieller Rechnung plus Märchensteuer) angeboten hatte (auch bei den allerbesten Freunden (!) ), haben sich die "...du musst mal unbedingt gucken, da funktioniert was nicht ABER ICH HAB NIXXXXX GEMACHT, ALDA, ISCH SCHWÖR!!!!""-Anrufe erledigt. Voila.

    Kurzschlüsse sind überhaupt so ein Fall. Da ja mittlerweile "jeder" qualifiziert ist, so zwischendurch mal am/im PC rumschrauben kann (sic), und das auch tut, muss man sich wundern, wenn die Leute sich nicht selbst umbringen. Eines dieser Zuckerstückchen hatte ich mal, als sich ein "Schrauberkumpel" aus der Schule meines Sohnes bei mir meldete, weil desssen Hochleistungs-Gamer-3000€+-Kiste nichts mehr tat. Es folgte auf meine übliche Frage "Was hast du als letztes gemacht?" die übliche Antwort: "NIX!"

    Weil Schrauberkiddies Papa auch noch ein Freund meiner Schwiegereltern ist, "musste" ich anrücken.

    Die Vorgeschichte ist schnell erzählt, Kiddie "braucht unbedingt" eine Zockerkiste, der betuchte Papa zahlt alle Teile, Kiddie "baut natürlich" selbst zusammen und flutet die unterschiedlichsten Versandhändler mit Exklusivbestellungen. Bis die alle geliefert waren, waren schon mal drei Wochen rum. Zwei weitere Wochen, weil Kiddie auf das zweite Exklusiv-OC-Mainboard warten musste, beim ersten wurde der Prozessorsteckplatz mit Wärmeleitpaste geflutet, Board zurückgeschickt "auf Garantie". Schrauberkiddies Papa diskutiert mit dem Versandhändler über die in Rechnung gestellten 400€ für das "Garantieboard" , natürlich erfolglos. Papa zahlt zähneknirschend die 400€ und verlangt vom Sohnemann, dass er sich erst mal auf Youtube ein Video angucken soll, wie man Wärmeleitpaste "richtig" aufträgt....:Face:

    Kiddie und gefühlt 8 andere "Spezialisten" aus Schrauberkiddies qualifiziertem Umfeld "basteln" also den GamerPC zusammen und fangen sofort mit Overclocking an, dafür ist das Ding schließlich da! Nach einigen weiteren Wochen treffe ich Schrauberkiddies Papa beim Grillfest der Schwiegereltern, worauf der mich direkt von der Seite anlabert, "..du kennst dich doch aus, der Rechner von meinem Sohn läuft nicht, woran kann denn das liegen, der installiert 3x am Tag Windows GANZ NEU, und bis da alle Treiber runtergeladen sind (180MB nur für die Grakatreiber omfg) blockiert der unser ganzes Internet...."

    Naja, ich bin ja nicht so, und schau am nächsten Abend dort vorbei, Schrauberkiddies Kellerraum liegt voller Verpackungen und inmitten des Chaos steht ein Rechner ohne Gehäuseseitenteile und sieht aus WIE DIE SAU. Die Frage nach Kabelbindern hab ich mir verkniffen, und auch was nicht funktioniert wollte ich NICHT wissen, Rechner angemacht, alle Lüfter heulen volles Rohr, booten in Endlosschleife.

    Neustart, F8, BIOS-RESET, Lüfter leise, Windows bootet.

    Schrauberkiddies Papa schaut wie die Uhus beim Transatlantikflug, und haut mir anschließend begeistert auf die Schulter. Ich installiere Schrauberkiddies Ballerspiel und zeige Schrauberpapa, dass Kiddie mit durchgehend 80 FPS zocken kann. Schrauberkiddie nölt los, dass mit Overclocking "locker" 120FPS machbar seien, auf meine Frage was ihm das beim Zocken bringt, totale Verständnislosigkeit. Vater und Sohn unisono:"...aber mehr ist doch immer besser!!!":Face:

    Hab noch schnell ein System-Image auf eine USB-Platte gezogen mit Installationsanleitung, falls "der Rechner wieder mal unvermittelt nicht startet". Die 2 Terabyte Pornosammlung, die ich dafür beim Formatieren ans NUL-Device schicken musste, hab ich bei Schrauberkiddies Papa natürlich nicht erwähnt, Kiddie war aber etwas angesäuert, hat aber keinen Ton gesagt außer einem gepressten "ALDAAAA...":rofl:

    Jedenfalls hatte ich ca. 1/2 Jahr nichts mehr von diesen "Selbstschraubern" gehört, bis besagter "Notfall" eintrat.

    Sodele, zurück zum Anfang8)

    Schrauberkiddies Antwort "NIX!" auf meine Frage "Was hast du als letztes gemacht?" löst bei mir mittlerweile nicht mal mehr Emotionen aus, den Zuschlagreflex hab ich mir abtrainiert.:rock:

    Ich fahr hin, stürze mich in das Chaotenzimmer und schalte den Rechner an, der nichtmal zuckt. Ich tippe auf defektes Netzteil worauf Schrauberkiddie mit "..Alda, das kann nicht sein, das hält tausend Watt aus.." kontert. Touche.

    Ich ans Auto und Multimeter geholt, Schrauberkiddies Papa guckt schon wieder ganz komisch, ich weiß nicht was mich reitet, aber ich schalte den PC ein, und messe vom Gehäuse auf den vermeintlichen Schutzleiter der Steckdose, 12V. Aha.

    Ich mach das Gehäuse auf und guck nicht schlecht, der Lüfter läuft gaaaaaanz langsam und eine LED von einer der Platten leuchtet gaaaanz schwach. Hmmmm....

    Ich guck mich um und sehe eine Verpackung von einer Festplatte. Auf meine Frage "Neue Platte installiert?", folgt ein "Yo, gestern! Ging spielend!". Aha.

    Auf meine nächste Frage "...und seitdem läuft der Rechner nicht mehr?" folgt Schrauberkiddies Papas (!!!) Antwort: "Daran kanns nicht liegen, ich war dabei, das ist wirklich supereasy! Platte in den Laufwerkschacht schrauben, Kabel dran, fettich!!!"

    Ich mach den Rechner aus, zieh versuchsweise die Kabel von der "neuen" Platte ab und merke dabei, dass das Kabel ganz schön kurz ist.

    "Jaja, das Gefummel hatten wir gestern auch, wir mussten die Platte in einen anderen Schacht schrauben, weil das Kabel so kurz ist...". Aha. Schrauben ist also das Stichwort. Auf den zweiten näheren Blick entdecke ich die fehlende Schraube am Laufwerkkäfig. "Da fehlt ja ne Schraube!"

    "Ach ja, die ist gestern runtergefallen..." "Wohin?" "Irgendwo mitten rein, wir haben dann das Gehäuse geschüttelt, es hat geklappert, und auf einmal war es still, die ist bestimmt rausgefallen!"

    Aha, bestimmt rausgefallen.

    "Habt ihr die Schraube gefunden?"

    Papakiddie schaut mich entgeistert an, "IN DEM SAUSTALL HIER, MACHST DU WITZE?"

    Ich mach das Netzteil stromlos und baue es vorsichtig aus, wenn die Schraube im Netzteil liegt und einen fetten 4700µF Elko kurzschließt, dann gute Nacht.

    Nach Demontage sämtlicher Komponenten und einem überzeugenden "...wir haben es doch gesagt, es liegt nicht an der Schraube..."-Gesabbel liegt das Board nackt im Rechner vor mir, ich messe vom Gehäuse auf den 12V Netzteilanschluß auf dem Board und habe einen Kriechstrom. Aha.

    Einfache Diagnose meinerseits "Board kaputt!"

    Schrauberkiddies Papa ringt nach Luft, 3x im halben Jahr 400€ für bissl Zocken....

    Weil ich grade den Schraubenzieher in der Hand habe, löse ich die Montageschrauben vom Board, und tadaaaa, es klappert kurz und ein kleines Festplattenbefestigungs-Schräubchen (omfg) rutscht unter dem Board raus.

    Das hatte sich wohl bei dem Geschüttel des Rechners zwischen Boardrückseite und Rechnerrückwand geklemmt, bei einer mehrlagigen Platine ist das "suboptimal". Es gab wohl einen Kurzschluß auf dem Board über das Gehäuse mit anschließendem "Grillfest" der Leiterbahnen.

    Wieso aber nicht die Sicherung/FI geflogen ist, hat mich dann doch interessiert. Auf Nachfrage, wer denn Schrauberkiddies Kellerdomizil verkabelt hatte kam dann von Schrauberkiddies Papa: "Der XXXX hat das gemacht vor einigen Jahren, den kennst du auch, der renoviert im ganzen Bekanntenkreis und schuldete uns noch einen Gefallen, ich musste nur das Material bezahlen *stolzguck*"

    Ja, ich kenne den XXXX, der ist auch einer der großen "Spezialisten", die alles können! In Ermangelung von Ahnung die Gesellenprüfung 1972 als Elektriker gerade so geschafft und 1975 "zur Post gegangen", bis heute nix dazugelernt brüstet sich überall damit, der King vom "klassisch Nullen" zu sein. Spart ja auch Geld. Den in den "neuen" Kabeln vorhandenen Nulleiter muss man ja nicht benutzen, und man kann sich auch den "teuren" FI für ein "Kinderzimmer" sparen, der funktioniert bei klassischer Nullung sowieso nicht....:theke:

    Wenn dann aber infolge Falschverkabelung oder Kurzschluß die vollen 230V auf einem Gehäuse liegen und/oder die Bude abbrennt, hört der Spaß entgültig auf.

    Denn eins ist sicher, wenn der Staatsanwalt anfängt , Fragen zu stellen, kommt von den "Spezialisten" wie aus der Pistole geschossen:"Iiiiich? Ich hab NIX gemacht, würde ich auch NIE tun, da hab ich ja gar keine Ahnung von!"

    Mein Fazit: Ich jedenfalls habe den Support und die "Hilfe" im Bereich PC (auch bei Software!) im Bekanntenkreis komplett eingestellt. Und ich rate jedem nur, die Finger von Sachen zu lassen, von denen er keine Ahnung oder noch schlimmer, gefährliches Halbwissen, hat!

    Und noch eins::rtfm:und zwar ALLE, die zu diesem Thema greifbar sind!

    In diesem Sinne, Frohes Neues Jahr!8o

    Btw. eben in der neuen c´t gelesen, "cloud-computing" ist mittlerweile so billig, schnell und einfach, dass man sich in Zukunft gar keinen "richtigen" PC mehr anschaffen muss, ein billig Smartphone/Tablet/NUC reichen völlig aus. und da sag noch einer, früher war alles besser!:klatschen:

  • Alter neuer PC gesucht

    • Andy
    • 31. Dezember 2018 um 19:41
    Zitat von mep

    Die Foren laufen ja vorallem deswegen über da jeder meint er kann es besser, oder seine gesuchte Kombi ist nicht dabei, etc...

    Naja, die Foren laufen deswegen über, weil propagiert wird, dass "selber bauen" unglaublich viel Geld spart. Wobei auffällig ist, dass gerade die erfolgreichen und "guten" Selberbauer alles andere als Billiggedöns einkaufen. Da ist völlig normal, Equipment für 2000+@ auf dem Schreibtisch liegen zu haben.

    Es gibt im "normalo"-Segment keinen Grund mehr, selbst zu bauen. Ich kann mir ein mit meinen ausgesuchten Komponenten funktionierendes System mit Garantie und allem Schnickschnack zusammenbauen und am nächsten Tag liefern lassen, und das für einen Mehrpreis, der 1-2 Stunden Zeitungsaustragen entspricht.

    Ich hätte absolut kein Problem mit den "Selberbauern", wenn diese fluchend und kotzend daheim so lange Teile tauschen und BS installieren, bis deren extravagante (?) Wünsche erfüllt sind.

    Genau diese "Selberbauer" kaufen fertig Smartphones und Tablets und Entertainmentequipment und schicken selbiges postwendend zurück, sobald auch nur ansatzweise Funktionen nicht erfüllt sind. Konsequenz? Pfff....Aber stunden-tage-wochenlang als PC-Experte Hardware zusammenbasteln.....

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™