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. 4ern

Beiträge von 4ern

  • 4ern_SomeMore_GUI UDF

    • 4ern
    • 25. Juni 2015 um 17:02
    Zitat von autoiter

    Bei mir tritt der Fehler unter Win 8.1 x64 AutoIt 3.3.12.0 auch auf (habe jedoch die aktuelle Beta 3.3.13.20 installiert..).


    Ok vermutlich tritt dies bei manchen auf, weil der Adlibregister nicht auf Funktionen mit Optionalen Parametern angewendet werden kann.
    Versucht es mal mit dieser Version.

    Dateien

    4ern_SomeMore_GUI.au3 22,89 kB – 529 Downloads
  • 4ern_SomeMore_GUI UDF

    • 4ern
    • 25. Juni 2015 um 14:48

    kannst du evtl. die Version: 3.3.10.2 ausprobieren?

  • 4ern_SomeMore_GUI UDF

    • 4ern
    • 25. Juni 2015 um 14:40

    hm diesen Fehler bekomme ich nicht.
    Welche AutoIt Version und welche OS Version nutzt du?

  • 4ern_SomeMore_GUI UDF

    • 4ern
    • 25. Juni 2015 um 13:29

    Hallo zusammen,

    ich habe noch eine GUI UDF gebaut, welche (wenn man es richtig anwendet) viel arbeit erspart und schöne Effekt beinhaltet, wie z. B. Mouse on Hover.

    Bei Interesse schauts euch an. Für Feedback oder Verbesserungsvorschläge wäre ich euch sehr Dankbar.

    Example

    AutoIt
    #include '4ern_SomeMore_GUI.au3'
    
    
    Example()
    	Func Example()
    
    	    $GUI = GUICreate("Mein GUI",500,200)
    
    
    	    ;Standart Defaults laden.
    	    _4ern_ctrl_SetDefaults('reset')
    
    
    	    ;Setzen die Defaults per 2D Array
    	    Local $aDefaults[][] = [['bg_color', 0x3C639A], ['font_name', 'Verdana'], ['font_size', 10]]
    	    _4ern_ctrl_SetDefaults($aDefaults)
    
    
    	    ;neues Controll welches die Defaults besitzt
    	    $btn1 = _4ern_ctrl_create('test',5,0)
    
    
    	    ;neues Controll mit Defaults über parameter
    	    $btn2 = _4ern_ctrl_create('test1',60,5,100,100,0x85BE9F)
    
    
    	    ;neues Controll welches die neuen Defaults besitzt
    	    $btn3 = _4ern_ctrl_create('test2',165,10)
    
    
    	    ;Änderung der Schriftgröße per Funktion
    	    _4ern_ctrl_SetDefaults('font_size',12)
    	    $btn4 = _4ern_ctrl_create('test3',270,20)
    	    $btn5 = _4ern_ctrl_create('test4',375,30)
    
    
    	    ;Erstelle Array für Hover Buttons
    	    Local $aHoverBtns[] = [$btn2, $btn3, $btn4, $btn5]
    
    
    	    GUISetState(@SW_SHOW) ; Zeigt eine leere Dialogbox an
    
    
    	    ; GUI starten, bis der Dialog beendet wird
    	    while 1
    
    
    	        Switch GUIGetMsg()
    	        	case 0 
    	        		;----------------------------------------------------------------------------------------------/
    			    	; Hover Effekte
    			    	;----------------------------------------------------------------------------------------------/
    			    	_4ern_ctrl_hover($GUI,$aHoverBtns, $btn2, 0x3C639A, 0x85BE9F)
    
    			    	;FlyOver auf dieses Label anwenden
    			    	if _4ern_ctrl_hover($GUI,$aHoverBtns, $btn3, 0x3C639A, 0x85BE9F) = $btn3 then 
    			    		_Example_onOver($GUI,$btn3)
    			    	endif
    
    
    			    	_4ern_ctrl_hover($GUI,$aHoverBtns, $btn4, 0x3C639A, 0x85BE9F)
    			    	_4ern_ctrl_hover($GUI,$aHoverBtns, $btn5, 0x3C639A, 0x85BE9F)
    
    
    	        	Case $GUI_EVENT_CLOSE
    	        		exit
    	        EndSwitch
    
    	    wend 
    	EndFunc
    	Func _Example_onOver($ParentGUI,$actionCtrl)
    
    		;FlyOver GUI erstellen
    		$GUI  = __FlyOver_GUI($ParentGUI, 400, 200, $actionCtrl, Default, Default, 0x3C639A)
    		DllCall("user32.dll", "int", "AnimateWindow", "hwnd", $GUI, "int", 150, "long", 0x00040001)
    
    		_4ern_ctrl_create('sdfa sdf asd fasdf ',0,0)
    		GUISetState(@SW_SHOWNOACTIVATE,$GUI)
    
    
    		While 1
    			$msg = GUIGetMsg()
    
    
    			;wichtig um das FlyOver wieder zu verlassen
    			if IsHWnd($GUI) = 0 then ExitLoop
    
    
    		wend
    	endfunc
    Alles anzeigen

    Dateien

    4ern_SomeMore_GUI.au3 22,77 kB – 548 Downloads
  • Base64 | Decode & Encode

    • 4ern
    • 25. Juni 2015 um 08:41

    Wir bräuchten hier wirklich dringend ein Google Tutorial :P

    Unter dem Suchbegriff: autoit Base64 String decode bekomme ich bereits im ersten Eintrag die benötigten Ergebnisse....

  • Text filtern mit StringInStr bzw. Position von Wörtern herausfinden und anwählen

    • 4ern
    • 22. Juni 2015 um 13:24

    Oder in RegEx ein ein Zeiler mit dem Pattern (?:\d{1})(\d+)

  • Können Controls bei einem (nicht Autoit) Programm nach einem Neustart unterschiedliche Instance Nummern aufweisen

    • 4ern
    • 15. Juni 2015 um 09:32

    mit diesem Thema hatte ich oft zu kämpfen. Habe es dann gelöst, indem ich die hWnds in ein Array lade und anhand des Textes oder Reihenfolge diese ansteuere...


    Beispiel:

    AutoIt
    #include <WinAPI.au3>
    #include <Array.au3>
    
    
    Global $ahWnds 
    
    
    _get_Child_hWnds($h_Calc, $ahWnds) ;alle Child hWnds(controlls) auslesen
    If IsArray($ahWnds) Then
        _ArrayDisplay($ahWnds, 'Debug Array Line 8')
    Else
        ConsoleWrite('Error Line 8: "$ahWnds" isnt an array' & @LF)
    EndIf
    
    
    for $i = 0 to Ubound($ahWnds) -1
        If StringInStr($ahWnds[$i][1], 'DeinSuchbegriff') Then
            ; Deine Ausführen
            ExitLoop
        EndIf
    next
    
    
    ;----------------------------------------------------------------------------------------------/
    ; Beschreibung: = hole alle Childs hWnds
    ; Parameter:    = Haupt hWnd
    ;
    ; Update        = 17.09.2014
    ; von           = 4ern.de
    ;----------------------------------------------------------------------------------------------/
    func _get_Child_hWnds($hWnd, ByRef $avArr)
    	If UBound($avArr, 0) <> 2 Then
            Local $avTmp[10][2] = [[0]]
            $avArr = $avTmp
        EndIf
    
    
        Local $hChild = _WinAPI_GetWindow($hWnd, $GW_CHILD)
    
    
        While $hChild
            If $avArr[0][0]+1 > UBound($avArr, 1)-1 Then ReDim $avArr[$avArr[0][0]+10][2]
            $avArr[$avArr[0][0]+1][0] = $hChild
            $avArr[$avArr[0][0]+1][1] = _WinAPI_GetWindowText($hChild)
            $avArr[0][0] += 1
            _get_Child_hWnds($hChild, $avArr)
            $hChild = _WinAPI_GetWindow($hChild, $GW_HWNDNEXT)
        WEnd
    
    
        ReDim $avArr[$avArr[0][0]+1][2]
    endfunc
    Alles anzeigen
  • Hilfe bei simpler "Sende Taste 1" an alle Fenster.

    • 4ern
    • 13. Juni 2015 um 23:17

    Dein Vorhaben verstößt gegen die Forum Regeln.


    Zitat von Forenregeln

    Folgende Inhalte sind absolut nicht erwünscht. Das Team behält es sich ausdrücklich vor, zur Durchsetzung der Regeln je nach Schweregrad Benutzer, Posts und Threads zu verwarnen, zu sperren oder zu löschen.

    Programme, die einem Spieler bei jeglicher Art von Computerspiel (auch Einzelspieler) einen Vorteil verschaffen ("Bots")

  • Desktop reservieren bei zwei Monitoren

    • 4ern
    • 11. Juni 2015 um 09:34

    Ok nun hab ich es raus.

    @bernd670 du hattest von Anfang an recht, leider habe ich das nicht von Anfang an verstanden.

    Mir hat im Struct immer die Zuweisung der Monitore gefehlt, jedoch ist dies garnicht notwendig, denn Windows macht das ganz von alleine. Anhand der X,Y Kordinaten ermittelt Windows, welche Workarea gemeint ist und wendet dort die SPI_SetWorkarea an.

    So sieht dann der Code aus :D

    AutoIt
    #include <WinAPIGdi.au3>
    #include <WinAPISys.au3>
    
    
    Const $SPI_SETWORKAREA = 47
    Const $SPIF_SENDCHANGE = 2
    
    
    ;Workarea ermitteln.
    $pRECT = DllStructCreate('long X;long Y')
    DllStructSetData($pRECT, "X" , @Desktopwidth+1) ; // -1 = Monitor 1 || +1 = Monitor 2
    DllStructSetData($pRECT, "Y" , @DesktopHeight)
    $aData = _WinAPI_GetMonitorInfo(_WinAPI_MonitorFromPoint($pRECT))
    
    
    ;Desktop Reservieren
    $tRECT = DllStructCreate('int;int;int;int')
    DllStructSetData($tRECT, 1, DllStructGetData($aData[1], 1)) ; left
    DllStructSetData($tRECT, 2, DllStructGetData($aData[1], 2)+40) ; top
    DllStructSetData($tRECT, 3, DllStructGetData($aData[1], 3)) ; right
    DllStructSetData($tRECT, 4, DllStructGetData($aData[1], 4)) ; buttom
    _WinAPI_SystemParametersInfo($SPI_SETWORKAREA, 1, DllStructGetPtr($tRECT), $SPIF_SENDCHANGE)
    Alles anzeigen
  • Desktop reservieren bei zwei Monitoren

    • 4ern
    • 11. Juni 2015 um 08:37

    OK kurzes Update meinerseits,

    laut MSDN muss ich bei multiblen Monitoren die Funktion "GetMonitorInfo" aufrufen, zum Glück gibt es hier bereits was von AutoIt _WinAPI_GetMonitorInfo($hMonitor).

    So nun habe ich keine Ahnung wie ich anhand dieser Informationen eine Struct erstelle, sodass ich die Workarea vom zweiten Bildschirm anspreche.

  • Desktop reservieren bei zwei Monitoren

    • 4ern
    • 9. Juni 2015 um 14:58
    Zitat von YaeroxXO

    Kannst du mir davon vll. mal n Screen zukommen lassen, sofern du fertig bist. Würde mir mal gern anschauen, wie du das nutzt. Es scheint ja keine Standard-Taskbar zu sein, oder? Klingt interessant...

    Tatsächlich gibt es noch nicht viel zusehen, wie du auf den Bildern siehst, reserviert sich das Script oben den Platz, sodass Icons & Maximierte Fenster sich nun an diese Größe halten.

  • Desktop reservieren bei zwei Monitoren

    • 4ern
    • 8. Juni 2015 um 12:19

    hm das haut nicht ganze hin, denn wenn ich das ganze z.B auf den rechten Bildschirm anwende, ist der Linke komplett blockiert :)

  • Desktop reservieren bei zwei Monitoren

    • 4ern
    • 8. Juni 2015 um 10:47

    Hallo zusammen, mit folgendem Code kann ich bestimmten Platz auf meinem Desktop für meine GUI Taskleiste reservieren. Jedoch wird hier immer vom Hauptmonitor ausgegangen. Hat evtl. jemand eine Idee, wie ich diesen Code auf mein zweiten Monitor anwenden kann?

    Spoiler anzeigen
    AutoIt
    Const $SPI_SETWORKAREA = 47
    Const $SPIF_SENDCHANGE
    
    
    $tRECT = DllStructCreate('int;int;int;int')
    DllStructSetData($tRECT, 1, 0) ; left
    DllStructSetData($tRECT, 2, 40) ; top
    DllStructSetData($tRECT, 3, @DesktopWidth) ; right
    DllStructSetData($tRECT, 4, @DesktopHeight -  40) ; buttom
    _WinAPI_SystemParametersInfo($SPI_SETWORKAREA, 0, DllStructGetPtr($tRECT), $SPIF_SENDCHANGE)
  • PushTheButton, ermöglicht Mausklick auf sonst nicht erreichbare Grafiken UPDATE 1.36

    • 4ern
    • 21. Mai 2015 um 10:35

    :) mit imagesearch gescheitert.

  • Fehlermeldung auf Host PC: Es befindet sich kein Datenträger im Laufwerk

    • 4ern
    • 13. Mai 2015 um 17:08

    Ohne zu wissen was das Script macht ist das fast unmöglich dir ein Sinnvollen Lösungsansatz zu liefern...

  • Verbindung zum Oracle Server

    • 4ern
    • 12. Mai 2015 um 08:49
    Zitat von BugFix

    Genau das ist der springende Punkt: MSDAORA ist eine 32bit-Dll und es gibt keine 64bit-Version. Der Support dafür wurde von M$ auch eingestellt, die verweisen nur noch auf den Oracle-Treiber.

    Genau auf dieses Ergebnis bin ich gestern auch gestoßen. Nun versuche ich herauszufinden, ob ich davon nur einpaar dll Dateien brauche um eine Verbindung herzustellen oder eine komplette Installation zwingend notwendig ist.

    Eine andere Frage, kann man MSDAORA dennoch benutzen wenn man das Script als x86 durchführt und die alle notwendigen dll Dateien mitgibt?

  • Verbindung zum Oracle Server

    • 4ern
    • 11. Mai 2015 um 16:14

    @BugFix vielen Dank für den Tip!!!

    Ich habe nun unter Windows Vista 32 Bit mit folgendem Code eine Verbindung aufbauen können.

    Spoiler anzeigen
    [autoit]


    #include <array.au3>

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

    $oMyError = ObjEvent("AutoIt.Error","MyErrFunc")
    $sqlCon = ObjCreate("ADODB.Connection")

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

    ;----------------------------------------------------------------------------------------------/
    ; DB Connection
    ;----------------------------------------------------------------------------------------------/
    Local $aResult, $iRows, $iColumns, $vQuery
    Local $s_server = '111.111.111.11'
    Local $s_port = '1337'
    Local $s_dbName = 'dbname'
    Local $s_user = 'user'
    Local $s_pw = 'password'

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

    $sqlCon.Mode = 16
    $sqlCon.CursorLocation = 3
    $sqlCon.Open ( _
    "Provider = MSDAORA;" & _
    "Data Source =" & _
    "(DESCRIPTION =" & _
    "(ADDRESS_LIST =" & _
    "(ADDRESS =" & _
    "(PROTOCOL= TCP)" & _
    "(Host="&$s_server&")" & _
    "(Port= "&$s_port&")" & _
    ")" & _
    ")" & _
    "(CONNECT_DATA =" & _
    "(SERVICE_NAME = "&$s_dbName&")" & _
    ")" & _
    ");" & _
    "User Id="&$s_user&";" & _
    "Password="&$s_pw&";")

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

    If @error Then
    MsgBox(0, "ERROR", "Failed to connect to the database")
    Exit
    EndIf

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

    $vQuery = "SELECT * FROM Tablename"

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

    _SQL_GetTable2D($sqlCon, $vQuery, $aResult, $iRows, $iColumns)
    _ArrayDisplay($aResult)

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

    Exit

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

    Func _SQL_GetTable2D($hConHandle, $vQuery, ByRef $aResult, ByRef $iRows, ByRef $iColumns)

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

    $SQLErr = ""
    Local $i, $x, $y, $objquery

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

    $iRows = 0
    $iColumns = 0
    ;sp mod removed handle check here use function.
    $objquery = _SQL_Execute($hConHandle, $vQuery)
    ;end mod
    If @error Then
    $SQLErr = "Query Error"
    Return SetError($SQL_ERROR, 0, $SQL_ERROR)
    EndIf

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

    If $objquery.eof Then
    $SQLErr = "Query has no data"
    $objquery = 0 ;sp mod
    Return SetError($SQL_ERROR, 0, $SQL_ERROR)
    EndIf

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

    With $objquery

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

    $aResult = .GetRows()

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

    If IsArray($aResult) Then
    $iColumns = UBound($aResult, 2)
    $iRows = UBound($aResult)

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

    ReDim $aResult[$iRows + 1][$iColumns];Adjust the array to fit the column names and move all data down 1 row

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

    For $x = $iRows To 1 Step -1
    For $y = 0 To $iColumns - 1
    $aResult[$x][$y] = $aResult[$x - 1][$y]
    Next
    Next
    ;Add the coloumn names
    For $i = 0 To $iColumns - 1 ;get the column names and put into 0 array element
    $aResult[0][$i] = .Fields($i).Name
    Next

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

    Else
    $SQLErr = "Unable to retreive data"
    $objquery = 0 ;sp mod
    Return SetError($SQL_ERROR, 0, $SQL_ERROR)
    EndIf;IsArray()

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

    EndWith
    $objquery = 0
    Return SetError($SQL_OK, 0, $SQL_OK)
    EndFunc

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

    Func MyErrFunc()
    $HexNumber=hex($oMyError.number,8)
    Msgbox(0,"COM 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 & $HexNumber & @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) ; to check for after this function returns
    Endfunc

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


    Jedoch hab ich nun das Problem mit Windows8.1 64 Bit. Hierbei bekomme ich die Fehlermeldung:

    Bash
    We intercepted a COM Error !
    
    
    err.description is: 	Der Provider kann nicht gefunden werden.  Möglicherweise ist er nicht richtig installiert worden.
    err.windescription:	Ausnahmefehler aufgetreten.
    
    
    err.number is: 	80020009
    err.lastdllerror is: 	0
    err.scriptline is: 	20
    err.source is: 	ADODB.Connection
    err.helpfile is: 	C:\Windows\HELP\ADO270.CHM
    err.helpcontext is: 	1240655
    Alles anzeigen


    Unter "C:\Program Files\Common Files\System" ist der Ordner Ole DB vorhanden?

    Vielen Dank für eure Hilfe.

  • Verbindung zum Oracle Server

    • 4ern
    • 11. Mai 2015 um 09:31
    Zitat von Andy

    Oracle stellt dafür Tools zur Verfügung.

    Ruf an der Kundenhotline an oder schreib eine Mail an den Support, oder finde die Tools auf der Oracle-Site selbst.

    Ja das ist mir bekannt, jedoch suche ich zuerst nach eine Möglichkeit mit Windows eigenen Funktionen eine Verbindung aufzubauen.

    Zitat von Andy

    Ohne "usw.", nur mit der Eingabe von "connect to oracle server without odbc" in Google habe ich auf den ersten beiden Seiten 10 (IN WORTEN ZEHN ! ) Treffer zum Thema gefunden!


    Über die Möglichkeiten per Excel/Access will ich garnicht reden, OpenOffice wickelt das übrigens genauso problemlos ab....

    Evtl. habe ich mich falsch ausgedrückt? Ich suche nach einer Möglichkeit ohne ODBC... Bei diesem Suchbegriff bekomme ich nur Möglichkeiten aufgelistet über eine ODBC Verbindung.

    Von Bugfix habe ich den Tipp bekommen die Verbindung über ADO oder OLE herzustellen. Hier ein BSP. von BugFix für eine ADO Verbindung.

    [autoit]


    Local $hConn, $hRS, $sSQL
    $hConn = ObjCreate("ADODB.Connection")
    With $hConn
    .ConnectionString = "Provider=MSDAORA;" & _
    "Data Source=ORCL10G;" & _
    "User ID=System;Password=oracle;"
    .Open
    EndWith
    $hRS = ObjCreate("ADODB.Recordset")
    $sSQL = "select * from Daten.emp"
    $hRS.Open($sSQL, $hConn, 3, 3)

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

    ; Zugriff auf Felder mit $hRS("FELDNAME"), z.B.
    $name = $hRS("Name")

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

    $hRS.Close
    $hConn.Close

    [/autoit]

    Jedoch verstehe ich nicht wo ich im Connection String die IP und Port eingeben muss. Ich habe es damit bereits versucht und bekomme immer ein Ausnahme Fehler :(

    Zitat von x0r

    Da gabs glaube ich mal ne spezielle UDF, hatte mal was gebaut damit, ist allerdings schon über 2 Jahre her

    Mit dieser UDF arbeite ich bereits erfolgreich. Jedoch dachte ich funktioniert dies nur mit MySql? Oder muss ich in der UDF etwas bestimmtes anpassen, damit das funktioniert?

    Zitat von bernd670

    Wenn man nichts installieren kann, hat das ja bestimmt seinen Grund!

    @bernd670 Tschuldige meine pampige Antwort. Es hat einfach den folgenden Grund, dass dies auf mehreren PC's (>= 2000) installiert werden muss, die Installation an sich ist zwar rein technisch kein Problem, jedoch sind das zusätzliche Budget-kosten, Papierkram und eine lange Bearbeitungszeit... Deswegen möchte ich dies am besten ohne Installationen lösen.

    Vielen Dank für eure Hilfe.

  • Verbindung zum Oracle Server

    • 4ern
    • 7. Mai 2015 um 19:16

    Ehm ja hat es. Aber das hilft mir aktuell nicht weiter....

  • Verbindung zum Oracle Server

    • 4ern
    • 7. Mai 2015 um 16:55

    Hallo zusammen,

    ich versuche bei uns in der Arbeit eine Verbindung zum Oracle Server herzustellen, jedoch scheitere ich daran.
    Das Problem liegt daran, dass ich keine odbc Treiber oder Oracle auf unseren Arbeits PC installieren kann und somit eine Verbindung mit Standard Funktionen herstellen muss.
    Mit Google usw. kam ich leider nicht weiter :(

    Hat evtl hier jemand eine Idee?

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™