Meinst du so?
[autoit]While 1 ; Endlosschleife
If $var Then ; wenn $var True dann
Do
; irgendein Code
Until Not $var ; bis $var False
EndIf
WEnd
Meinst du so?
[autoit]While 1 ; Endlosschleife
If $var Then ; wenn $var True dann
Do
; irgendein Code
Until Not $var ; bis $var False
EndIf
WEnd
Also so wie in meinem Post?
Ja, wobei Band in Rebar wieder eins der Worte ist, dessen Bedeutung klar ist, man aber keine sinnvolle Übersetzung findet. Ein Grund mehr nicht nach Übersetzungen zu suchen.
siehst du
Parent Item, Child Item, String, non-zero auch als Steuerelement an
Wenn es selbst auch keine Controls sind, so sind sie absolut selbsterklärend (auch ohne große Englisch-Kenntnisse) und bei non-zero würde ich eine Übersetzung glatt verweigern.
Nicht-Null ?? Sachlich korrekt, aber sieht und klingt irgendwie blöd. ![]()
Ich bleibe dabei:
Namen von Controls sollten keinesfalls übersetzt werden!
Es ist doch völlig ausreichend, wenn im Glossar eine nähere Beschreibung/Erklärung vorhanden ist. ![]()
Zum Editor ersetzen hatte ich mal einen Launcher gebastelt. Da die Notepad.exe unter Umständen 4-fach vorhanden ist, müssen alle Vorkommen auch außer Betrieb gesetzt werden.
Vielleicht nützt es dir was. https://autoit.de/index.php?page…31932#post31932
Hier mal eine Bsp.-Lösung. Übrigens braucht man WM_MOVE ja gar nicht. Das Child ist durch die Definition bereits an das Parent gekettet und verarbeitet somit auch die MOVE Message des Parents.
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
$GUI = GUICreate('TEST', -1, -1, -1, -1, Default, $GUI_WS_EX_PARENTDRAG)
$Edit = GUICtrlCreateEdit('Dieser' & @CRLF & 'Text' & @CRLF & 'darf' & @CRLF & 'nicht' _
& @CRLF & '- gelöscht' & @CRLF & '- geändert' & @CRLF & 'oder' & @CRLF & 'sonstwie' _
& @CRLF & 'manipuliert' & @CRLF & 'werden', 10, 10, 180, 120, BitOR($WS_VSCROLL, $WS_HSCROLL))
$Button = GUICtrlCreateButton('Ende', 10, 140, 50, 20)
ControlFocus($GUI, '', $Button)
Global Const $SM_CAPTION = _WinAPI_GetSystemMetrics(4)
Global Const $SM_HOR_SB = _WinAPI_GetSystemMetrics(10) -1 ; Breite der Scrollbox auf horizontalaer Scrollbar (-1 zum Überlappen)
Global Const $SM_VER_SB = _WinAPI_GetSystemMetrics(9) -1 ; Breite der Scrollbox auf vertikaler Scrollbar
$E_Pos = ControlGetPos($GUI, '', $Edit)
$Child = GUICreate('', $E_Pos[2]-$SM_VER_SB, $E_Pos[3]-$SM_HOR_SB, $E_Pos[0], $E_Pos[1]+$SM_CAPTION, $WS_POPUP, $WS_EX_MDICHILD, $GUI)
GUISetBkColor(0xff0000, $Child)
WinSetTrans($Child, '', 40)
GUISetState(@SW_SHOW, $Child)
GUISetState(@SW_SHOW, $GUI)
GUIRegisterMsg($WM_COMMAND, "MY_WM_COMMAND")
[/autoit] [autoit][/autoit] [autoit]While 1
$msg = GUIGetMsg()
Switch $msg
Case $Button, -3
Exit
EndSwitch
If BitAND(WinGetState($Child),
Then
GUISetState(@SW_RESTORE, $GUI)
EndIf
WEnd
Func MY_WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
If $lParam = GUICtrlGetHandle($Edit) Then
ControlFocus($GUI, '', $Button) ; wenn Focus auf Edit ==> Focus auf anderes Ctrl setzen
EndIf
Return $GUI_RUNDEFMSG
EndFunc
Ja ok. Aber ist das nicht etwas unprofessionell? Was ist, wenn man die MainGUI veschiebt? Dann bleibt doch das Transparente Fenster an der selben stelle
Das kannst du mit WM_MOVE abfangen und dann dein Child mitverschieben.
Und wieso unprofessionell? Wenn etwas ohne viel Aufwand funktioniert ist doch OK - oder?
aber ich denke mal die Breite von Scrollbars variiert je nach Style
Das kannst man mit _WinAPI_GetSystemMetrics ermitteln.
Es kommt sicher auf den Verwendungszweck an. Vollständigerweise muß man hinzufügen, dass bei dieser Methode der User die Möglichkeit hat, sich per Tastatur in das Editfeld zu bewegen und dann zu manipulieren. Aber da kann man auch die Cursorposition abfangen und entsprechend reagieren.
Hi, du brauchst 'ne Endlosschleife (While - WEnd) und darin prüfst du mit Winwait() auf das Erscheinen der Meldung. Dann simulierst du OK-Klick und die Schleife wartet erneut auf das Erscheinen der Fehlermeldung.
Wir wollen mal nicht mit Kanonen auf Spatzen schießen. ![]()
Hierfür braucht es wahrlich keinen Hook. Leg einfach ein Child-GUI (POPUP) exakt über das Edit und laß nur die Scrollbar frei. Transparenz auf 0 und fertig. ![]()
Ich verwende dafür Dualzahlen. Dann kannst du ganz simpel aus der Summe prüfen, welche Boxen gecheckt sind. Macht hier die Funktion _ReadCB().
; Muster Checkbox-Bearbeitung
; Ziel: einfache Abfrage, welche CB aktiviert sind
#include <GUIConstants.au3>
Opt('GUIOnEventMode', 1)
Opt("MustDeclareVars", 1)
Global $bCheckAll, $bUnCheckAll, $GUI, $i, $str
Global $arCB[20][2] ; Array für Handle und Dual-Wert der CB
For $i = 0 To UBound($arCB) -1
$arCB[$i][1] = 2^$i ; Zuweisung eindeutiger Wert
Next
Global $Checked = 0 ; Variable nimmt Status ALLER Checkboxen in einem Wert auf,
; Startstatus für alle: UNCHECKED
Global $w = 500, $h = 20*30+40, $l = (@DesktopWidth-$w)/2, $t = (@DesktopHeight-$h)/2
Global $top = -10
$GUI = GUICreate('Test Checkbox', $w, $h, $l, $t)
GUISetOnEvent($GUI_EVENT_CLOSE, '_Ende')
For $i = 0 To UBound($arCB) -1
$top += 30
$arCB[$i][0] = GUICtrlCreateCheckbox('CheckBox_' & $i+1, 40, $top, 120)
GUICtrlSetOnEvent(-1, '_ClickCB')
Next
$bCheckAll = GUICtrlCreateButton('Alle markieren', 250, 20, 150, 21)
GUICtrlSetOnEvent(-1, '_CheckAll')
$bUnCheckAll = GUICtrlCreateButton('Markierung aufheben', 250, 50, 150, 21)
GUICtrlSetOnEvent(-1, '_UnCheckAll')
GUISetState()
While 1
Sleep(100)
WEnd
Func _Ende()
Exit
EndFunc
Func _ClickCB()
For $i = 0 To UBound($arCB) -1
If $arCB[$i][0] = @GUI_CtrlId Then
$Checked = BitXOR($Checked, $arCB[$i][1])
_ReadCB()
ExitLoop
EndIf
Next
EndFunc
Func _CheckAll()
For $i = 0 To UBound($arCB) -1
If Not BitAND($Checked, $arCB[$i][1]) Then
GUICtrlSetState($arCB[$i][0], $GUI_CHECKED)
$Checked = BitXOR($Checked, $arCB[$i][1])
EndIf
Next
_ReadCB()
EndFunc
Func _UnCheckAll()
For $i = 0 To UBound($arCB) -1
If BitAND($Checked, $arCB[$i][1]) Then
GUICtrlSetState($arCB[$i][0], $GUI_UNCHECKED)
$Checked = BitXOR($Checked, $arCB[$i][1])
EndIf
Next
_ReadCB()
EndFunc
Func _ReadCB() ; Fkt. dient nur zur Ausgabe, welche CB markiert sind
Local $str = 'Markiert: '
For $i = 0 To UBound($arCB) -1
If BitAND($Checked, $arCB[$i][1]) Then $str &= $i+1 & ', '
Next
WinSetTitle($GUI, '', StringTrimRight($str, 2))
EndFunc
Warum willst du eigentlich zum Sound noch 'ne MsgBox einblenden?
Also Überwachung, ob auf eine Sounddatei zugegriffen wird soll es werden. Da fällt mir adhoc nix ein.
Wenn ich nicht irre, wird die Datei ja nicht mal vom System gesperrt. Abspielen ist ja reiner Lesevorgang und das könnten mehrere Anwendungen zeitgleich tun. Insofern habe ich keinen Ansatz, woher die Info stammen soll, dass die Datei in Benutzung ist.
wenn ein Windows Ton geöffnet wird
Was ist Windows Ton ?
Meinst du wenn irgendein Sound abgespielt wird?
Danke für beide Ideen.
Oscar : Das ist dann ein klares Votum für das Dictionary Object.
Erspart mir dann auch einiges an Arraymanagement. Werde beim Löschen von Werten dann das Array nicht mehr verändern, sondern nur den Schlüsselwert entfernen. Bringt auch wieder Zeitgewinn.
Ist eigentlich für ein altes Projekt, dass aber einer Optimierung bedarf. ![]()
Wenn alles fertig ist, zeig ich euch, was draus geworden ist.
OK, Danke.
Ich hatte überlegt, ob es Sinn macht, wie bei Quicksearch vorzugehen. Bloß bei unsortiert müßte ich dann willkürlich die Richtung wechseln und noch zusätzlich die Bereiche verwalten.
Dann bleib ich bei meiner Version.
Sortiert sind die Daten nur direkt nach dem Erstellen. Mögliches Löschen von Elementen führt allerdings zu einer geänderten Reihenfolge, da aus Geschwindigkeitsgründen das letzte Arrayelement an die Position des gelöschten geschrieben und dann das Array per ReDim verkleinert wird.
Hi,
ich habe ein 3D-Array, das durchaus einige hundert Einträge haben kann.
Nun suche ich eine Möglichkeit dieses Array effektiv zu durchsuchen. Bisher iteriere ich durch das Array, was bei vielen Elementen nicht unbedingt zügig ist. Die Suchposition ist fix, s. Code.
Local $ar3D[500][20][5]
[/autoit][autoit][/autoit][autoit]Func __ArraySearch(ByRef $array, $search)
For $i = 0 To UBound($array) -1
If $array[$i][0][0] = $search Then
Return $i
EndIf
Next
Return -1
EndFunc ;==>__ArraySearch
Falls ihr Ideen habt, immer her damit. ![]()
Schau dir mal StdoutRead() an.
Wo finde ich die Funktionen GetModuleHandle und LoadImage?
Ja, sind auch in der WinApi.au3
Vielleicht ein Kompromiß-Vorschlag:
Die Namen der Controls werden überhaupt nicht übersetzt! Es wird ein Glossar angefügt, indem dann eine deutsche Be- und/oder Umschreibung zu dem Begriff steht.
Mir persönlich rollen sich die Fußnägel auf, wenn ich z.B. das Wort Listenansicht lese (Grrrr).
Ich kenne keine in deutsch erstellten Programmiersprachen. Weshalb soll man also mühselig deutsche Entsprechungen für Begriffe suchen, deren Bedeutung absolut unstrittig ist. Das ergibt für mich keinen Sinn und erinnert mich an ähnliche Vergewaltigungen der Sprache um Gleichberechtigung der Geschlechter durchzusetzen. (Da hatten wir mal eine Gleichstellungsbeauftragte in der Landesregierung, die dann für Bürgermeister das geschlechtsneutrale Wortungetüm die Person, die das Amt des Bürgermeisters innehat erschuf.) ![]()
Die Spaltenbreite fixieren, ob das per Style geht, weiß ich grad nicht. Aber so geht es auf jeden Fall:
#include <ListViewConstants.au3>
#include <StructureConstants.au3>
#include<GUIConstantsEx.au3>
#include<WindowsConstants.au3>
#include <GUIListView.au3>
$gui = GUICreate('test')
$hListView = GUICtrlCreateListView('Spalte1|Spalte2', 10, 10, 300, 200)
_GUICtrlListView_SetColumnWidth($hListView, 0, 146)
_GUICtrlListView_SetColumnWidth($hListView, 1, $LVSCW_AUTOSIZE_USEHEADER)
For $i = 1 To 10
GUICtrlCreateListViewItem('Zeile ' & $i & ' Spalte 1|Zeile ' & $i & ' Spalte 2', $hListView)
Next
; hier für Vergleich die Spaltenbreite speichern:
Global $aColumnWidth[_GUICtrlListView_GetColumnCount($hListView)]
For $i = 0 To UBound($aColumnWidth) -1
$aColumnWidth[$i] = _GUICtrlListView_GetColumnWidth($hListView, $i)
Next
GUISetState()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
[/autoit] [autoit][/autoit] [autoit]Do
$msg = GUIGetMsg()
Until $msg = $GUI_EVENT_CLOSE
Func _Columnwidth()
For $i = 0 To UBound($aColumnWidth) -1
If _GUICtrlListView_GetColumnWidth($hListView, $i) <> $aColumnWidth[$i] Then
_GUICtrlListView_SetColumnWidth($hListView, $i, $aColumnWidth[$i])
EndIf
Next
EndFunc
Func WM_NOTIFY($hWnd, $iMsg, $iwParam, $ilParam)
Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR, $hWndListView
$hWndListView = $hListView
If Not IsHWnd($hListView) Then $hWndListView = GUICtrlGetHandle($hListView)
$tNMHDR = DllStructCreate($tagNMHDR, $ilParam)
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
$iCode = DllStructGetData($tNMHDR, "Code")
Switch $hWndFrom
Case $hWndListView
Switch $iCode
Case -12 ; Spaltenbreite wurde verändert
_Columnwidth()
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_NOTIFY