|| - hast du da zwei stehen? - Dann gehts natürlich nicht. Mit einem funktionierts, wie gewollt.
Beiträge von BugFix
-
-
Hätte das was mit _WinAPI_SetWindowsHookEx() zu tun?
Genau. Ist eine interessante Sache. Leider wird das auch für gar nicht gern gesehene Aktivitäten (z.B. Keyloggger) genutzt.
Deshalb halten wir uns mit Unterstützung zu diesem Thema etwas bedeckt. Mit etwas eigener Anstrengung findet man dann schon zu Lösungen.
Da Scriptkiddies sich nicht gern anstrengen, reichen unsere vagen Hinweise den Usern eigentlich.
-
Ich versuche mal das so auszudrücken, wie ich es verstanden habe:
Code
Alles anzeigenStartwert_1: 3019180 Startwert_2: 91 Endwert_1: 3019199 Endwert_2: 93 gewünschtes Ergebnis, eine Liste: 3019180-91 (Startwert_1-Startwert_2) 3019180-92 3019180-93 3019181-91 3019181-92 ... 3019199-93 (Endwert_1-Endwert_2)Ist das korrekt?
Soll die Liste als Textdatei mit allen Werten untereinander ausgegeben werden oder gruppiert?
Gib mal ein vorher-nachher-Bsp. an.
EDIT:
Das geht natürlich problemlos auch in Excel:
Erstelle dieses Makro
Code
Alles anzeigenSub GenerateNumbers() Dim sResult As String Dim iWriteLine As Integer iWriteLine = 4 For i = Range("B1").Value To Range("B2").Value For k = Range("C1").Value To Range("C2").Value sResult = CStr(i) & "-" & CStr(k) Range("A" & CStr(iWriteLine)).Value = sResult iWriteLine = iWriteLine + 1 Next k Next i End SubDie Felder musst du ggf. anpassen, ich habe es mit dieser Tabelle ausgeführt:
PS: Wegen Bezahlung - Drück den Spenden-Button und unterstütze unser Forum. Betrag ist dir überlassen.
-
Mit GROUP & Co stehe ich sowieso auf Kriegsfuß. Die Syntaxbeschreibung dazu ist leider wenig aussagekräftig. Deshalb habe ich darum in den letzten 20 Jahren immer einen Bogen gemacht (ich verstehe das einfach nicht
).Wenn ich das analog zu deinem Bsp. ausführe gibt es ein Problem bei HAVING: "Allgemeiner SQL-Fehler. Ungültiger Ausdruck in der HAVING-Bedingung. Weder eine Aggregatfunktion noch Teil einer GROUPBY-Bedingung."
Setze ich bei HAVING statt date<=.. maxDate<=.. ein, ergibt das den Fehler: Column MAXDATE unbekannt.
Aber, wie gesagt, da sich mir das Group-Gedöns echt nicht erschließt, weiß ich nicht mal, wie ich daran herumschrauben sollte.

-
Hilft dir das weiter?
Leider nicht. Zählen war jetzt nicht das Ziel.
Ich kenn jetzt Firebird-SQL nicht, aber generell würde ich es so probieren:
SELECT * FROM (SELECT adressnr,max(date) as maxDate FROM belege GROUP BY adressnr) g WHERE g.maxDate<='2011-10-10'
(Bei max muss eventuell erst zu einem zahlenwert gecastet werden, das hängt von der art der speicherung ab)
MfG Kanashius
Aggregat max funktioniert mit Datumsfeldern, das ist schon mal ein Schritt vorwärts, brauch ich nichts casten.
Leider lässt sich die obige Syntax nicht umsetzen. Das innere Query kann man in Firebird nicht einem Pseudotable zuweisen und im selben Atemzug darauf zugreifen.
Ich habe etliches experimentiert, aber ich vermute, dass es gar nicht möglich ist diese Abfrage in einem Schritt zu realisieren, da auf jeden DS in BELEG eine Abfrage auf die verfügbaren Adressnummern in KUNDEN erfolgen muss. Das sind ca. 1.200.000 DS aus Belege auf ca. 10.000 DS in KUNDEN.
Ich werde jetzt mal umsteigen auf SQL-Batch. Sollte ich da zu einer Lösung kommen, kann ich versuchen das Step-by-Step zurückzubauen und im Idealfall doch noch bei einem Query zu landen.
-
Ich brauche als Ergebnis einer Abfrage: jüngste Rechnung ist größer/kleiner gefragter Zeitraum. Das kann ich optisch sehen, wenn ich für jede KundenNr alle Belege gruppiere und nach Datum sortiere. Aber optisch nutzt nichts - ich muss anhand der Entscheidung die Daten weiterverarbeiten.
Das ist mein Problem auf den Punkt:
Ich kann abfragen:
- alle Belege mit Belegdatum älter X
Aber jeder Beleg enthält eine AdressNr und es gibt mehrere Belege zu einer Adressnr.
Meine Abfrage müsste also von der Logik lauten:
Alle Belege bei denen für die Adressnr des Beleges kein anderer Beleg existiert mit derselben AdressNr und einem Belegdatum jünger als HEUTE minus FRIST.
Ich bekomme das einfach nicht in ein Query.
-
Ich habe gerade einen Knoten im Hirn und komme nicht weiter.
Ich habe eine Tabelle BELEGE und will diejenigen Einträge ausfiltern, bei denen für die enthaltene ADRESSNR der neueste Beleg mindestens das Alter X hat.
(Auf diese Weise will ich über die entsprechenden ADRESSNR die Kunden ermitteln, bei denen die Aufbewahrungsfrist abgelaufen ist und somit die Löschung/Anonymisierung vorgenommen werden muss - Danke an DSGVO
)Abfrage nach Rechnungen älter als X sind kein Problem - aber wie komme ich an die jüngste?
Bin dankbar für Vorschläge.
-
Schick, schick!
Aber ich möchte mal auf hohem Niveau "meckern"

Für die Kalenderwoche verwendet man üblicherweise "KW", "WNr." ist dann eher eine private Abkürzung. [/Klugscheißmodus]
-
Nun bleib mal auf dem Teppich. Ich kann hier keine Aggressivität entdecken.
Du solltest nur nicht gleich angepisst sein, wenn intensiv nachgefragt wird.
Ich kann mit deinem Startpost auch nichts anfangen und habe mich deshalb von Anfang an raus gehalten. - Gehe aber auch von einem X-Y Problem aus.
Im Übrigen solltest du in einem Programmiererforum keine bauchpinselnde Konversation erwarten. Wir machen das alles in unserer Freizeit und lieben daher zeitsparenderweise kurz und knackig Fakten.
-
Neu v0.12
Ein paar Optimierungen.
-
Neu v0.11
Nun ist auch das Auffangen/Setzen der Farbe beim Disable/Enable nicht mehr erforderlich.
-
Oh man, war ein klassisches Eigentor.
Meine Groupelemente sind ja alle Label. Und wenn ich die Label auf Hide setze (was sinnfrei ist, da das keinen Einfluß auf das Aussehen hat), werden die darüber gelagerten Control nicht mehr klickbar, auch nicht nach Enable. Habe ich nun korrigiert.
Ich poste gleich die neue Version im Startpost.
-
To-Do-List:
Funktion GroupCloseControlMove ersetzen durch GUICtrlSetPosVerschieben /Status setzen auch für nicht-native Control --> ist umgesetzt aber: nach set Status Disable, dann Enable kann kein Control der Group angeklickt werden

Bitte mal die v 0.9 testen,
vielleicht findet jemand den Fehler, bin da irgendwie in einer Sackgasse.
v 0.9
AutoIt
Alles anzeigen;-- TIME_STAMP 2018-06-02 15:31:10 v 0.9 #include-once #include <GUIConstantsEx.au3> #include <WinAPIGdi.au3> #include <WinAPI.au3> ; == border color settings Global Const $_GROUPBORDER_LEFT = 0x000001 ; == left border Global Const $_GROUPBORDER_TOPL = 0x000002 ; == top border left from title Global Const $_GROUPBORDER_TOPR = 0x000004 ; == top border right from title Global Const $_GROUPBORDER_TOP = BitOR($_GROUPBORDER_TOPL,$_GROUPBORDER_TOPR) ; == top border Global Const $_GROUPBORDER_RIGHT = 0x000008 ; == right border Global Const $_GROUPBORDER_BOTTOM = 0x000010 ; == bottom border Global Const $_GROUPBORDER_ALL = BitOR($_GROUPBORDER_LEFT,$_GROUPBORDER_TOP,$_GROUPBORDER_RIGHT,$_GROUPBORDER_BOTTOM) ; == full border ; == text settings Global Const $_GROUPTEXT_FORE = 0x000020 ; == sets text fore color Global Const $_GROUPTEXT_BACK = 0x000040 ; == sets text BG-color, should be $GUI_BKCOLOR_TRANSPARENT (default), if Group BG-color is diffent to GUI BG-color or same as Group BG-color Global Const $_GROUPTEXT_TRANS = 0x000080 ; == sets text BG-color to $GUI_BKCOLOR_TRANSPARENT Global Const $_GROUPTEXT_TEXT = 0x000100 ; == sets the title text Global Const $_GROUPTEXT_ITALIC = 0x000200 ; == sets text style to italic Global Const $_GROUPTEXT_DEFAULT = 0x000400 ; == sets text style back to normal Global Const $_GROUPTEXT_LEFT = 0x000800 ; == sets text position to left side (default) Global Const $_GROUPTEXT_CENTER = 0x001000 ; == sets text position centered Global Const $_GROUPTEXT_RIGHT = 0x002000 ; == sets text position to right side ; == background color group Global Const $_GROUPBACKGROUND = 0x004000 ; == sets BG-color inside border area ; == move the whole control Global Const $_GROUP_MOVE_ABS = 0x008000 ; == give param as array [x,y,width,height], values that should not change set to "*" ; you can also give values as comma seperated string: "x,y,width,height" ; y,width,height by default has value "*", so you can omit them if not need to change Global Const $_GROUP_MOVE_REL = 0x010000 ; == same as before, but given values relative to current position/size ; == default disabling colors Global Const $_GROUP_DISABLE_BGDEF = 0xFAFAFA ; == the default background color value, if disabling the group Global Const $_GROUP_DISABLE_TXTDEF = 0xF2F2F2 ; == the default title color value, if disabling the group ; == get system metrics Global $_giTop, $_giSide __SystemGetWindowBorder($_giTop, $_giSide) ; #FUNCTION# ==================================================================================================================== ; Name ..........: _GuiCtrlGroup_Create ; Description ...: Creates a group control as collection of labels ; Syntax ........: _GuiCtrlGroup_Create($_sText, $_iX, $_iY, $_iWidth, $_iHeight[, $_iBorderCol = -1[, $_iForeCol = -1[, ; $_iBackCol = -1[, $_iTitleParam=$_GROUPTEXT_LEFT]]]]) ; Parameters ....: $_hGui - GUI, where the group is still create ; $_sText - Titel ; $_iX - x position ; $_iY - y position, its the value for top of the title - border starts at: y +7 ; $_iWidth - width ; $_iHeight - height, its the height from top of title to bottom border ; $_iBorderCol - [optional] Color for all border elements. Keyword Default = Silver: 0xC0C0C0, -1 = System (invisible) ; $_iForeCol - [optional] Title text color. Default is -1 (System). ; $_iBackCol - [optional] Group area background color. Default is -1 (System). ; $_iTitleParam - [optional] Title align left (default), centered or right or combined with italic style: BitOr($_CONST_ALIGN_, $_GROUPTEXT_ITALIC) ; Because $_GROUPTEXT_LEFT is the default alignment, you can use $_GROUPTEXT_ITALIC alone, to set italic style left aligned. ; Return values .: Structure with IDs of all group elements ; Author ........: BugFix ; =============================================================================================================================== Func _GuiCtrlGroup_Create($_hGui, $_sText, $_iX, $_iY, $_iWidth, $_iHeight, $_iBorderCol=Default, $_iForeCol=-1, $_iBackCol=-1, $_iTitleParam=$_GROUPTEXT_LEFT) $_iY += 7 Local $guiTmp = GUICreate('TEMP') Local $idText, $aSize[1] If $_sText <> '' Then $idText = GUICtrlCreateLabel(' ' & $_sText, 0, 0) $aSize = ControlGetPos($guiTmp, '', $idText) GUICtrlDelete($idText) Else ReDim $aSize[3] $aSize[2] = 0 EndIf GUISwitch($_hGui) GUIDelete($guiTmp) If $aSize[2] > $_iWidth -12 Then $aSize[2] = $_iWidth -12 Local $dLeft = 10 If $aSize[2] > 0 Then Switch $_iTitleParam Case $_GROUPTEXT_CENTER $dLeft = Int(($_iWidth-$aSize[2])/2) Case $_GROUPTEXT_RIGHT $dLeft = $_iWidth-10-$aSize[2] EndSwitch EndIf Local $idBG = GUICtrlCreateLabel('', $_iX+1, $_iY+1, $_iWidth-2, $_iHeight-2-7) If $_iBackCol > -1 Then GUICtrlSetBkColor($idBG, $_iBackCol) GUICtrlSetState($idBG, $GUI_DISABLE) Local $idLeft = GUICtrlCreateLabel('', $_iX, $_iY, 1, $_iHeight-7) Local $idTopL = GUICtrlCreateLabel('', $_iX+1, $_iY, $dLeft-1, 1) Local $idTopR = GUICtrlCreateLabel('', $_iX+$dLeft+$aSize[2], $_iY, $_iWidth-$aSize[2]-$dLeft, 1) Local $idRight = GUICtrlCreateLabel('', $_iX+$_iWidth, $_iY, 1, $_iHeight-7) Local $idBottom = GUICtrlCreateLabel('', $_iX+1, $_iY+$_iHeight-7, $_iWidth, 1) If IsKeyword($_iBorderCol) Then $_iBorderCol = 0xC0C0C0 If $_iBorderCol > -1 Then GUICtrlSetBkColor($idLeft, $_iBorderCol) GUICtrlSetBkColor($idTopL, $_iBorderCol) GUICtrlSetBkColor($idTopR, $_iBorderCol) GUICtrlSetBkColor($idRight, $_iBorderCol) GUICtrlSetBkColor($idBottom, $_iBorderCol) EndIf If $_sText <> '' Then $_sText = ' ' & $_sText $idText = GUICtrlCreateLabel($_sText, $_iX+$dLeft, $_iY-7, $aSize[2], 17) GUICtrlSetBkColor($idText, $GUI_BKCOLOR_TRANSPARENT) If BitAND($_iTitleParam, $_GROUPTEXT_ITALIC) Then GUICtrlSetFont($idText, Default, Default, 2) EndIf If $_iForeCol > -1 Then GUICtrlSetColor($idText, $_iForeCol) Local $tagGROUP = "int Text;int Left;int TopL;int TopR;int Right;int Bottom;int Background;int Align;" Local $tGROUP = DllStructCreate($tagGROUP) $tGROUP.Text = $idText $tGROUP.Left = $idLeft $tGROUP.TopL = $idTopL $tGROUP.TopR = $idTopR $tGROUP.Right = $idRight $tGROUP.Bottom = $idBottom $tGROUP.Background = $idBG $tGROUP.Align = BitXOR($_iTitleParam, $_GROUPTEXT_ITALIC) GUIStartGroup() Return $tGROUP EndFunc ;==>_GuiCtrlGroup_Create ; #FUNCTION# ==================================================================================================================== ; Name ..........: _GuiCtrlGroup_Close ; Description ...: Starts a new group and so the previous group will closed ; Syntax ........: _GuiCtrlGroup_Set() ; Return values .: None ; Note ..........: Only required, if outside the group radio buttons following. But it can used to close each group. ; Author ........: BugFix ; =============================================================================================================================== Func _GuiCtrlGroup_Close() GUIStartGroup() EndFunc ;==>_GuiCtrlGroup_Close ; #FUNCTION# ==================================================================================================================== ; Name ..........: _GuiCtrlGroup_Set ; Description ...: Changes values of a _GuiCtrlGroup_Create() created control. ; Syntax ........: _GuiCtrlGroup_Set(ByRef $_structGroup, $_vValue, $_constFlag, $_aCtrlInside) ; Parameters ....: $_structGroup - Return value from _GuiCtrlGroup_Create() ; $_vValue - The new value, maybe an empty string with some flag. ; $_constFlag - The const to identify the action (see constants at top) ; $_aCtrlInside - With action flag $_GROUP_MOVE_ABS/$_GROUP_MOVE_REL you can give an array of controls ; inside this group. This controls will moved too with the delta x/y values. ; Return values .: None ; Author ........: BugFix ; =============================================================================================================================== Func _GuiCtrlGroup_Set(ByRef $_structGroup, $_vValue, $_constFlag, $_aCtrlInside= Null) Local $hWndGui = _WinAPI_GetParent(GUICtrlGetHandle($_structGroup.Background)) Local $idText = $_structGroup.Text Local $idLeft = $_structGroup.Left Local $idTopL = $_structGroup.TopL Local $idTopR = $_structGroup.TopR Local $idRight = $_structGroup.Right Local $idBottom = $_structGroup.Bottom Local $idBackground = $_structGroup.Background Local $iAlign = $_structGroup.Align Local $aSize, $aBott, $sTitle;, $vReturn = Null If BitAND($_constFlag, $_GROUPBORDER_LEFT) Then GUICtrlSetBkColor($idLeft, $_vValue) If BitAND($_constFlag, $_GROUPBORDER_TOPL) Then GUICtrlSetBkColor($idTopL, $_vValue) If BitAND($_constFlag, $_GROUPBORDER_TOPR) Then GUICtrlSetBkColor($idTopR, $_vValue) If BitAND($_constFlag, $_GROUPBORDER_RIGHT) Then GUICtrlSetBkColor($idRight, $_vValue) If BitAND($_constFlag, $_GROUPBORDER_BOTTOM) Then GUICtrlSetBkColor($idBottom, $_vValue) If BitAND($_constFlag, $_GROUPBACKGROUND) Then GUICtrlSetBkColor($idBackground, $_vValue) If BitAND($_constFlag, $_GROUPTEXT_FORE) Then GUICtrlSetColor ($idText, $_vValue) If BitAND($_constFlag, $_GROUPTEXT_BACK) Then GUICtrlSetBkColor($idText, $_vValue) If BitAND($_constFlag, $_GROUPTEXT_TRANS) Then GUICtrlSetBkColor($idText, $GUI_BKCOLOR_TRANSPARENT) If BitAND($_constFlag, $_GROUPTEXT_ITALIC) Then GUICtrlSetFont ($idText, Default, Default, 2) If BitAND($_constFlag, $_GROUPTEXT_DEFAULT) Then GUICtrlSetFont ($idText, Default, Default, Default) If BitAND($_constFlag, BitOR($_GROUPTEXT_LEFT,$_GROUPTEXT_CENTER,$_GROUPTEXT_RIGHT,$_GROUPTEXT_TEXT)) Then $aSize = ControlGetPos($hWndGui, '', $idLeft) $aBott = ControlGetPos($hWndGui, '', $idBottom) Local $x = $aSize[0], $y = $aSize[1] If $_vValue = '' Then If BitAND($_constFlag, BitOR($_GROUPTEXT_LEFT,$_GROUPTEXT_CENTER,$_GROUPTEXT_RIGHT)) Then $aSize = ControlGetPos($hWndGui, '', $idText) Else $aSize[2] = 0 EndIf Else Local $guiTmp = GUICreate('') GUISwitch($guiTmp) Local $idTmp = GUICtrlCreateLabel(' ' & $_vValue, 0, 0) $aSize = ControlGetPos($guiTmp, '', $idTmp) GUICtrlDelete($idTmp) GUISwitch($hWndGui) GUIDelete($guiTmp) EndIf Local $dLeft = 10 If $aSize[2] > $aBott[2] -12 Then $aSize[2] = $aBott[2] -12 If $aSize[2] > 0 Then If BitAND($_constFlag, $_GROUPTEXT_CENTER) Then $dLeft = Int(($aBott[2]-$aSize[2])/2) If BitAND($_constFlag, $_GROUPTEXT_RIGHT) Then $dLeft = $aBott[2]-10-$aSize[2] EndIf GUICtrlSetPos($idTopL, $x+1, $y, $dLeft-1, 1) GUICtrlSetPos($idTopR, $x+$dLeft+$aSize[2], $y, $aBott[2]+2-$aSize[2]-$dLeft, 1) GUICtrlSetPos($idText, $x+$dLeft, $y-7, $aSize[2], 17) If BitAND($_constFlag, $_GROUPTEXT_TEXT) Then If $_vValue <> '' Then $_vValue = ' ' & $_vValue GUICtrlSetData($idText, $_vValue) EndIf EndIf If BitAND($_constFlag, BitOR($_GROUP_MOVE_ABS,$_GROUP_MOVE_REL)) Then If Not IsArray($_vValue) Then $_vValue = StringSplit($_vValue, ',', 2) If UBound($_vValue) < 4 Then ReDim $_vValue[4] For $i = 1 To 3 If $_vValue[$i] = '' Then $_vValue[$i] = '*' Next EndIf Local $bRel = False If BitAND($_constFlag, $_GROUP_MOVE_REL) Then $bRel = True GUISetState(@SW_LOCK, $hWndGui) Local $aDelta = __SubCtrlMove($hWndGui, $_structGroup, $_vValue, $bRel, $iAlign) ; if an array with controls from inside the group is given - move them too If IsArray($_aCtrlInside) Then Local $aSize, $dX = $aDelta[0], $dY = $aDelta[1], $bhWnd, $opt = AutoitSetOption('GUICoordMode', 1) For $i = 0 To UBound($_aCtrlInside) -1 $bhWnd = False If IsHWnd($_aCtrlInside[$i]) Then $bhWnd = True $aSize = WinGetPos($_aCtrlInside[$i]) Else $aSize = ControlGetPos($hWndGui, '', $_aCtrlInside[$i]) EndIf __ControlMove($hWndGui, $bhWnd, $_aCtrlInside[$i], $aSize, $dX, $dY) Next AutoitSetOption('GUICoordMode', $opt) EndIf GUISetState(@SW_UNLOCK, $hWndGui) EndIf DllCall("user32.dll", "bool", "RedrawWindow", "hwnd", $hWndGui, "struct*", 0, "handle", 0, "uint", 5) EndFunc ;==>_GuiCtrlGroup_Set ; #FUNCTION# ==================================================================================================================== ; Name ..........: _GuiCtrlGroup_SetState ; Description ...: Changes the state of a _GuiCtrlGroup_Create() created control. ; Syntax ........: _GuiCtrlGroup_SetState(ByRef $_structGroup, $_iState, $_aCtrlInside, $_iTxtColor, $_iBGColor) ; Parameters ....: $_structGroup - Return value from _GuiCtrlGroup_Create() ; $_iState - The new state ($GUI_SHOW, $GUI_HIDE, $GUI_ENABLE, $GUI_DISABLE) ; If setting to DISABLE, you can set the title and background colors for this state. ; The previous colors will returned. You can use them for ENABLE again. ; If you use DISABLE without colors, the defaults will used (see constants on top). ; $_aCtrlInside - When you pass an array of controls, they are set to the same state as the group itself. ; $_iTxtColor - The title color if set to enable/disable ; $_iBGColor - The background color if set to enable/disable ; Return values .: Success - Structure with previous title and background color (if state was set to enable/disable) ; $tCOLOR.TextPrev / $tCOLOR.BGPrev ; Failure - returns -1, sets @error = 1 ; Note ..........: Don't forget to catch the return, if sets the state to DISABLE. It's the easiest way to have the right colors to set back the ENABLE state. ; Author ........: BugFix ; =============================================================================================================================== Func _GuiCtrlGroup_SetState(ByRef $_structGroup, $_iState, $_aCtrlInside=Null, $_iTxtColor=Null, $_iBGColor=Null) If Not BitAND(BitOR($GUI_SHOW, $GUI_HIDE, $GUI_ENABLE, $GUI_DISABLE), $_iState) Then Return SetError(1,0,-1) Local Static $aState[4][2] = [[$GUI_SHOW, @SW_SHOW], [$GUI_HIDE, @SW_HIDE], [$GUI_ENABLE, @SW_ENABLE], [$GUI_DISABLE, @SW_DISABLE]] Local $hWndGui = _WinAPI_GetParent(GUICtrlGetHandle($_structGroup.Background)) Local $tCOLOR = DllStructCreate('int BGPrev;int TextPrev;') If $_iState = $GUI_DISABLE Then If $_iTxtColor = Null Then $_iTxtColor = $_GROUP_DISABLE_TXTDEF If $_iBGColor = Null Then $_iBGColor = $_GROUP_DISABLE_BGDEF EndIf $tCOLOR.BGPrev = -1 $tCOLOR.TextPrev = -1 GuiCtrlSetState($_structGroup.Text, $_iState) GuiCtrlSetState($_structGroup.Left, $_iState) GuiCtrlSetState($_structGroup.TopL, $_iState) GuiCtrlSetState($_structGroup.TopR, $_iState) GuiCtrlSetState($_structGroup.Right, $_iState) GuiCtrlSetState($_structGroup.Bottom, $_iState) GuiCtrlSetState($_structGroup.Background, $_iState) If IsArray($_aCtrlInside) Then Local $iWinState For $i = 0 To UBound($aState) -1 If $aState[$i][0] = $_iState Then $iWinState = $aState[$i][1] ExitLoop EndIf Next For $i = 0 To UBound($_aCtrlInside) -1 If IsHWnd($_aCtrlInside[$i]) Then WinSetState($_aCtrlInside[$i], '', $iWinState) Else GuiCtrlSetState($_aCtrlInside[$i], $_iState) EndIf Next EndIf If $_iTxtColor <> Null Then If Not IsDeclared('WM_CTLCOLORSTATIC') Then Local Const $WM_CTLCOLORSTATIC = 0x0138 Local $hWnd = GUICtrlGetHandle($_structGroup.Text) Local $hDC = _WinAPI_GetDC($hWnd) Local $hMemDC = _WinAPI_CreateCompatibleDC($hDC) _WinAPI_ReleaseDC($hWnd, $hDC) Local $hBrush = _SendMessage($hWndGui, $WM_CTLCOLORSTATIC, $hMemDC, $hWnd) Local $BGR = DllCall('gdi32.dll', 'int', 'GetTextColor', 'ptr', $hMemDC) _WinAPI_DeleteDC($hMemDC) $tCOLOR.TextPrev = BitOR(BitShift(BitAND($BGR[0], 0x0000FF), -16), BitAND($BGR[0], 0x00FF00), BitShift(BitAND($BGR[0], 0xFF0000), 16)) GUICtrlSetColor($_structGroup.Text, $_iTxtColor) EndIf If $_iBGColor <> Null Then Local $hWnd = GUICtrlGetHandle($_structGroup.Background) Local $hDC = _WinAPI_GetDC($hWnd) $tCOLOR.BGPrev = _WinAPI_GetPixel($hDC, 0, 0) _WinAPI_ReleaseDC($hWnd, $hDC) GUICtrlSetBkColor($_structGroup.Background, $_iBGColor) EndIf DllCall("user32.dll", "bool", "RedrawWindow", "hwnd", $hWndGui, "struct*", 0, "handle", 0, "uint", 5) Return $tCOLOR EndFunc ;==>_GuiCtrlGroup_SetState ; == for internal use Func __SubCtrlMove($_hGui, ByRef $_structGroup, $_aVal, $_bRel=False, $_iAlign=$_GROUPTEXT_LEFT) Local $idText = $_structGroup.Text Local $idLeft = $_structGroup.Left Local $idTopL = $_structGroup.TopL Local $idTopR = $_structGroup.TopR Local $idRight = $_structGroup.Right Local $idBottom = $_structGroup.Bottom Local $idBackground = $_structGroup.Background Local $dX, $dY, $dW, $dH Local $aSize = ControlGetPos($_hGui, '', $idLeft) Local $aBott = ControlGetPos($_hGui, '', $idBottom) If $_bRel Then $dX = $_aVal[0] $dY = $_aVal[1] $dW = $_aVal[2] $dH = $_aVal[3] If $dX = '*' Then $dX = 0 If $dY = '*' Then $dY = 0 If $dW = '*' Then $dW = 0 If $dH = '*' Then $dH = 0 Else Local $x = $_aVal[0] Local $y = $_aVal[1] Local $width = $_aVal[2] Local $height = $_aVal[3] Local $x0 = $aSize[0] Local $y0 = $aSize[1] -7 Local $width0 = $aBott[2] Local $height0 = $aSize[3] +7 If $x = '*' Then $x = $x0 If $y = '*' Then $y = $y0 If $width = '*' Then $width = $width0 If $height = '*' Then $height = $height0 $dX = $x - $x0 $dY = $y - $y0 $dW = $width - $width0 $dH = $height - $height0 EndIf GUICtrlSetPos($idLeft, $aSize[0]+($dX), $aSize[1]+($dY), 1, $aSize[3]+($dH)) GUICtrlSetPos($idBottom, $aBott[0]+($dX), $aBott[1]+($dY)+($dH), $aBott[2]+($dW)) $aSize = ControlGetPos($_hGui, '', $idTopL) GUICtrlSetPos($idTopL, $aSize[0]+($dX), $aSize[1]+($dY)) $aSize = ControlGetPos($_hGui, '', $idTopR) GUICtrlSetPos($idTopR, $aSize[0]+($dX), $aSize[1]+($dY), $aSize[2]+($dW)) $aSize = ControlGetPos($_hGui, '', $idRight) GUICtrlSetPos($idRight, $aSize[0]+($dX)+($dW), $aSize[1]+($dY), 1, $aSize[3]+($dH)) $aSize = ControlGetPos($_hGui, '', $idBackground) GUICtrlSetPos($idBackground, $aSize[0]+($dX), $aSize[1]+($dY), $aSize[2]+($dW), $aSize[3]+($dH)) $aSize = ControlGetPos($_hGui, '', $idText) If ($dX <> 0) Or ($dY <> 0) Then GUICtrlSetPos($idText, $aSize[0]+($dX), $aSize[1]+($dY)) If $dW <> 0 Then _GuiCtrlGroup_Set($_structGroup, '', $_structGroup.Align) Local $aDelta[] = [$dX,$dY] Return $aDelta EndFunc ;==>__SubCtrlMove Func __ControlMove($_hWnd, $_bhWnd, $_vCtrl, $_aSize, $_dX, $_dY) Local $aParent If Not $_bhWnd Then GUICtrlSetPos($_vCtrl, $_aSize[0]+($_dX), $_aSize[1]+($_dY)) Else $aParent = WinGetPos($_hWnd) WinMove($_vCtrl, '', $_aSize[0]-$aParent[0]-$_giSide+($_dX), $_aSize[1]-$aParent[1]-$_giTop+($_dY)) EndIf EndFunc ;==>__ControlMove ;=============================================================================== ; Function Name....: __SystemGetWindowBorder ; Description......: Calculates side and top border of window ; Author(s)........: BugFix ;=============================================================================== Func __SystemGetWindowBorder(ByRef $_iTopBorder, ByRef $_iSideBorder) Local Const $SM_CYCAPTION = 4, $SM_CYEDGE = 46, $SM_CYBORDER = 6, $SM_CXBORDER = 5, $SM_CXEDGE = 45 Local $aMetrics[5][2] = [[$SM_CYCAPTION], [$SM_CYEDGE], [$SM_CYBORDER], [$SM_CXBORDER], [$SM_CXEDGE]] Local $dll = DllOpen("user32.dll"), $aRet For $i = 0 To 4 $aRet = DllCall($dll, "int", "GetSystemMetrics", "int", $aMetrics[$i][0]) If IsArray($aRet) Then $aMetrics[$i][1] = $aRet[0] Next DllClose($dll) $_iTopBorder = $aMetrics[0][1] + $aMetrics[1][1] + $aMetrics[2][1] $_iSideBorder = $aMetrics[3][1] + $aMetrics[4][1] EndFunc ;==>__SystemGetWindowBorderBsp.
AutoIt
Alles anzeigen#include <GroupEx.au3> #include <GuiComboBox.au3> Global $iGUIColor = 0xFFF9E5 Global $iBGColor = 0xE0F9FF, $iBorderColor = 0x00008B, $iTextColor = 0xC60707 Enum $lbName, $inName, $lbStatus, $inStatus, $lbOrt, $inOrt, $cbNormal, $lbNormal, $combo, $radio1, $radio2, $iCount Global $aID[$iCount] Global $radio3, $radio4 Global $hGui = GUICreate('Example GroupEx', 900, 700) GUISetBkColor($iGUIColor) ; Group erstellen mit Title-Style Italic, Standardausrichtung links Global $tGroup1 = _GuiCtrlGroup_Create($hGui, 'Device Information', 10, 55, 880, 155, $iBorderColor, $iTextColor, $iBGColor, $_GROUPTEXT_ITALIC) $aID[$lbName] = GUICtrlCreateLabel('Title', 25, 83, 70) _BKTrans(-1) $aID[$inName] = GUICtrlCreateInput('', 100, 80, 200, 21) $aID[$lbStatus] = GUICtrlCreateLabel('State', 310, 83, 40) _BKTrans(-1) $aID[$inStatus] = GUICtrlCreateInput('', 355, 80, 115, 21) $aID[$lbOrt] = GUICtrlCreateLabel('Location', 485, 83, 50) _BKTrans(-1) $aID[$inOrt] = GUICtrlCreateInput('', 535, 80, 100, 21) $aID[$cbNormal] = GUICtrlCreateCheckbox(' ', 655, 83, 13, 13) $aID[$lbNormal] = GUICtrlCreateLabel(' Current Sample', 670, 83) _BKTrans(-1) $aID[$combo] = _GUICtrlComboBox_Create($hGui, '', 100, 110, 200, 30) $aID[$radio1] = GUICtrlCreateRadio(' ', 320, 113, 13, 13) GUICtrlSetState(-1, $GUI_CHECKED) $aID[$radio2] = GUICtrlCreateRadio(' ', 340, 113, 13, 13) _GuiCtrlGroup_Close() $radio3 = GUICtrlCreateRadio(' ', 100, 350, 13, 13) GUICtrlSetState(-1, $GUI_CHECKED) $radio4 = GUICtrlCreateRadio(' ', 120, 350, 13, 13) GUISetState() _Msg('Move group downward by 100px with all internal controls ($aID)') _GuiCtrlGroup_Set($tGroup1, '*,100', $_GROUP_MOVE_REL, $aID) _Msg('Group title - set default style') _GuiCtrlGroup_Set($tGroup1, '', $_GROUPTEXT_DEFAULT) _Msg('Group title - set background color - feasible, but not so nice') _GuiCtrlGroup_Set($tGroup1, 0xAAAAFF, $_GROUPTEXT_BACK) _Msg('Group title - set background again transparency') _GuiCtrlGroup_Set($tGroup1, '', $_GROUPTEXT_TRANS) _Msg('Group title - set text color') _GuiCtrlGroup_Set($tGroup1, 0x000080, $_GROUPTEXT_FORE) _Msg('Group border - top and right - change color') _GuiCtrlGroup_Set($tGroup1, 0xFF1234, BitOR($_GROUPBORDER_TOP,$_GROUPBORDER_RIGHT)) _Msg('Group title - centered') _GuiCtrlGroup_Set($tGroup1, '', $_GROUPTEXT_CENTER) _Msg('Group title - right') _GuiCtrlGroup_Set($tGroup1, '', $_GROUPTEXT_RIGHT) _Msg('Group area - change color') _GuiCtrlGroup_Set($tGroup1, 0xAAFFAA, $_GROUPBACKGROUND) _Msg('Group DISABLE (with all controls inside), border color and title BGColor stay unchanged') ; _GuiCtrlGroup_SetState(ByRef $_structGroup, $_iState, $_aCtrlInside= Null, $_iTxtColor=Null, $_iBGColor=Null) ; Here, the current color of title text and group area is queried before the disable color is set. ; The values read out are returned as struct and can then be used again in ENABLE. Global $tColor = _GuiCtrlGroup_SetState($tGroup1, $GUI_DISABLE, $aID) _Msg('Group ENABLE (with all controls inside)') _GuiCtrlGroup_SetState($tGroup1, $GUI_ENABLE, $aID, $tColor.TextPrev, $tColor.BGPrev) _Msg('Group HIDE (with all controls inside)') _GuiCtrlGroup_SetState($tGroup1, $GUI_HIDE, $aID) _Msg('Group SHOW (with all controls inside)') _GuiCtrlGroup_SetState($tGroup1, $GUI_SHOW, $aID) Do Until GUIGetMsg() = -3 Func _BKTrans($_iID) GUICtrlSetBkColor($_iID, $GUI_BKCOLOR_TRANSPARENT) EndFunc Func _Msg($_sMsg) MsgBox(262208, 'Action', $_sMsg, 5) EndFunc -
Kannst du die Controls, die innerhalb der Group sein sollen, nicht besser gleich in _GuiCtrlGroup_Create integrieren... denn dann hätte der User nichts mehr damit zu schaffen?
Meinst du, dass das Array mit den Control-ID beim Erstellen der Group übergeben werden soll?
Das ist m.W. nicht möglich (lass mich aber gern eines Besseren belehren). Um die Group-Funktionalität zu erhalten muss als Erstes GUIStartGroup() ausgeführt werden (letzter Befehl bei _GuiCtrlGroup_Create) und die anschließend erstellten Control sind dann dieser Group zugehörig.
Trotzdem Danke für den Hinweis - dadurch ist mir erst bewusst geworden, dass ich noch eine Möglichkeit zum Schließen der Group einfügen muss.
Falls du aber eine Möglichkeit kennst, nachträglich Control in eine Group einzufügen, ich bin ganz Ohr.
Kannst du anstelle ControlMove nicht GUICtrlSetPos verwenden, wenn eine CtrlID übergeben wurde?
Warum? Weil die geänderte Größe/Position durch ControlMove nur temporär ist und verloren geht, wenn das Fenster minimiert und danach wiederhergestellt wird, mit GUICtrlSetPos aber nicht.Danke, wichtiger Hinweis - ist mir bisher nicht klar gewesen. Wird geändert.
Mit ComboBox/ComboBoxEx funktioniert es wohl nicht?!
Sorry, hatte ich nicht eindeutig beschrieben, für mich war klar, dass Control-ID ($aID) keine Handle sein können. Somit ist es im Moment nur mit nativen Control möglich. Werde ich noch auf die To-Do-List setzen.
Wäre schön, wenn du für _GuiCtrlGroup_Set noch ein Beispiel für $_aCtrlInside hinzufügen würdest.
Hmm, es gibt nur zwei Befehle, bei denen ein $aID übergeben wird.
Einmal bei Verschieben: _GuiCtrlGroup_Set($tGroup1, '*,100', $_GROUP_MOVE_REL, $aID)
und dann noch bei Setzen eines Status: _GuiCtrlGroup_SetState($tGroup1, $GUI_HIDE, $aID)
-
Kann man den Machern nicht mal nahelegen sowas zu ändern....
Kannst du vergessen. Ich habe den Eindruck, dass Bug-Tickets von vornherein als Akt der Beleidigung aufgefasst werden. Somit versteht sich von selbst, dass nicht ernsthaft ins Auge gefasst wird, etwas zu ändern.
Ist ja auch frech, dass User sich erdreisten Eure Hoheiten mit so etwas Profanem, wie Bugs zu belästigen.

-
Aktuelle Version v0.8
Details s. Startpost
-
Ist zwar auch nur ein Gegurke, was mit direktem Management der SQL-DB zu umgehen wäre - aber sei's drum:
- In einer Schleife kontinuierlich Z-Order abfragen (oder besser als Adlib Funktion getimed aufrufen)
- Ist oberstes Fenster dein Fenster? - Tue nix, alles OK
- Wenn nicht: Existiert dein Fenstername in der Z-Order-Liste? Ja- setze OnTop, Nein- tue nix
-
GUICtrlRead($Radio1) = $GUI_CHECKED
Auch wenn der Fall eher selten eintreten wird, aber das Ergebnis von GuiCtrlRead($Radio) ist nicht zwingend nur ein Wert, sondern kann eine Kombination von Werten sein.
Deshalb auf Nummer sicher gehen und sich angewöhnen: If BitAND(GUICtrlRead($Radio), $GUI_CHECKED) Then
-
Das mit den StringFormat finde ich sehr Kompliziert ehrlich gesagt :o mein Problem was ich jetzt habe ist die Variable mit einzubinden.
Wenn du Strings auf ganz bestimmte Längen bringen möchtest, Vornullen beachten musst - dann wird es (aber auch nur minimal) kompliziert.
Für das Zusammenstellen von z.B. CMD-Line Befehlsketten brauchst du für jede Variable einfach nur %s im FormatString verwenden.
Aus einem nicht zwingend übersichtlichem $CMD1 = "C:\Winscp\winscp.com /Command ""open sftp://XXX:XXX@XXX/"" ""put C:\" & $DateiName & " /test/"""
wird dann:
$DateiName = 'C:\test.txt'
$CMD1 = StringFormat('C:\Winscp\winscp.com /Command "open sftp://XXX:XXX@XXX/" "put %s /test/"', $DateiName)
Der klare Vorteil dieser Variante: Man schreibt genau so, wie in der Kommandozeile auch.
Bei mehreren Variablen, werden diese einfach in der Reihenfolge ihres Auftretens im FormatString aufgeführt.
-
_WinApi_GetCaretPos scheint falsch implementiert zu sein, liefert immer einen Fehler.
Zur Positionsbestimmung des Cursors aber auch völlig unnötig: