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. autoBert

Beiträge von autoBert

  • [TCP] Eigener Server - Recv="", obwohl eindeutig aufgerufen - Cach?

    • autoBert
    • 18. Dezember 2010 um 00:12

    Dann mach ein kleines Beispielskript, wo der Fehler auch auftritt,

    mfg autoBert

  • Fehler?

    • autoBert
    • 18. Dezember 2010 um 00:08
    Zitat von SlinJD

    Also,normal müsste ja wenn man z.b. http://www.google.de eingibt,die Meldung kommen: Diese Webseite enthält möglicher Weise illegalen Content!

    Diese kommt aber nicht! :S


    Bei Google.de kommt zwar je nach Schabfage viel Müll, aber mein IE warnt mich auch nicht davor.
    Aber was hat das mit der fehledenen Fehlerbeschreibung zu tun,

    mfg autoBert

  • String in einer Chat.log Datei auslesen

    • autoBert
    • 17. Dezember 2010 um 23:58

    Hallo Vamp,

    Zitat

    Erfolg: Gibt die Position des Unterstrings zurück

    Quelle Hilfe zu StrInStrwenn du das File in Array einliest und jede Zeile einzeln durchsuchst, kannst du dir ja auuch den Schleifenzähler merken. Ansonsten, die Position - grösstmögliche Zeilenlänge, darauf achten dass Egebnis grösser 0 ist sonst 1 als Startposition vewenden,

    mfg autoBert

  • Fehler?

    • autoBert
    • 17. Dezember 2010 um 23:49
    Zitat von SlinJD

    Weiss einer den Fehler? ?(

    Zitat von SlinJD

    Und jetzt mal das Forum fragen,schlimm? Nein.

    wirklich nicht, du solltest nur auch uns den Fehler bechreiben, das Skipt sieht in Ordnung aus, lässt sich ohne Fehlermeldung starten und beenden,

    mfg autoBert

  • Flash Intro & AutoIT3

    • autoBert
    • 17. Dezember 2010 um 23:17

    Hallo HPU,

    Leider immer noch:
    C:\Programme\AutoIt3\Examples\Tests\HPU\
    C:\Programme\AutoIt3\Examples\Tests\HPU\Intro_versuch.exe ist keine zulässige Win32-Anwendung.

    Zitat von ineedhelp

    Davon gehe ich doch aus. Wäre schlimm, wenn nicht!

    wie du siehst it es aber so,

    mfg auztoBert

  • GUICtrlSetImage Problem

    • autoBert
    • 17. Dezember 2010 um 22:56

    Hallo Molaynox,

    hier eines meiner Beispiel-Skripte etwa abgeändert:

    Spoiler anzeigen
    [autoit]

    #cs -----------------------------------------------------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    AutoIt Version: 3.3.6.1
    Author: AutoBert: http://www.autoit.de/index.php?page=Thread&threadID=21667

    [/autoit] [autoit][/autoit] [autoit]

    Skriptbeispiel für den Umgang mit FileOpenDialog, GUICtrlCreateListView, GUICtrlCreateListViewItem,
    GUIRegisterMsg speziell für das Event $GUI_EVENT_DROPPED 347
    #ce -------------------------------------------------------------------------------------------------------------------------
    #include <ListViewConstants.au3>
    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <GuiListView.au3>
    #include <File.au3>
    #include <array.au3>
    #include <GDIPlus.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Opt('MustDeclareVars', 1)

    [/autoit] [autoit][/autoit] [autoit]

    Global $msg, $message, $var, $aFiles, $idfrmMain, $sSourcePath, $aItem
    Global $szDrive, $szDir, $szFName, $szExt, $hPic = -99
    Global $aDropFiles[1], $WM_DROPFILES = 0x233

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $idfrmMain = GUICreate("BMP-, GIF- & JPG-Viewer", 824, 550, -1, -1, -1, $WS_EX_ACCEPTFILES)
    Local $idfilemenu = GUICtrlCreateMenu("&Datei")
    Local $idfileitem = GUICtrlCreateMenuItem("Öffnen", $idfilemenu)
    GUICtrlSetState(-1, $GUI_DEFBUTTON)
    Local $idexititem = GUICtrlCreateMenuItem("Beenden", $idfilemenu)
    Local $idLV_Files = GUICtrlCreateListView("Name: |Pfad", 519, 5, 300, 490, BitOR($LVS_SHOWSELALWAYS, $LVS_REPORT))
    GUICtrlSetState(-1, $GUI_DROPACCEPTED)
    Local $idbtnShow = GUICtrlCreateButton("&Zeige Bild", 519, 500, 140, 25)
    Local $idClearLV = GUICtrlCreateButton("&Listview &leeren", 669, 500, 140, 25)
    GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
    GUIRegisterMsg($WM_DROPFILES, "WM_DROPFILES_FUNC")
    GUISetState()
    While 1
    $msg = GUIGetMsg()
    Switch $msg
    Case $GUI_EVENT_DROPPED
    _FilesDropped()
    Case $idfileitem

    [/autoit] [autoit][/autoit] [autoit]

    $message = "Um mehrere Dateien auszuwählen, ist die Strg-Taste oder die Shift-Taste zu drücken."

    [/autoit] [autoit][/autoit] [autoit]

    $var = FileOpenDialog($message, @MyDocumentsDir & "", "Bilder (*.jpg;*.bmp)", 1 + 4)
    If @error Then
    MsgBox(4096, "", "Keine Datei(en) ausgewählt")
    Else
    _GUICtrlListView_BeginUpdate($idLV_Files)
    $aFiles = StringSplit($var, "|")
    If $aFiles[0] > 1 Then ;trifft nur bei Mehrfachauwal zu
    ;$aFiles[0] enthält Anzahl der Strings
    ;$aFiles[1] enthält den Pfad für alle ausgewählten Bilder
    ;$aFiles[2] enthält 1. Bild
    ;$aFiles[n+1] enthält n. Bild

    [/autoit] [autoit][/autoit] [autoit]

    ;Rückgabe des Fileopenialogs in einzzenlne Strings für Array splitten
    ;_ArrayDisplay($aFiles) ;Array anzeigen nur zu Verständnisuwecken evtl. aktivieren

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 2 To $aFiles[0]
    GUICtrlCreateListViewItem($aFiles[$i] & "|" & $aFiles[1], $idLV_Files)
    Next
    Else ;nur eine Datei ausgewählt
    ConsoleWrite($aFiles[1] & @CRLF)
    _PathSplit($aFiles[1], $szDrive, $szDir, $szFName, $szExt)
    GUICtrlCreateListViewItem($szFName & $szExt & "|" & $szDrive & $szDir, $idLV_Files)
    EndIf
    _GUICtrlListView_SetColumnWidth($idLV_Files, 0, $LVSCW_AUTOSIZE)
    ;setzt die 1 Spalte auf die benötigte Breite des längsten Eintrags
    _GUICtrlListView_SetColumnWidth($idLV_Files, 1, 0) ;zweite Spalte versteckt
    _GUICtrlListView_EndUpdate($idLV_Files)
    EndIf
    Case $idClearLV
    _GUICtrlListView_DeleteAllItems($idLV_Files)
    Case $idbtnShow
    $aItem = _GUICtrlListView_GetItemTextArray($idLV_Files)
    _ShowPic($aItem)
    Case $GUI_EVENT_CLOSE, $idexititem
    Exit
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _ShowPic($aItem)
    Local $sImageName = $aItem[2] & "\" & $aItem[1]
    ;$aItem[0] enthält Anzahl der Spalten [$aIem[1] die 1. Spalte usw.
    ;_ArrayDisplay($aItem) nur zu Verständnisuwecken evtl. aktivieren
    ConsoleWrite("Pfad zur Datei:" & $aItem[2] & "\" & $aItem[1] & @CRLF) ;nur zu Verständnisuwecken evtl. deaktivieren
    _GDIPlus_Startup()
    Local $hImage = _GDIPlus_ImageLoadFromFile($sImageName)
    Local $iX = _GDIPlus_ImageGetWidth($hImage)
    Local $iY = _GDIPlus_ImageGetHeight($hImage)
    _GDIPlus_ImageDispose($hImage)
    _GDIPlus_Shutdown()
    Local $iRatio = $iX / $iY
    ConsoleWrite("Orig.: " & $iX & " " & $iY & " " & $iRatio & @CRLF)
    If $iRatio >= 1 Then
    $iX = 500
    $iY = $iX / $iRatio
    Else
    $iY = 300
    $iX = $iY * $iRatio
    EndIf
    ConsoleWrite("Neu: " & $iX & " " & $iY & " " & $iRatio & @CRLF)
    If $hPic <> -99 Then
    GUICtrlSetImage($hPic,$sImageName)
    ControlMove($idfileitem,"",$hPic,5,5,$iX,$iY)
    Else
    $hPic = GUICtrlCreatePic($sImageName, 5, 5, $iX, $iY)
    EndIf
    EndFunc ;==>_ShowPic

    [/autoit] [autoit][/autoit] [autoit]

    #region ;Drag and Drop und Doppelklick
    Func WM_DROPFILES_FUNC($hWnd, $msgID, $wParam, $lParam)
    ConsoleWrite("WM_DropFiles_Func " & @CRLF)
    Local $nSize, $pFileName
    Local $nAmt = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", 0xFFFFFFFF, "ptr", 0, "int", 255)
    For $i = 0 To $nAmt[0] - 1
    $nSize = DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", 0, "int", 0)
    $nSize = $nSize[0] + 1
    $pFileName = DllStructCreate("char[" & $nSize & "]")
    DllCall("shell32.dll", "int", "DragQueryFile", "hwnd", $wParam, "int", $i, "ptr", DllStructGetPtr($pFileName), "int", $nSize)
    ReDim $aDropFiles[$i + 1]
    $aDropFiles[$i] = DllStructGetData($pFileName, 1)
    $pFileName = 0
    Next
    EndFunc ;==>WM_DROPFILES_FUNC

    [/autoit] [autoit][/autoit] [autoit]

    Func _FilesDropped()
    ConsoleWrite("Bin da " & @CRLF)
    Local $szDrive, $szDir, $szFName, $szExt, $split
    _GUICtrlListView_BeginUpdate($idLV_Files)
    For $i = 0 To UBound($aDropFiles) - 1
    $split = _PathSplit($aDropFiles[$i], $szDrive, $szDir, $szFName, $szExt)
    $szExt = StringUpper($szExt)
    ;;consolewrite($aDropFiles[$i] & ", " & $szExt & @CRLF)
    Switch $szExt
    Case ".JPG", ".BMP", ".GIF"
    GUICtrlCreateListViewItem($szFName & $szExt & "|" & $szDrive & $szDir, $idLV_Files)
    EndSwitch
    Next
    _GUICtrlListView_SetColumnWidth($idLV_Files, 0, $LVSCW_AUTOSIZE)
    ;setzt die 1 Spalte auf die benötigte Breite des längsten Eintrags
    _GUICtrlListView_SetColumnWidth($idLV_Files, 1, 0) ;zweite Spalte versteckt
    _GUICtrlListView_EndUpdate($idLV_Files)
    EndFunc ;==>_FilesDropped

    [/autoit] [autoit][/autoit] [autoit]

    Func WM_NOTIFY($hWnd, $msgID, $wParam, $lParam)
    Local $tagNMHDR, $event, $hwndFrom, $code, $aItem
    $tagNMHDR = DllStructCreate("int;int;int", $lParam)
    If @error Then Return 0
    $code = DllStructGetData($tagNMHDR, 3)
    If $wParam = $idLV_Files And $code = -3 And _GUICtrlListView_GetSelectedCount($idLV_Files) > 0 Then
    $aItem = _GUICtrlListView_GetItemTextArray($idLV_Files)
    ;;consolewrite($aItem[1] & ", " & $aItem[3] & @CRLF)
    _ShowPic($aItem)
    EndIf
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_NOTIFY
    #endregion ;Drag and Drop und Doppelklick

    [/autoit]

    Die Func _ShowPic ist der fü dich intereante Teil,

    mfg autoBert

  • mehrdimensionalen array vergleichen

    • autoBert
    • 17. Dezember 2010 um 20:56
    Zitat von zombie36

    und das für beliebig viele arrays mit 3 - 6 elementen

    nochmals

    [autoit]

    UBound

    [/autoit]

    löst dieses Problem

    Zitat von zombie36

    0 für nichts, 1 für ein paar, 2 für 2 paare, [...] 9 für royal flush

    schön, wenn du

    [autoit]

    _ArraySort,1($array,

    [/autoit]

    einsetzt ist zumidest hiefür der grösste Wert an 1, Stelle. Wenn du jetzt die Wertigkeiten für die anderen "Spalten" auch aufsteigend definiersr und links mit 0 auf 2 Stellig auffüllst ist das ganze Array abteigend richtig sortiert.
    Stell einfach einmal ein paar Arrays ein, dann zeige ich dir an einem Skript-Beispiel wie ich das meine,

    mfg autoBert

  • Skalierbarer GUI, Flash einfrieren und Lautstärke.

    • autoBert
    • 17. Dezember 2010 um 20:18

    Flash-Onjecte lassen ich afaik nicht resizen,

    mfg autoBert

  • mehrdimensionalen array vergleichen

    • autoBert
    • 17. Dezember 2010 um 20:07
    Zitat von zombie36

    da weder spielerzahl noch die elemente der 2. dimension konstant sind

    Schau dir dazu

    [autoit]

    UBound

    [/autoit]

    an.
    Wenn du in die 2. Dimension als kommagetrennten String speicherst und Wete die 2-stellig ein können (im Falle von nur einer Stelle) vorne mit 0 aufüllst, kannst du mit

    [autoit]

    _Arraysort

    [/autoit]

    sortieren. Da ich die Pokerrgeln nicht kenne musst du diese Annahme testweise prüfen. Evtl. ist auch die Definition der Wertigkeiten anzupassen 1 ist am schlechtesten 99 am beten,

    mfg autoBert

  • newbie AUTOIT: Bestimmte Dateitypen inkl. Unterverzeichnisse kopieren

    • autoBert
    • 17. Dezember 2010 um 16:35

    Hallo ,

    herzlich willkommen im Forum und viel Spass mit AutoIt.

    Hier kannst du dir die Hilfe herunterladen.
    Hier gibt es ein AutoIt-Tutorial: http://wiki.autoit.de/wiki/index.php/TutorialSehr hilfreich ist auch das Buch von peethebee

    Schau dir in der Hilfe

    [autoit]

    _FilelistToArray

    [/autoit]

    an,

    mfg atoBert

  • versteckte Control IDs beschreiben ?

    • autoBert
    • 16. Dezember 2010 um 15:10
    Zitat von HassanMullah

    Wenn ich eine externe Anwendung habe - im konkreten Fall Lotus Notes - und möchte dort ein Feld beschreiben, welches aber erst mal nicht sichtbar ist, kann ich dieses dann direkt adressieren ?

    Ich verstehe nicht wie du von einem nicht sichtbaren Feld ScreenShots machen konntest und dann auch noch mit AU3-InfoTool die nötigen infos ermitteln konntest, Da du sie aber hast solltest du übetprüfen ob ClassnameNN bzw. Advanced (Class) immer das gleiche ergeben, da man afair auch darüber Control-Funktionen ansprechen kann,

    mfg autoBert

  • Zugriff auf XML Attribut

    • autoBert
    • 16. Dezember 2010 um 14:55

    Hallo

    wenn ich dieses Skript:

    Spoiler anzeigen
    [autoit]

    #include <_XMLDomWrapper.au3>
    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    main()
    Func main()
    Local $sFile = "C:\Programme\AutoIt3\Examples\XMLTest.txt"
    If FileExists($sFile) Then
    $ret = _XMLFileOpen($sFile)
    If $ret = 0 Then Exit

    [/autoit] [autoit][/autoit] [autoit]

    $wert = _XMLGetValue("/container/wert3")

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox(4096, "test", $wert)
    ConsoleWrite("Error"& _XMLError()&@CRLF)
    Else
    MsgBox(4096, "fehler", "not found")
    EndIf
    EndFunc ;==>main

    [/autoit]

    laufen lasse bekomme ich folgenden Fehlerstring in der Konsole ausgegeben:

    Zitat

    ErrorNo object passed to function _XMLGetValue

    wenn ich in das Include-File:

    [autoit]

    Func _XMLGetValue($strXPath)
    If not IsObj($objDoc) then
    _XMLError("No object passed to function _XMLGetValue")
    Return SetError(1,1,-1)
    EndIf

    [/autoit]

    schaue wird auch klar warum. Die Funktion erwartet ein Object als Ünergabeoarameter, du übergibst aber einen String,

    mfg autoBert

  • Einen mit Screen_Capture gemachten Screenshot über den Bildschirm legen

    • autoBert
    • 16. Dezember 2010 um 12:18

    Hallo kofy,

    herzlich willkommen im Forum und viel Spass mit AutoIt.

    Hier kannst du dir die Hilfe herunterladen.
    Hier gibt es ein AutoIt-Tutorial: http://wiki.autoit.de/wiki/index.php/TutorialSehr hilfreich ist auch das Buch von peethebee

    und jetzt zu :

    Zitat von kofy

    man könne mit Autoit sogar auf dem Bild schreiben, aber ich habe keine Funktion dazu gefunden.


    Das kannst du mit GDIPlus-Gunktionen lösen, in meinem Snapshot-Tool )Link siehe Signatur)lege ich auf die Bilder damit Text,

    mfg atoBert

  • [Läuft] µitLight Dezember '10/Januar '11

    • autoBert
    • 16. Dezember 2010 um 04:36
    Zitat von Cyberdyne

    Wenn ich mit $SMALLSCREEN = True das Skript starte, dann kann ich (oder AutoBert) kein 'abort' eingeben um die KI zu beenden.


    An die Version $SmallScreen = True braucht ihr keine Arbeit investieren, da ich anscheinend der einzige bin, der nur auf dem NetBook skriptet. Ich passe mir die GUI in der Schach.au3 entsprechend an. Anstatt unten ist die Inpuntbox und der Hilfe-Button bei mir rechts,

    mfg autoBert

  • Suche nach leicht variierendem Text

    • autoBert
    • 16. Dezember 2010 um 04:18

    Hallo WebFish,

    herzlich willkommen im Forum und viel Spass mit AutoIt.

    Hier kannst du dir die Hilfe herunterladen.
    Hier gibt es ein AutoIt-Tutorial: http://wiki.autoit.de/wiki/index.php/TutorialSehr hilfreich ist auch das Buch von peethebee

    und jetzt zu:

    Zitat von Webfish

    Die Werte tauchen nicht im Quelltext auf (nur onscreen).

    Am besten fragst du den zuständigen Admin ob er dir die Zahlen in einer Datei zur Verfügung stellen kann, sollte ja eigentlich kein Problem sein, da du sie ja auch "onscreen" anschauen darfst. Ansonsten must die Screenshots machen

    [autoit]

    _ScreenCapture_Capture

    [/autoit]

    (und nach einer OCR-Lösung suchen, vielleicht wirst du ja auf AutoItScript.com fündig,

    mfg autoBert

  • Flash Intro & AutoIT3

    • autoBert
    • 16. Dezember 2010 um 04:02

    Hallo HPU,

    leider:
    Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.

    Du hast aber mit der Beta-Version compiled, glaube zwar nicht dass es daran liegt aber versch es noch einmal mit der Auswahl Production 3.3.6.1 (diese ist eh aktueller als die Beta)

    Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.

    PS.: Au3-Files brauchst du nicht vor dem Hochladen umbennen

    mfg autoBert

    Bilder

    • 4_Flash_Intro.EXE.jpg
      • 74,1 kB
      • 642 × 171

    Dateien

    5_AutoIt3Wrapper GUI to Compile AutotIt3 Script (ver 2.0.1.24).jpg 168,87 kB – 0 Downloads
  • Flash Intro & AutoIT3

    • autoBert
    • 16. Dezember 2010 um 01:45
    Zitat von HPU

    Würde das Programm auch auf 32 Bit Rechner mit diesen Einstellungen laufen?
    Ein User, der mein Programm betatesten wollte, meinte es würde nicht laufen.

    wenn ein Programm für 32-Bit kompiliert ist muss es auch auf 32-Bit-Systemen laufen, vorausgesetzt alle dafür benötigten Komponenten sind auf diesem System installiert. Du kannst ja das kleine Skript auf 32-Bit (aber bitte ohne UPX, sonst meckert warscheins der Virenscanner) kompilieren umbenennen nach Name.TXT (sonst kannst du es hier nicht hochladen) und dann hochladen. Da ja das Skript (aus Post #2) bei mir läuft kann ich es kurz testen, bin mir aber sicher es geht.

    PS.: wie kommst du auf FacePalm, habe ich etwas überlesen?

    mfg autoBert

  • Flash Intro & AutoIT3

    • autoBert
    • 15. Dezember 2010 um 22:19

    Ich sehe, daa du ein Win XP 64-Bit hast. Versuche aber einmal es als 32-Bit Exe zu komilieren und die EXE zu starten,

    mfg autoBert

  • Videotraining-Software

    • autoBert
    • 15. Dezember 2010 um 21:56
    Zitat von zombie36

    Ich habe diverse Videos im .avi und .swf format und möchte diese über ein AutoIT GUI einfach zugänglich machen


    AVI's machen bei AutoIt gerne Probleme da AutoIt anscheinend sehr hohe Ansprüche hat.
    Für Flash kannst du ja mit dem Skript aus Shockwave Flash Object von @weedhead testen, ist zwar schon 4 Jahre alt, funktioniert aber gut,

    mfg (Auto)Bert

  • Flash Intro & AutoIT3

    • autoBert
    • 15. Dezember 2010 um 21:35
    Zitat von HPU

    #include <GUIConstantsEx.au3> GUICreate("Test", 512, 288) $Flash = ObjCreate("testflash.swf") $FlashObj = GUICtrlCreateObj($Flash, 0, 0, 512, 288) $Flash.Movie = @ScriptDir & "\testflash.swf" $Flash.loop = true GUISetState(@SW_SHOW) While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit EndSwitch WEnd


    Es liegt an deinem Skript, mach es so und es klappt:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>

    [/autoit] [autoit][/autoit] [autoit]

    GUICreate("Test", 512, 288)
    $Flash = ObjCreate("ShockwaveFlash.ShockwaveFlash.1") ;<=======
    $FlashObj = GUICtrlCreateObj($Flash, 0, 0, 512, 288)
    $Flash.Movie = @ScriptDir & "\testflash.swf"
    $Flash.loop = true
    GUISetState(@SW_SHOW)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

    [/autoit]

    beachte Zeile 4, da war der Fehler,

    mfg autoBert

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™