Grundsätzlich würde ich das begrüßen.
Ein Problem ist aber auf jeden Fall die Anerkennung der Gemeinnützigkeit. Bildung und Erziehung im Forum - kann man so sehen aber genauso gut auch nicht. Da ist man auf das Wohlwollen des Finanzamtes angewiesen.
Was die Anwesenheitspflicht betrifft: Das ist nicht Bundeseinheitlich.
Bei der Erstanmeldung müssen alle vertretungsberechtigten Mitglieder (Vorstand) vor dem Notar erscheinen. Die Anmeldung beim Amtsgericht kann dann mit der notariellen Urkunde erfolgen. (evtl. Unterschiede in den Bundesländern, da nicht alle BL eine notarielle Anmeldung fordern).
Beiträge von BugFix
-
-
Eine schöne Funktion, aber ich würde die Makros nur optional verwenden.
Hast du natürlich recht, so ist es flexibler.
weil sonst beim Mittwoch das "w" nochmal durch "Mi" ersetzt wird.
*facepalm*
-
Durch die AutoIt Version 3.3.12.0 sind meine ich folgende Funktionen überflüssig
Soweit bin ich noch nicht in der AutoItversion. Ich habe mich nach langem Zögern nun entschlossen mal die 3.3.10.x zu nutzen. Bis zur 12 ist also noch etwas Land 
-
Folgendes ist bei einem Projekt von mit angefallen:
Der Nutzer soll vollkommen frei und für ihn verständlich Tagesdatum/Zeit oder beliebige Elemente daraus formatieren können.
Folgende Makros stehen zur Verfügung:
YYYY / YY - Jahr 4/2 -stellig
MM / M - Monat 2/1 -stellig
DD / D - Tag 2/1 -stellig
hh / h - Stunde 2/1 -stellig
mm / m - Minute 2/1 -stellig
ss / s - Sekunde 2/1 -stellig
ww / w - Wochentag lang/kurz (Montag/Mo)
Bsp. "YYYY-MM-DD", "YYYYMMDD", "D.M.YY", "ww, DD.MM.YYYY", "DD.MM.YYYY hh:mm:ss" (Standard)
Einstellig bedeutet, wenn einstelliger Wert, wird er auch einstellig ausgegeben. Zweistellig fügt dann eine Vornull an.
Optional gibt es die Möglichkeit einen String vorne und/oder hinten anzufügen.
Die vom User gewünschte Formatierung kann z.B. aus einer INI eingelesen und von diesem intuitiv angepasst werden.Spoiler anzeigen
[autoit];===============================================================================
[/autoit]
; Function Name....: _DateTimeUser
; Description......: Nutzergesteuerte Datum- und/oder Zeitausgabe
; Parameter(s).....: $_time_format Nutzerdefiniertes Ausgabeformat
; .................: Makros YYYY / YY - Jahr 4/2 -stellig
; .................: MM / M - Monat 2/1 -stellig
; .................: DD / D - Tag 2/1 -stellig
; .................: hh / h - Stunde 2/1 -stellig
; .................: mm / m - Minute 2/1 -stellig
; .................: ss / s - Sekunde 2/1 -stellig
; .................: ww / w - Wochentag lang/kurz (Montag/Mo)
; .................: Bsp. "YYYY-MM-DD", "YYYYMMDD", "D.M.YY", "DD.MM.YYYY hh:mm:ss" (Standard)
; .................: "ww, DD.MM.YYYY"
; .................: Auch einzelne Werte und beliebige Kombinationen können abgefragt werden. "DD-hh-mm"
; ....[optional]...: $_pre vorangestellter String
; ....[optional]...: $_post nachgestellter String
; Return Value(s)..: Der formatierte Datum/Zeitstring für das heutige Datum
; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
;===============================================================================
Func _DateTimeUser($_time_format='', $_pre='', $_post='')
$_time_format = ($_time_format = '') ? 'DD.MM.YYYY hh:mm:ss' : $_time_format
Local $aTime[10][2] = [['MM', @MON], ['DD', @MDAY], ['hh', @HOUR], ['mm', @MIN], ['ss', @SEC], _
['M', @MON], ['D', @MDAY], ['h', @HOUR], ['m', @MIN], ['s', @SEC]]
StringReplace($_time_format, 'Y', 'Y')
Local $sYear = StringLeft('YYYY', @extended), $output = $_time_format
Local $srepl = (StringLen($sYear) < 4) ? StringRight(@YEAR, 2) : @YEAR
If $sYear <> '' Then _
$output = StringReplace($_time_format, $sYear, $srepl)
Local $sformat
For $i = 0 To 9
$sformat = '%0' & StringLen($aTime[$i][0]) & 'd'
$output = StringReplace($output, $aTime[$i][0], StringFormat($sformat, $aTime[$i][1]), 1, 1)
Next
If StringInStr($output, 'w') Then
Local $YY = StringRight(@YEAR, 2), $aMonval[13] = ['',0,3,3,6,1,4,6,2,5,0,3,5], $iDiff
Local $Y_val = Mod(($YY + Int($YY/4)), 7), $M_val = $aMonval[@MON], $D_val = @MDAY
Local $aY_val[7][2] = [[2300,0],[2200,2],[2100,4],[2000,6],[1900,0],[1800,2],[1700,4]]
For $i = 0 To 6
If @YEAR >= $aY_val[$i][0] Then
$iDiff = $aY_val[$i][1]
ExitLoop
EndIf
Next
If ((Mod(@YEAR,400)=0)?1:(Mod(@YEAR,100)=0)?0:(Mod(@YEAR,4)=0)?1:0) Then $iDiff -= 1
Local $aWDay[7][2] = [['Sonntag','So'],['Montag','Mo'],['Dienstag','Di'],['Mittwoch','Mi'], _
['Donnerstag','Do'],['Freitag','Fr'],['Samstag','Sa']]
Local $w = Mod($Y_val + $M_val + $D_val + $iDiff, 7)
$output = StringReplace($output, 'ww', $aWDay[$w][0], 1, 1)
$output = StringReplace($output, 'w', $aWDay[$w][1], 1, 1)
EndIf
Return $_pre & $output & $_post
EndFunc ;==>_DateTimeUserDie Wochentags- und Schaltjahrermittlung habe ich bewußt ohne externe Funktionen berechnet, damit diese Funktion auch ohne Includes auskommt.
-
Ja, wenn man es wirklich intuitiv führen wollte, müsste man alle Aufrufe für Pop/Push/Delete oder was noch hinzukommt, über einen Wrapper jagen, der dann die richtige Funktion auswählt und entsprechend den Zähler manipuliert. Wobei das noch einfach ist. Eine automatische Erkennung, welches Array denn gerade übergeben wird, kann man ja auch nicht ohne Verrenkungen realisieren. Das erfordert dann irgendeine Form der Registrierung/ID-Vergabe. Stimmt schon - optimal geht anders..

-
_DynArrayPush? Diese wird ja erst aufgerufen wenn das Array schon erstellt habe.
Und wenn ich das Array dann nicht mehr benötige und lösche? Vielleicht sogar mit einer Funktion _ArrayDelete(). Wie lösche ich dann dessen Eintrag in der statischen Variable?Die Verwaltung wird mit in die Funktion eingebunden, das erfordert dann, dass das Löschen auch damit vorgenommen wird:
Spoiler anzeigen
[autoit]Global $ar_1[1]
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Global $ar_2[1]For $i = 1 To 20
[/autoit] [autoit][/autoit] [autoit]
ConsoleWrite(_DynArrayPush($ar_1, $i, 1) & @LF)
If Mod($i, 2) = 0 Then ConsoleWrite(_DynArrayPush($ar_2, $i, 2) & @LF) ; nur jedes 2.te mal ausführen
ConsoleWrite('Loop_' & $i & ': UBound $ar_1 = ' & UBound($ar_1) & ', UBound $ar_2 = ' & UBound($ar_2) & @LF)
Next_DynArrayPush($ar_2, '', -2)
[/autoit] [autoit][/autoit] [autoit]
ConsoleWrite('IsArray( $ar_2
' & IsArray($ar_2) & @LF)Func _DynArrayPush(ByRef $a_Array, $value, $index)
[/autoit] [autoit][/autoit] [autoit]
If Not IsArray($a_Array) Then Return SetError(1, 0, False); ---- Zählerverwaltung
[/autoit] [autoit][/autoit] [autoit]
Local Static $aCounter[100] ; belegen ab Index 1, [0] bleibt ungenutzt
If $index < 0 Then
$aCounter[Abs($index)] = 0 ; negativer Index löscht Einträge
$a_Array = '' ; evtl. das Array auch gleich leeren ?
Return
EndIf
; ----Local $w = UBound($a_Array)
[/autoit] [autoit][/autoit] [autoit]
;~ $a_Array[0] += 1
;~ Local $N = $a_Array[0]
$aCounter[$index] += 1
Local $N = $aCounter[$index] -1If $N > $w Or (Not IsInt($N)) Then Return SetError(2, 0, False)
[/autoit] [autoit][/autoit] [autoit]If $N = $w Then ReDim $a_Array[2 * $w] ; verdopple falls Array-Grenze erreicht wurde
[/autoit]
$a_Array[$N] = $value
Return True
EndFunc ;==>_DynArrayPush -
Ich handhabe das ähnlich, allerdings nicht mit Verdopplung der Arraygröße, sondern ich stimme das für die Anwendungen einzeln ab.
Dabei gehe ich von einer vorerst zu erwartenden realistischen Arrayobergrenze $max aus. 20% davon werden bereitgestellt. Jeweils bei Erreichen dieser Grenze wird das Array um den gleichen Wert erhöht. Bei Erreichen von $max wechsele ich von der statischen Vergrößerung (20% von $max) auf eine dynamische Vergrößerung (20% von UBound), sodass mit wachsender Arraygröße dann auch größere Häppchen angefügt werden.
Wobei man vllt. auch sagen sollte, dass es hier um Arrays mit wirklichem Inhalt geht, also ich betrachte als Untergrenze 800-1000 Elemente. Was kleiner zu erwarten ist, wird in einem Aufwasch definiert. Ausnahme wäre, wenn ich im Array speicherlastige Inhalte ablege (andere Arrays, Objekte) und allgemein in einer speicherarmen Umgebung bin.
Wer statistisch veranlagt ist, kann ja mal austesten, wie die unterschiedlichen Herangehensweisen mit der Arraygröße korrelieren.ZitatZwang zur Notation der Elementanzahl im ersten Element
Das läßt sich umgehen, mit einer Statischen Variable in deiner Arrayfunktion. Ich würde ein Static Array einbinden und als zusätzlichen Parameter einen Index, damit die Funktion für mehrere Array gleichzeitig genutzt werden kann. Im Static Array am übergebenen Index den Zähler für das jeweilige zu ändernde Array eintragen.
-
2. Im Aufruf muss eine $self (oä) Variable bestehen die ByRef auf die Map wirken kann.
self könntest du als Static zwar erzeugen aber ByRef wird wohl nix werden. Das Problem besteht ja auch bei AutoItObject. -
Warum nicht StringRight?
Ich erstelle in einer Funktion den Formatstring in Abhängigkeit von einer Nutzereingabe. Der User legt in der INI eine Maske fest (z.B. Monat "M"=einstellig, wenn möglich oder "MM"=immer zweistellig). Den Formatstring erstelle ich dann einheitlich mit "%0" & StringLen($Maske) & "d" und kann das auf Jahr, Monat oder Tag gleichermassen mit der jeweiligen Maske anwenden ohne auf die einzelenen Segmente separat eingehen zu müssen.
Klar kann ich eine zusätzliche Codezeile für den Jahresstring einbauen, fände es anders aber eleganter. Nunja - was nicht geht, geht nicht. -
Hi,
StringFormat ist ja ganz praktisch um einheitlich formatierte Ausgaben zu erstellen. Ausgabelänge und Ausrichtung kann man vorgeben, Strings können auf eine bestimmte Anzahl Zeichen begrenzt werden.
Und hier ist mein Problem. Diese Begrenzung greift immer von links nach rechts. Nehmen wir mal an, ich möchte eine Jahreszahl 2-stellig ausgeben. Dann brauche ich ein Ausgabe der letzten 2 Stellen. Die ersten 2 Stellen müssten somit gekürzt werden. Mir ist jedoch nur Folgendes möglich:Spoiler anzeigen
[autoit]; Formatierung: '%[-][anzuzeigende Stringlänge].[Genauigkeit]'
[/autoit] [autoit][/autoit] [autoit]
; [-]= String wird links ausgerichtet, sonst rechtsConsoleWrite(StringFormat('%.1s', @YEAR) & @LF) ;==> 2
[/autoit] [autoit][/autoit] [autoit]
ConsoleWrite(StringFormat('%.2s', @YEAR) & @LF) ;==> 20
ConsoleWrite(StringFormat('%.3s', @YEAR) & @LF) ;==> 201
ConsoleWrite(StringFormat('%.4s', @YEAR) & @LF) ;==> 2014ConsoleWrite(StringFormat('%4.1s', @YEAR) & @LF) ;==> 2
[/autoit] [autoit][/autoit] [autoit]
ConsoleWrite(StringFormat('%4.2s', @YEAR) & @LF) ;==> 20
ConsoleWrite(StringFormat('%4.3s', @YEAR) & @LF) ;==> 201
ConsoleWrite(StringFormat('%4.4s', @YEAR) & @LF) ;==> 2014ConsoleWrite(StringFormat('%-.1s', @YEAR) & @LF) ;==> 2
[/autoit] [autoit][/autoit] [autoit]
ConsoleWrite(StringFormat('%-.2s', @YEAR) & @LF) ;==> 20
ConsoleWrite(StringFormat('%-.3s', @YEAR) & @LF) ;==> 201
ConsoleWrite(StringFormat('%-.4s', @YEAR) & @LF) ;==> 2014ConsoleWrite(StringFormat('%-4.1s', @YEAR) & @LF) ;==> 2
[/autoit]
ConsoleWrite(StringFormat('%-4.2s', @YEAR) & @LF) ;==> 20
ConsoleWrite(StringFormat('%-4.3s', @YEAR) & @LF) ;==> 201
ConsoleWrite(StringFormat('%-4.4s', @YEAR) & @LF) ;==> 2014Ist euch ein Weg bekannt, ob und wie ich mit StringFormat n Zeichen von rechts ausgeben kann?
-
minx

Ja, eine "Objektisierung" läßt sich damit durchaus erreichen. Aber mal ehrlich: Meinst du irgendjemand kann diesen Code dann noch entziffern?
Es ist super, wenn man durch Verbiegen der Syntax tolle Side-Effekte erreicht. Doch dann bitte jede Codezeile mit 3 Kommentarzeilen versehen, damit du später auch selbst durch dieses 'Gewirr' durchsteigst.
-
Mal vorweg: Ich bin Beta-Verweigerer und habe somit noch keinen Blick auf diese Struktur geworfen.
Ich denke, hier treffen verschiedene Vorstellungen aufeinander. Dem Einen ist es recht, wenn der Funktionsumfang der Sprache so groß wie möglich ist, dem Anderen reicht eine schmale Basis, die man gern durch UDF aufpeppen kann. Und hier gibt es vermutlich für beide Seiten ausreichend Für und Wider. Einen gemeinsamen Nenner können wir eh nicht stellen - den legt Jos fest.
-
Ich habe mir jetzt folgendes Konzept überlegt:
- Abfrage ob in den Settings ein Backup-Pfad angegeben ist
-- JA: dieser wird verwendet
-- NEIN:
--- Abfrage ob die aktuelle Datei in einem Projekt ist (und Ermittlung des Ordners, in dem sich die PROJEKTNAME.sublime-project befindet)
---- NEIN: Aktueller Dateipfad wird wird im Eingabepanel zur Übernahme/Änderung angeboten
---- JA: Prüfung ob bereits Backupordner im Projektpfad existiert
----- JA: Backup in diesen Ordner
----- NEIN: Projektordner wird im Eingabepanel zur Übernahme/Änderung angebotenDer Gedanke mit dem erstmaligen Speichern war Blödsinn. Das PlugIn ist (wie die meisten anderen auch) Suffix-abhängig und somit muss die Datei sowieso schon exitieren.
-
Wie könnte ich deine Backup Lösung so umschreiben, dass die Backups im Projekt Order landen?
Das ist nach näherer Betrachtung Blödsinn. Ein Projekt ist ein virtueller Raum. Du kannst beliebig viele Pfade und Dateien in das Projekt verlinken. Somit gibt es gar nicht den Projektordner.
Ich überdenke folgende Lösung:
- Ist ein Pfad für Backups in den Settings enthalten, wird dort abgespeichert.
- Ohne Angabe eines Pfades wird im aktuellen Pfad der Datei ein Ordner "BUp_Dateiname" angelegt und dort die jeweilige Version gespeichert. Das bedeutet aber dann, dass beim erstmaligen Speichern der Datei (also wenn sie gerade erstellt wird), noch kein Backup angelegt werden kann (mangels Pfad). Nicht so goldig.
Werde ich noch etwas drüber grübeln. -
Zitat
Kein Plan ob es schon was besser/ integriertes in AutoIt gibt
Die Verwendung von Range und Übergabe der Range an ein Array liest die Excel-Tabelle in Null-Komma-Nichts aus.
In der neuen Excel-UDF von water ist eine entsprechende Funktion (ich glaub _Excel_ReadRange), die diese Funktionalität nutzt. -
-
Jetzt würde ich aber für dynamische Kategorien (werden durch den Benutzer erzeugt = weiß nicht wie viele es geben wird) ein eigenes Dictionary benötigen. Am Ende beinhaltet des Dictionary (=Kategorie) viele Daten!
Also soll es
- nur EIN Dictionary sein und die Schlüssel-Wert-Paare erzeugen die Nutzer?Ein Array fällt leider aus - das wäre für meine Aufgabenstellung mehr sehr schwer möglich!
- Wieso denn das? Mit einem Array kannst du auch erledigen, was mit einem Dictionary geht.
-
Wie wäre es so:
[autoit]
[/autoit][autoit][/autoit][autoit]
; Inhalte aus INI - das kannst du natürlich als Array einlesen und dann in einer Schleife abarbeiten_MyVars('saUDF_Information_Anrede', '[CLASS:Edit;INSTANCE:8]', 'set')
[/autoit][autoit][/autoit][autoit]
_MyVars('saUDF_Information_Name', '[CLASS:Edit;INSTANCE:9]', 'set')
_MyVars('saUDF_Information_Vorname', '[CLASS:Edit;INSTANCE:10]', 'set')ConsoleWrite(_MyVars('saUDF_Information_Name') & @CRLF)
[/autoit][autoit][/autoit][autoit]Func _MyVars($_strVarName, $_value='', $_action='get')
[/autoit]
Local Static $oDict = ObjCreate('Scripting.Dictionary')
Switch $_action
Case 'get'
If $oDict.Exists($_strVarName) Then
Return $oDict.Item($_strVarName)
Else
Return SetError(1,0,'')
EndIf
Case 'set'
If Not $oDict.Exists($_strVarName) Then
$oDict.Add($_strVarName, $_value)
Else
$oDict.Item($_strVarName) = $_value
EndIf
EndSwitch
EndFuncEdit: Ich hatte vergessen, dass Werte auch zur Laufzeit geändert werden können - jetzt korrigiert.
-
Folgendes Szenario:
Ein String enthält einfach und 3-fach quotierte Substrings.
Hallo und 'Str_a' und '''Str_a1''' und "Str_b" und """Str_b1"""Ich möchte jetzt alle Quotierungen auslesen.
[autoit]
Nur ' und '''
ginge so:
[/autoit]
$match = StringRegExp($s, "'([^']+)'", 3)
_ArrayDisplay($match)Und Quotierung mit " oder """ finde ich so
[autoit]
[/autoit]
$match = StringRegExp($s, '"([^"]+)"', 3)
[autoit]
Nun wäre es schön, das in einem Aufruf zu erledigen.
Mit Backreferenz auf das gefundene Quotierungszeichen geht das auch fein.
[/autoit]
$match = StringRegExp($s, '("' & "|'" & ')([\w]+)\1', 3)
_ArrayDisplay($match)
Nun ist es aber nicht ausgeschlossen, dass ein quotierter String in sich auch das Quotierungszeichen enthält ('''Das ist so'ne Sache''').
Der wird ignoriert, weil das Pattern \w für die Gruppe nicht zutrifft. Ich müsste also in einer negierenden Gruppe die Referenz auf den erkannten Begrenzer nutzen.
Etwa so: statt '...([\w]+)\1' dann '...([^\1])\1'
Das ist aber laut RegExp-Syntax nicht machbar.Hat jemand eine Idee, wie ich das Pattern verbiegen muß um meine negierte Backreferenz nutzen zu können?
(Ich bin nicht auf der Suche nach Lösungsvarianten ohne Regexp.) -
Wobei mir gerade auffällt, dass die Funktion noch nicht narrensicher ist. Sollte im String z.B. eine maskierte schließende Klammer vorhanden sein (als String im String), so wird diese als reguläre schließende Klammer erfasst. Das abzufangen wird aber noch mal gnibbelig, mal schauen.