a) Es gibt eine CSV-UDF, wenn ich nicht irre - schau mal im EN-Forum
b) oder ganz einfach: schau dir
StringSplit
; und
FileReadToArray
an
a) Es gibt eine CSV-UDF, wenn ich nicht irre - schau mal im EN-Forum
b) oder ganz einfach: schau dir
StringSplit
; und
FileReadToArray
an
Übrigens fehlt dir eine auch in Deutschland verwendete Form der Rufnummern (Vanity-Rufnummern): "0180/0700/0800/0900 MEINEFIRMA" ![]()
Sinnvoll ist es zuerst die Rufnummern in mit RegExReplace zu bearbeiten, also alle nicht wählbaren Zeichen rauszuwerfen (Leerzeichen, Klammern, Bindestrich) und z.B. "+" durch "00" und Großbuchstaben durch die entsprechenden Ziffern der Telefontastatur zu ersetzen. Die dann erhaltene Rufnummer kannst du mit einem einfachen Pattern testen, da du ja jetzt alles nach einem Muster aufgebaut hast, nämlich nur noch Ziffern mit einer evtl führenden Doppelnull.
Wobei dann für die Vanity-Nummern noch folgende Regeln zu beachten sind:
0180 und 6 od. 7 Zeichen
0700 und bis 8 Zeichen
0800 und bis 7 Zeichen
0900 und bis 6 Zeichen
EDIT:
Hier mal eine Lösung - aber erst gucken, wenn du gar nicht klar kommst. ![]()
;===============================================================================
; Function Name....: _ValidatePhoneNumber
; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
;===============================================================================
Func _ValidatePhoneNumber($_sNumber)
$_sNumber = StringRegExpReplace($_sNumber, '\+', '00')
$_sNumber = StringRegExpReplace($_sNumber, '(-|\s|\(|\)|/|\\)', '')
If StringRegExp($_sNumber, '^0{0,2}(49)?(180[1-9]|700|800|900)[A-Z]+') Then ; Vanity-Number?
; Vorwahl und zugehörige Nummernlänge prüfen
Local $aMatch = StringRegExp($_sNumber, '((?:180|700|800|900))[1-9]?([A-Z]+)', 1)
Local $fReturn = 0, $iLen = StringLen($aMatch[1])
Switch StringLeft($aMatch[0], 4)
Case '180'
If $iLen = 6 Then $fReturn = 1
Case '700'
If $iLen <= 8 Then $fReturn = 1
Case '800'
If $iLen <= 7 Then $fReturn = 1
Case '900'
If $iLen <= 6 Then $fReturn = 1
EndSwitch
Return $fReturn
Else
Return StringRegExp($_sNumber, '(^0{0,2})[1-9]\d+')
EndIf
EndFunc
Ein Problem ist mir beim Schreiben dieses Posts aufgefallen: Ich hatte erst "Antworten" gewählt und geschrieben, dann fiel mir ein, dass ich ja Dateien anhängen möchte und so klickte ich auf "Erweiterte Antwort". Dann ist aber alles bereits Geschriebene futsch. ![]()
Noch eine Überlegung zu farblicher Gestaltung. Einige Elemente nutzen schwarze Schrift auf orange. Vielleicht doch lieber weiß dafür? Vergleicht mal:
Du kannst Tage im Monatskalender markieren. Dazu muß eine Maske übergeben werden. Aus mir unverständlichen Gründen wurde zu dieser nicht ganz einfachen Erstellung der Maske keine Funktion in die UDF integriert. Ich hatte deshalb bereits 2009 die fehlende Funktion erstellt, aber wie nicht anders zu erwarten lehnen die Jungs im EN-Forum es ab Funktionen die das Leben erleichtern mit in die Bibliothek aufzunehmen.
Da die Forensuche zur Zeit immer auf die Startseite verlinkt poste ich mal ein Bsp-Skript:
#include <GuiConstantsEx.au3>
#include <GuiMonthCal.au3>
#include <WindowsConstants.au3>
Example()
[/autoit] [autoit][/autoit] [autoit]Func Example()
GUICreate("Month Calendar Set Day State", 400, 300)
Local $hMonthCal = GUICtrlCreateMonthCal("", 4, 4, -1, -1, BitOR($WS_BORDER, $MCS_DAYSTATE), 0x00000000)
; $aMasks ist ein Array in dem die Masken für die Kalenderdarstellung übergeben werden
Local $aMasks[_GUICtrlMonthCal_GetMonthRangeSpan($hMonthCal, True)]
; an Index [1] von $aMask wird die HexMask für die zu markierenden Tage gesetzt
$aMasks[1] = _GetHexMask('1,5,6,8,12,22,23,24,30', ',')
GUISetState()
[/autoit] [autoit][/autoit] [autoit]_GUICtrlMonthCal_SetDayState($hMonthCal, $aMasks)
[/autoit] [autoit][/autoit] [autoit]Sleep(1500)
$aMasks[1] = _GetHexMask('1,2,3,12,13,14,29,30', ',')
_GUICtrlMonthCal_SetDayState($hMonthCal, $aMasks)
ConsoleWrite('Markierte Tage sind: ' & _DecodeHexMask($aMasks[1], False, ',') & @CRLF)
Sleep(1500)
$aMasks[1] = _GetHexMask('11', ',')
_GUICtrlMonthCal_SetDayState($hMonthCal, $aMasks)
ConsoleWrite('Markierte Tage sind: ' & _DecodeHexMask($aMasks[1], False, ',') & @CRLF)
Sleep(1500)
$aMasks[1] = _GetHexMask('') ; Markierung löschen
_GUICtrlMonthCal_SetDayState($hMonthCal, $aMasks)
ConsoleWrite('Markierte Tage sind: ' & _DecodeHexMask($aMasks[1], False, ',') & @CRLF)
; oder als Array übergeben
Sleep(1500)
Local $a[9] = [1,5,6,8,12,22,23,24,30]
$aMasks[1] = _GetHexMask($a)
_GUICtrlMonthCal_SetDayState($hMonthCal, $aMasks)
ConsoleWrite('Markierte Tage sind: ' & _DecodeHexMask($aMasks[1], False, ',') & @CRLF)
Sleep(1500)
Local $b[8] = [1,2,3,12,13,14,29,30]
$aMasks[1] = _GetHexMask($b)
_GUICtrlMonthCal_SetDayState($hMonthCal, $aMasks)
ConsoleWrite('Markierte Tage sind: ' & _DecodeHexMask($aMasks[1], False, ',') & @CRLF)
Sleep(1500)
Local $c[1] = [11]
$aMasks[1] = _GetHexMask($c)
_GUICtrlMonthCal_SetDayState($hMonthCal, $aMasks)
ConsoleWrite('Markierte Tage sind: ' & _DecodeHexMask($aMasks[1], False, ',') & @CRLF)
Sleep(1500)
Local $d[1] = ['']
$aMasks[1] = _GetHexMask($d)
_GUICtrlMonthCal_SetDayState($hMonthCal, $aMasks)
ConsoleWrite('Markierte Tage sind: ' & _DecodeHexMask($aMasks[1], False, ',') & @CRLF)
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
EndFunc ;==>Example
;===============================================================================
; Function Name..: _GetHexMask($vDays [, $Delim=Default])
; Description....: Codiert die übergebenen Tageszahlen (1-31) als Hex-String, wie er als Maske zum Markieren mit _GUICtrlMonthCal_SetDayState
; ...............: im MonthCal Anwendung findet
; Parameter(s)...: $vDays Trennzeichenbasierter String oder Array mit den zu markierenden Tagen
; ...............: $Delim das Trennzeichen, Standard ist 'Default' (Zeichen von 'GUIDataSeparatorChar')
; Return Value(s): Hexstring für $aMasks
; Author(s)......: BugFix ([email='bugfix@autoit.de'][/email])
;===============================================================================
Func _GetHexMask($vDays, $sDelim=Default)
If $sDelim = Default Then $sDelim = Opt('GUIDataSeparatorChar')
If (( Not IsArray($vDays) ) And ($vDays = '') ) Or _
(( IsArray($vDays) ) And ($vDays[0] = '') ) Then
Return '0x0'
Else
Local $aDays
If (Not IsArray($vDays)) Then
$aDays = StringSplit($vDays, $sDelim, 2)
Else
$aDays = $vDays
EndIf
Local $aHex[8] = [0,0,0,0,0,0,0,0], $pos, $mask = ''
For $i = 0 To UBound($aDays) -1
Select
Case $aDays[$i] < 5
$pos = 0
Case $aDays[$i] < 9
$pos = 1
Case $aDays[$i] < 13
$pos = 2
Case $aDays[$i] < 17
$pos = 3
Case $aDays[$i] < 21
$pos = 4
Case $aDays[$i] < 25
$pos = 5
Case $aDays[$i] < 29
$pos = 6
Case Else
$pos = 7
EndSelect
$aDays[$i] -= $pos * 4
$aHex[$pos] += Int(2 ^ ($aDays[$i]-1))
Next
For $i = 0 To UBound($aHex) -1
$mask = Hex($aHex[$i], 1) & $mask
Next
Return '0x' & $mask
EndIf
EndFunc ;==>_GetHexMask
;===============================================================================
; Function Name..: _DecodeHexMask($sHex [, $fArray=True[, $Delim=Default]])
; Description....: Gibt die mit _GetHexMask() codierten Tageszahlen (1-31) als Array (Standard) oder Trennzeichenstring zurück
; Parameter(s)...: $sHex Der Hex-String mit dem/den codierten Zahlenwert/-en
; ...............: $fArray Rückgabe als Array (Standard), $a[0]=Anzahl oder String mit Trennzeichen
; ...............: $Delim Das Trennzeichen für Stringausgabe, Standard ist 'Default' (Zeichen von 'GUIDataSeparatorChar')
; Return Value(s): Array/String mit den im Hex-String codierten Tageszahlen
; Author(s)......: BugFix ([email='bugfix@autoit.de'][/email])
;===============================================================================
Func _DecodeHexMask($sHex, $fArray=True, $sDelim=Default)
If $sDelim = Default Then $sDelim = Opt('GUIDataSeparatorChar')
Local $aHex = StringSplit(Hex($sHex, 8), '', 2), $iInt, $sOut = ''
Local $aMask[8][4] = [[29,30,31],[25,26,27,28],[21,22,23,24],[17,18,19,20],[13,14,15,16],[9,10,11,12],[5,6,7,8],[1,2,3,4]]
For $i = 7 To 0 Step -1
$iInt = Int('0x' & $aHex[$i])
If $iInt = 0 Then ContinueLoop
For $j = 0 To 3
If BitAND($iInt, 2^$j) Then
$sOut &= $aMask[$i][$j] & ","
$iInt = BitXOR($iInt, 2^$j)
EndIf
Next
Next
If $fArray Then Return StringSplit(StringTrimRight($sOut, 1), ',')
Return StringTrimRight($sOut, 1)
EndFunc ;==>_DecodeHexMask
Es gibt keine getrennten Versionen für Desktop und Mobilgeräte.
Aber zumimdest ist die Darstellung auf Mobilgeräten unvollständig. In der Beitragsliste sind die Spalten für Zugriffe und Antworten nicht sichtbar, somit kann man nicht direkt zum letzten Beitrag springen.
So sieht es aus: http://piks.nl/zZ4
EDIT:
Da war ich zu vorschnell, es ist nur ein anderes Verhalten. Klicke ich am PC auf die Überschrift des Threads, wird zum Start Thema gesprungen. Auf mobilen Geräten springt man damit zum letzten Beitrag.
Praktisch, wenn man es weiß. ![]()
Ist "style-6.css" die einzige verwendete Styles-Datei?
Ich habe sie mir mal geladen und werde Stück für Stück dran basteln. Wenn ich was brauchbares habe, wird es natürlich gepostet.
Könnt ihr das nachvollziehen:
Ich bin im Portal/Dashboard (2 Beiträge sind als neu markiert) und klicke auf "alles als gelesen markieren". Dann werden aber die ersten 5 Beiträge als ungelesen markiert. Erst mit dem nächsten Klick wird alles als ungelesen markiert.
Konnte ich bereits mehrfach reproduzieren.
Ein weiteres Problem entdeckt:
Ich weiß nicht ob es mehrere Posts betrifft, aber in "_String_Balanced --> Text zwischen korrespondierenden Klammern" ist alles aus den Fugen geraten. Die Anhänge werden als Text dargestellt.
Oder ganz simpel so:
$hGui = GUICreate('Test', 400, 200)
$cBtnErr = GUICtrlCreateButton('Generiere Fehler', 10, 20, 120, 22)
$cInput = GUICtrlCreateInput('', 0, 175, 400, 20)
GUISetState()
$iErr = 0
[/autoit] [autoit][/autoit] [autoit]While True
Switch GUIGetMsg()
Case -3
Exit
Case $cBtnErr
$iErr = Random(1,5,1)
EndSwitch
If $iErr Then
GUICtrlSetData($cInput, 'Error = ' & $iErr)
$iErr = 0
EndIf
WEnd
Das Like-System könnte man aber auch für Gäste freischalten, die beim Googlen über das Forum gestolpert sind und dabei die Lösung gefunden haben
DAS kann doch nicht dein Ernst sein? Da stehen die Like-Bots schon Schlange, weil sich ja nicht mal registriert werden muß um dass Forum durch eine Like-Attacke lahm zu legen. ![]()
Und der Wert dieses Counters hat sich dann auch total erübrigt. Glaubst du wirklich es sind nur Gutmenschen unterwegs? Weißt doch selbst, was für Scharen an Bot-Kids teilweise einfallen. Wenn diese degenerierten Pfeifen dann nicht mal sich registrieren müssen um Unfug zu treiben - Na Gute Nacht!
Ich denke, das muss nun nicht weiter erörtert werden. Es ist sicher für jeden ersichtlich, dass wir hier konträre Standpunkte vertreten.
Bis jetzt habe ich kein Argument gefunden, dass mich in meiner Haltung erschüttert - gleiches ist "auf der anderen Seite" der Fall.
Aber auch das ist letztlich normal, schließlich wird es immer unterschiedliche Meinungen geben.
Zumindest ist es erfreulich, dass ein Meinungsstreit möglich ist, der auf Argumenten fußt und nicht mit wilden Emotionen betrieben wird. ![]()
Gerade Sprache ist etwas, das ständig im Fluss ist.
Dass Sprache Veränderungen unterliegt ist selbstverständlich. Aber Sprache ist auch Identität und die ist kaum noch gegeben, wenn sich keiner mehr wagt deutsch zu reden, weil englische (oder englisch scheinende Kunstwörter wie Handy) die deutsche Sprache überfluten, da es "in" ist. Ist in meinen Augen in erster Linie dem fehlenden Selbstbewußtsein der meisten Menschen geschuldet, die dann einfach mit der Herde laufen und jeden Dreck nachbrabbeln.
Und insofern sehe ich auch Entwicklungen im Web sehr kritisch und es ist doch berechtigt auch nach einem zu erwartenden Nutzen zu fragen und diesen auch zu fordern. Und da wiederhole ich gerne: Nur weil etwas möglich ist, muß man es noch lange nicht tun.
Warum speicherst du die Dateien nicht in einem Ordner der mit der Dropbox synchronisiert wird? Das ist doch der Gedanke hinter Dropbox: Egal an welcher Hardware du bist, du kannst überall dieselben Daten haben. Ist auch praktisch - bin ich unterwegs, mache ich Einträge übers Handy in mein Fahrtenbuch (Exceltabelle). Komme ich nach Hause und schmeiße den Rechner an kann ich sofort mit den aktuellen daten auf meiner Rechnerkopie arbeiten, da diese sofort synchronisiert wird.
Ich versuche mal anhand eines Bsp. deutlich zu machen, welche "Gefahr" wir sehen.
Geht mal in den Supermarkt und versucht Produkte zu finden die deutlich vordergründig oder sogar ausschließlich deutsch beschriftet sind. - Wird schwierig und umfasst dann nur wenige Prozent der Produktpalette.
Das kann man dann ohne Ende fortführen: Die Imbißbude heißt jetzt "Snack Bar" der Hausmeister nennt sich "Facility Manager" etc. pp.
Ich vergleiche das Forum mit der Deutschen Sprache. Läßt man solche kranken Einflüsse zu, gehts den Bach runter.
Da muss ich dem Andy total zustimmen.
Deshalb ist AspirinJunkies Vorschlag mit dem Danke, das nur für den Empfänger und ohne Zähler sichtbar ist m.M. nach das Einzige überhaupt tolerierbare. Wobei ich dann aber die Option haben möchte, für mich diese Dinger auf nicht sichtbar zu schalten. Ich will nicht liken und auch nicht geliked werden. Wer wirklich Hilfe durch mich erfahren hat, kann das gerne in Worten ausdrücken, dafür bin ich dann auch empfänglich. Aber ein blöder Counter der in meinem Beitrag tackert ist das letzte was ich sehen will.
Wenn wir etwas tun, nur weil es doch alle anderen auch machen, werden wir eines haben: Ein ständig steigendes Foren-Niveau-wo-wo... ![]()
Kann man die Möglichkeiten der Attribute irgendwo nachlesen?
Klick dich mal durch: http://msdn.microsoft.com/en-us/library/…office.11).aspx
Bisher ging das ja noch ganz gut über
Daran hat sich doch nichts geändert. ".Font.Name" ist ein Attribut, das über Range oder Cells gesetzt werden kann. Völlig unabhängig von AutoIt.
Nein - nicht Emulate sondern Enumerate (Aufzählen). ![]()
Aber es geht besser mit einem Dll-Call für GetComboboxInfo.
(Falls der Code nicht richtig dargestellt wird - folgende Includes brauchst du:
<GuiComboBoxEx.au3>
<GUIConstantsEx.au3>
<GuiListBox.au3> )
#include <GuiComboBoxEx.au3>
#include <GUIConstantsEx.au3>
#include <GuiListBox.au3>
Example()
[/autoit] [autoit][/autoit] [autoit]Func Example()
; create structure to receive combobox infos
Local $tagCOMBOBOXINFO = 'struct;dword cbSize;int[4];int[4];dword stateButton;hwnd hwndCombo;hwnd hwndItem;hwnd hwndList;endstruct'
Local $tCOMBOBOXINFO = DllStructCreate($tagCOMBOBOXINFO)
DllStructSetData($tCOMBOBOXINFO, 'cbSize', DllStructGetSize($tCOMBOBOXINFO))
Local $pCOMBOBOXINFO = DllStructGetPtr($tCOMBOBOXINFO)
Local $hGUI, $hCombo
[/autoit] [autoit][/autoit] [autoit]; Create GUI
$hGUI = GUICreate("ComboBoxEx Get ComboBox Info", 400, 300)
$cCombo = GUICtrlCreateCombo('', 10, 10, 200, 22)
$hCombo = GUICtrlGetHandle($cCombo)
GUISetState(@SW_SHOW)
; Add values
GUICtrlSetData($cCombo, 'Eins|Zwei|Drei|Vier|Fünf', 'Eins')
; ask for Combobox Info
$aRet = DllCall('user32.dll', 'int', 'GetComboBoxInfo', 'hwnd', $hCombo, 'ptr', $pCOMBOBOXINFO)
If Not @error Then
$hList = DllStructGetData($tCOMBOBOXINFO, "hwndList")
$iCount = _GUICtrlListBox_GetCount($hList)
For $i = 0 To $iCount -1
ConsoleWrite('DropdownList Item-' & $i+1 & ' : ' & _GUICtrlListBox_GetText($hList, $i) & @CRLF)
Next
EndIf
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
EndFunc ;==>Example
In Zeile 33 taucht ein überzähliges ; auf. Der Syntaxhighlighter ist hier noch nicht ganz auf dem Laufenden... ![]()
So ist es korrekt: ConsoleWrite('DropdownList Item-' & $i+1 & ' : ' & _GUICtrlListBox_GetText($hList, $i) & @CRLF)
EDIT:
So - das war jetzt die schwierige Variante. Ich konnte mich aber erinnern, dass es irgendeine fertige Func in den UDF geben muss. Nun gefunden:
#include <GuiComboBoxEx.au3>
#include <GUIConstantsEx.au3>
Example1()
[/autoit] [autoit][/autoit] [autoit]Func Example1()
Local $hGUI, $hCombo
; Create GUI
$hGUI = GUICreate("ComboBoxEx Get ComboBox Info", 400, 300)
$cCombo = GUICtrlCreateCombo('', 10, 10, 200, 22)
$hCombo = GUICtrlGetHandle($cCombo)
GUISetState(@SW_SHOW)
; Add values
GUICtrlSetData($cCombo, 'Eins|Zwei|Drei|Vier|Fünf', 'Eins')
$sItem = _GUICtrlComboBoxEx_GetList($hCombo)
ConsoleWrite("@@ Debug line" & @TAB & @ScriptLineNumber & " var: $sItem --> " & $sItem & @LF)
Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE
EndFunc ;==>Example
Die Liste mit den Einträgen ist ein Child der Combo, so in etwa sollte das mgl. sein:
- Handle der Combo holen
- Enumerate Windows dafür durchführen um das Child-Handle zu bekommen (du müsstest zwei Childs finden: Input und Liste)
- mit dem Child-Handle kannst du den Listeninhalt abfragen
- Schriftartauswahl im Editor wird nicht übernommen
- Kopieren von Inhalten im Editor löscht alle Zeilenumbrüche und Leerzeichen beim Wiedereinfügen