Naja "einfach" ist gut.
Aber der Hinweis war schonmal gut - danke. StringRegExpReplace hab ich gesucht ...
StringRegExpReplace($test, "<version>(.*?)</version>", "\1")
[/autoit]Naja "einfach" ist gut.
Aber der Hinweis war schonmal gut - danke. StringRegExpReplace hab ich gesucht ...
StringRegExpReplace($test, "<version>(.*?)</version>", "\1")
[/autoit]Ja klar, aber ist doch trotzdem doppeltes Errorhandling. :wacko:
Mit einem Array muss ich nach jedem _Stringbetween ein Errorhandling einbauen vor dem Zugriff auf das Array (sonst crash).
Im eigentlichen Skript sind natürlich mehrere Zeile auszuwerten und das ist dann schon aufwendig wenn ich nach jeder Zeile ein Errorhandling brauche
Zitat<version>XYZ</version>
<version1>XYZ</version1>
<version2>XYZ2</version2>
<version3>XYZ3</version3>
<version4>XYZ4</version4>
usw.
Wenn die Auswertung etwas nicht brauchbares ergibt (z.B. Syntaxfehler in der XML => kein Array _StringBetween) kann ich dies leicht an anderer Stelle abfangen. Dort muss auf den variablen Teil eh nochmal prüfen, da auch Unsinn in der XML stehen kann.
Hi,
lange nix mehr gemacht und alles verlernt.
Ich habe folgenden String (aus einer XML).
<version>XYZ</version>
Wobei "XYZ" variabel ist (beliebige Zeichen, beliebig oft), "<version>" und "</version>" ist immer gleich.
Ziel der Aktion: Den variablen Teil isolieren und zwar ohne Array.
_Stringbetween fällt damit raus, Stringregexp auch wobei ich eigentlich dachte damit könnte man den "Match" Teil auch ohne Array ausgeben? Nur wie? Alles verlernt ...
Nochmal als Code was ich machen will:
dim $s_xmlline=<version>XYZ</version>
dim $s_match=_Stringtransform($s_xmlline) ; bei dem Teil steh ich auf dem Schlauch ...
msgbox(0, "Hallo Welt", $s_match) ; und dort sollte dann XYZ drin stehen
Gruß und danke
Nuts
Zur Wer-War-Online Anzeige: Einige Leute. Gegenfrage - wen interessiert es, wer im Team ist? Und wer braucht dafür eine Box im Portal? Steht ja auch anderswo. Ist halt da, ist niemandem im Weg und wer sie nicht sehen will, der hört halt bei den Statistiken auf. Die sind im Übrigen jetzt auch nicht für jeden sinnvoll.
An der Stelle findet man halt meistens eher "Gerade online" (nützlich). Das fände ich dort schöner und zwar in der Darstellung als Accountname (=Schrift).
So sieht man viele avatarlose Bilder. Die Avatare kenne ich auch nicht auswendig.
Ich würde das gegen eine "gerade online" Anzeige in der üblichen Form tauschen und diese links rausnehmen.
Zum Design: Im Grunde orientiert es sich sehr stark am Alten. Natürlich hat sich etwas an der Farbgebung geändert.Wie gesagt - Vorschcläge, Vorschläge, Vorschläge. Je detailierter desto besser. Gefällt mir nicht oder sieht komisch aus sind rein subjektiv und schwer nachzuvollziehen.
[/quote]
Vorschläge zum Design sind immer subjektiv.
Es ist in einem Thread so: Links dunkles Grau => etwas hellers Grau (die User, selbst mit Avatar bei langen Posts viel grau) => abgetrennt durch einen dünnen grauen Strich kommt dann der eigentliche Post in hellem grau und grauer Schrift.
Schwarze Schrift wäre imho angenehmer.
Punkt 1 "Benutzer, die heute online waren"
1. Wen interessiert das?
2. Muss man diese Statistik auf der Hauptansicht zeigen?
3. Muss man dort wirklich die Avatarbilder zeigen?
"Gerade online"
Ist eigentlich ganz nützlich und jetzt links versteckt.
Punkt 2 "Design"
Mir persönlich zu hell. Die Einstellung für ein anderes Design scheint es bei mir nicht zu geben?
Bug oder blöder Benutzer?
Dieses platte 2D Design (keine Schattierungen oder ähnliches) scheint gerade in Mode zu sein?
Ist bei Appel, Win8 usw. auch nicht anders.
Ändert sich hoffentlich bald wieder.
Die Farbauswahl finde ich teilweise auch nicht gelungen.
z.B. beim Antwort Dialog wird helles grau abgesetzt von etwas dunklerem grau, abgesetzt von wieder etwas hellerem grau.
Naja
Punkt 3 "Schriftart bei ungelesenen Threads"
Imho ist das etwas zu aufdringlich.
Ansonsten ja ganz gelungen der Umzug.
Dazu musst du "_GUICtrlListView_RegisterSortCallBack" und "_GUICtrlListView_SortItems" (s. Hilfe für Beispiele) für die Sortierung verwenden.
Oder diesen Teil auf dein Skript übertragen:
[autoit]Func _GUICtrlListView_SortItems($hWnd, $iCol)
Local $iRet, $iIndex, $pFunction, $hHeader, $iFormat
If Not IsHWnd($hWnd) Then $hWnd = GUICtrlGetHandle($hWnd)
[/autoit][autoit][/autoit][autoit]For $x = 1 To $aListViewSortInfo[0][0]
If $hWnd = $aListViewSortInfo[$x][1] Then
$iIndex = $x
ExitLoop
EndIf
Next
$pFunction = DllCallbackGetPtr($aListViewSortInfo[$iIndex][2]) ; get pointer to call back
$aListViewSortInfo[$iIndex][3] = $iCol ; $nColumn = column clicked
$aListViewSortInfo[$iIndex][7] = 0 ; $bSet
$aListViewSortInfo[$iIndex][4] = $aListViewSortInfo[$iIndex][6] ; nCurCol = $nCol
$iRet = _SendMessage($hWnd, $LVM_SORTITEMS, $hWnd, $pFunction, 0, "hwnd", "ptr")
If $iRet <> 0 Then
If $aListViewSortInfo[$iIndex][9] Then ; Use arrow in header ; ab hier
$hHeader = $aListViewSortInfo[$iIndex][10]
For $x = 0 To _GUICtrlHeader_GetItemCount($hHeader) - 1
$iFormat = _GUICtrlHeader_GetItemFormat($hHeader, $x)
If BitAND($iFormat, $HDF_SORTDOWN) Then
_GUICtrlHeader_SetItemFormat($hHeader, $x, BitXOR($iFormat, $HDF_SORTDOWN))
ElseIf BitAND($iFormat, $HDF_SORTUP) Then
_GUICtrlHeader_SetItemFormat($hHeader, $x, BitXOR($iFormat, $HDF_SORTUP))
EndIf
Next
$iFormat = _GUICtrlHeader_GetItemFormat($hHeader, $iCol)
If $aListViewSortInfo[$iIndex][5] = 1 Then ; ascending
_GUICtrlHeader_SetItemFormat($hHeader, $iCol, BitOR($iFormat, $HDF_SORTUP))
Else ; descending
_GUICtrlHeader_SetItemFormat($hHeader, $iCol, BitOR($iFormat, $HDF_SORTDOWN))
EndIf
EndIf
EndIf
Return $iRet <> 0
EndFunc ;==>_GUICtrlListView_SortItems
Ich mache das immer so:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <HeaderConstants.au3>
#include <ListViewConstants.au3>
#include <WindowsConstants.au3>
#include <Guilistview.au3>
#include <File.au3>
#include <Array.au3>
#include <SendMessage.au3>
; nuts (http://www.autoit.de)
[/autoit] [autoit][/autoit] [autoit]Global $nSortDir = 1
#Region ### START Koda GUI section ### Form=
Global $Form1 = GUICreate("Form1", 633, 544, 193, 125)
Global $ListView1 = GUICtrlCreateListView("0|1|2|3", 48, 16, 521, 385)
GUICtrlRegisterListViewSort(-1, "_LVSort")
Global $hLVHandle = GUICtrlGetHandle($ListView1)
_GUICtrlListView_SetColumn($hLVHandle, 0, "Text", 50, 1)
_GUICtrlListView_SetColumn($hLVHandle, 1, "Nummer", 150, 1)
_GUICtrlListView_SetColumn($hLVHandle, 2, "Datum1", 150, 1)
_GUICtrlListView_SetColumn($hLVHandle, 3, "Datum2", 150, 1)
Global $Button1 = GUICtrlCreateButton("Test", 216, 448, 177, 49, 0)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
For $i = 0 To 20
$temp = Random(1, 31, 1)
If $temp < 10 Then $temp = "0" & $temp
GUICtrlCreateListViewItem("ABC|" & Random(1, 10050, 1) & "|2010\02" & $temp & "|" & $temp & ".02.2010", $ListView1)
GUICtrlCreateListViewItem("DDC|" & Random(1, 10050, 1) & "|2011\03" & $temp & "|" & $temp & ".03.2011", $ListView1)
Next
Global $hSORTCALLBACK = DllCallbackRegister("_LV_SortCallback", "Handle", "LPARAM;LPARAM;LPARAM")
Global $pSORTCALLBACK = DllCallbackGetPtr($hSORTCALLBACK)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
;sortiere nach col 2
_LV_SortColumn($ListView1, $pSORTCALLBACK, 2)
$nSortDir = $nSortDir * - 1
Case $ListView1
; DllCall("user32.dll", "int", "InvalidateRect", "hwnd", $hLVHandle, "int", 0, "int", 1)
$nSortDir = $nSortDir * - 1
EndSwitch
WEnd
Func _LV_SortColumn($idLV, $pCallbackProc, $iCol)
; Der Spaltenindex wird 1-basiert erwartet !!!
Local $Result = GUICtrlSendMsg($idLV, $LVM_SORTITEMS, $iCol - 1, $pCallbackProc)
Return $Result
EndFunc
Func _LV_SortCallback($Item1, $Item2, $Col)
Return _LVSort($ListView1, $Item1, $Item2, $Col)
EndFunc
Func _Sort_byNumber($item1, $item2)
[/autoit] [autoit][/autoit] [autoit]Local $ret = 0
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]If Number($item1) < Number($item2) Then
$ret = -1
ElseIf Number($item1) > Number($item2) Then
$ret = 1
EndIf
[/autoit] [autoit][/autoit] [autoit]Return $ret
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]EndFunc ;==>_Sort_byNumber
[/autoit] [autoit][/autoit] [autoit]Func _Sort_byString($item1, $item2)
Local $ret = 0
If $item1 < $item2 Then
$ret = -1
ElseIf $item1 > $item2 Then
$ret = 1
EndIf
[/autoit] [autoit][/autoit] [autoit]Return $ret
EndFunc ;==>_Sort_byString
Func _Sort_byDate($item1, $item2, $del = ".", $step = -1)
[/autoit] [autoit][/autoit] [autoit]Local $ret = 0, $sitem1, $sitem2, $aitem1, $aitem2
[/autoit] [autoit][/autoit] [autoit]$aitem1 = StringSplit($item1, $del)
$aitem2 = StringSplit($item2, $del)
Switch $step
Case - 1
For $i = $aitem1[0] To 1 Step -1
$sitem1 &= $aitem1[$i]
Next
For $i = $aitem2[0] To 1 Step -1
$sitem2 &= $aitem2[$i]
Next
Case 1
For $i = 1 To $aitem1[0]
$sitem1 &= $aitem1[$i]
Next
For $i = 1 To $aitem2[0]
$sitem2 &= $aitem2[$i]
Next
EndSwitch
;ConsoleWrite($sitem1 & " | "& $sitem2 & " | $val1 < $val2"&@CRLF) ;debug
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]If Number($sitem1) < Number($sitem2) Then
$ret = -1
ElseIf Number($sitem1) > Number($sitem2) Then
$ret = 1
EndIf
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]Return $ret
[/autoit] [autoit][/autoit] [autoit]EndFunc ;==>_Sort_byDate
[/autoit] [autoit][/autoit] [autoit]Func _LVSort($hWnd, $nItem1, $nItem2, $nColumn)
Local $val1, $val2, $nResult
$val1 = GetSubItemText($hWnd, $nItem1, $nColumn)
$val2 = GetSubItemText($hWnd, $nItem2, $nColumn)
;ConsoleWrite($val1 & " | "& $val2 & " | $val1 < $val2"&@CRLF) ;debug
[/autoit] [autoit][/autoit] [autoit]$nResult = 0
[/autoit] [autoit][/autoit] [autoit]Switch $nColumn
[/autoit] [autoit][/autoit] [autoit]Case 3
$nResult = _Sort_byDate($val1, $val2)
Case 2
$nResult = _Sort_byDate($val1, $val2, "", 1)
Case 1
$nResult = _Sort_byNumber($val1, $val2)
Case 0
$nResult = _Sort_byString($val1, $val2)
EndSwitch
$nResult = $nResult * $nSortDir
Return $nResult
EndFunc ;==>_LVSort
[/autoit] [autoit][/autoit] [autoit]Func GetSubItemText($nCtrlID, $nItemID, $nColumn)
Local $stLvfi = DllStructCreate("uint;ptr;int;int[2];int")
Local $nIndex, $stBuffer, $stLvi, $sItemText
DllStructSetData($stLvfi, 1, $LVFI_PARAM)
DllStructSetData($stLvfi, 3, $nItemID)
$stBuffer = DllStructCreate("char[260]")
[/autoit] [autoit][/autoit] [autoit]$nIndex = GUICtrlSendMsg($nCtrlID, $LVM_FINDITEM, -1, DllStructGetPtr($stLvfi));
[/autoit] [autoit][/autoit] [autoit]$stLvi = DllStructCreate("uint;int;int;uint;uint;ptr;int;int;int;int")
[/autoit] [autoit][/autoit] [autoit]DllStructSetData($stLvi, 1, $LVIF_TEXT)
DllStructSetData($stLvi, 2, $nIndex)
DllStructSetData($stLvi, 3, $nColumn)
DllStructSetData($stLvi, 6, DllStructGetPtr($stBuffer))
DllStructSetData($stLvi, 7, 260)
GUICtrlSendMsg($nCtrlID, $LVM_GETITEMA, 0, DllStructGetPtr($stLvi));
[/autoit] [autoit][/autoit] [autoit]$sItemText = DllStructGetData($stBuffer, 1)
[/autoit] [autoit][/autoit] [autoit]$stLvi = 0
$stLvfi = 0
$stBuffer = 0
Return $sItemText
EndFunc ;==>GetSubItemText
Damit lässt sich die Funktion wie sortiert werden soll beliebig an den Inhalt des Listviews anpassen.
So ist es eben.
Ich habe praktisch mehr von einem interessanten Regexp pattern wie von deinen schlauen Anmerkungen zu "prozedurale Grafiken".
Ist echt der Witz in Tüten ...
DLLs in Perseus schreiben und in AutoIt nutzen
Perseus 5 (Klappe die zweite)
Alle 3 Themen sind für ein autoit Forum eigentlich ungeeignet.
Ja vor dem Zugriff auf ein Array ist etwas Error-Managment immer angebracht.
Gerade bei einem Aufruf mit undefiniertem Inhalt wie hier.
Der Code ist bissle gruselig, du kannst die entsprechende Stelle mal ca. so abändern (ungeprüft)
[autoit][/autoit][autoit][/autoit][autoit]$keywords = ""
$html=_IEDocReadHTML($oIE)
$keywords=_Keywords($html)
if @error then MsgBox(0, "Error", 'Fehler in Funktion _Stringbetween "No inbetween string found"')
Func _Keywords($s_html)
[/autoit][autoit][/autoit][autoit]local $return_keywords = ""
Local $ar=_StringBetween($s_html,'<div id="image_keyword_container" class="section_content secondary_links">','</div>')
if @error then Return SetError(1,0,0)
Local $ar2=_StringBetween($ar[0],'>','<')
if @error then Return SetError(1,0,0)
for $i=0 to UBound($ar2)-1 step 2
$return_keywords=$return_keywords&$ar2[$i]&', '
next
Return $return_keywords
[/autoit][autoit][/autoit][autoit]endfunc
[/autoit]Rechtliche Grundlage ist §51 ff AO insbesondere §52 AO dürfte einschlägig sein.
Dazu gibt es auch einen Anwendungserlass (AEAO zu §52), ich habe mal eine passende Stelle (Nr. 3) rausgesucht:
Zitat
3. Internetvereine können wegen Förderung der Volksbildung als gemeinnützig anerkannt werden, sofern ihr Zweck nicht der Förderung der (privat betriebenen) Datenkommunikation durch Zurverfügungstellung von Zugängen zu Kommunikationsnetzwerken sowie durch den Aufbau, die Förderung und den Unterhalt entsprechender Netze zur privaten und geschäftlichen Nutzung durch die Mitglieder oder andere Personen dient. Freiwilligenagenturen können regelmäßig wegen der Förderung der Bildung ( § 52 Abs. 2 Nr. 7 AO ) als gemeinnützig behandelt werden, weil das Schwergewicht ihrer Tätigkeit in der Aus- und Weiterbildung der Freiwilligen liegt ( BMF-Schreiben vom 15.9.2003 , BStBl 2003 I S. 446).
Auch der mir vorliegende Kommentar lässt sich auf keine genauen Einzelheiten ein, d.h. es ist eine Einzelfallentscheidung.
Was aber interessant war (ist auch nicht mein Fachgebiet :p ), man kann mittlerweile eine Festellung der Gemeinnützigkeit beim Finanzamt beantragen.
Damit hätte man (vielleicht ) zumindest eine gewisse Rechtssicherheit.
Allein eine gut formulierte Satzung dürfte auf jedem Fall nicht reichen.
Die Punkte des Computerverein Passau e.V. müssen auch mit Leben gefüllt werden.
Der reine Betrieb eines Forums für "Programmierkenntnisse" wird die Gemeinnützigkeit kaum ausreichen.
Da muss schon mehr passieren (das jährliche Sommerfest mit Freibier reicht auch nicht ).
Allgemein wird die Gemeinnützigkeit nicht so ohne weiteres anerkannt. Ist auch vernünftig, da der Gestaltungsmissbrauch hier oft naheliegt ...
Thema Haftung: Der Vereinsvorstand ist nicht von der persönlichen Haftung ausgeschlossen.
Er haftet z.B. unter Umständen auch für falsch ausgestellte Spendenbescheinigungen.
Steuerpflicht: Für einen Verein bestehen einige steuerliche Verpflichtungen.
Auch wenn das hier vielleicht zu keiner Steuerbelastung führen würde, eine Abgabeplicht für diverse Steuererklärungen besteht (kostet ggf. wenn man sich helfen lassen muss, Stichwort Haftung für Vorstand bei Fehlern).
Idee ist gut, aber dazu müsste ein umfassende rechtliche Beratung her und dafür braucht es etwas Startkapital.
Fehlt dann wohl:
[autoit]#include <String.au3>
[/autoit]Möchte mich auch bedanken - auch bei AspirinJunkie!
Habe die UDF damals kurz überflogen, bin bei den internen Funktionen hängengeblieben und dachte WTF was macht der denn da?
Nachdem AspirinJunkie den Thread jetzt nochmal gepusht hat habe ich die nützlichen, dokumentierten Funktionen entdeckt.
Ist wirklich super geworden und in gutem Stil programmiert (soweit ich das beurteilen kann ).
Respekt für die Arbeit!
Als King-Admin (@home) kann man viel machen, auf Benutzerebene am Arbeitsplatz ist, vielleicht außer dem Hersteller, nicht unbedingt klar welcher Virenwächter überhaupt verwendet wird.
Glaube die Heuristik richtet mitllerweile mehr Schaden an als es je genutzt hat.
Ihr merkt ich bin davon schwer genervt, weil ich schon des öfteren davon überrascht wurde und es auch keine Lösung zu geben scheint.
Ok bei der orginal Autoit.exe könnte man schon einen Versuch starten und den Antiviren "Programmierer" (bis zu dem kommt man wohl kaum direkt) informieren.
P.S. Ganz freundlich ist bei mir zuhause der Mircrosoft Virenschutz. Über die Schutzfunktion kann ich aber nichts sagen, habe ja keine Viren auf dem System.
Finde das Problem mit der Heuristik auf jeden Fall sehr bedenklich.
Auf den Kisten daheim mit vollen Adminrechten und "erfahrenen" Benutzern ist doch noch relativ unproblematisch.
Wenn man auf Arbeitsplätzen mit zentral verwaltetem Virenschutz (ohne Adminrechte, nix einstellbar am Viresnschutz und das soll ja auch so sein) mal schnell ein Problem per Skript lösen will ist das sehr ärgerlich.
Da werden die schnell mal ungefragt einfach entsorgt ...
UPX habe ich mittlerweile auch aus (wobei eine reine UPX Heuristik völliger Unsinn ist), aber das hilft leider nicht immer.
Es steht nirgends, dass du etwas ausführen musst
Ist trotzdem ein Bug ...
Wie hoch ist denn bei euch die Raumtemperatur?
Neuere Beamer haben teilweise auch temperaturgesteuerten Lüfter, d.h. der Lüfter dreht im Ernstfall einfach schneller. Wie ist das bei eurem?
Glaube der Effekt einer Frischluftzufuhr für die Lebensdauer wird von euch etwas überschätzt.
Achte aber auf jeden Fall darauf, dass um den Beamer kein Hitzestau entsteht (z.B. durch ein enges Regal).
Zwischen durch mal Lüften wäre für Mensch und Maschine sowieso angebracht.
P.S. Von dem 5min abschalten pro Stunde halte ich überhaupt nichts.
Dadurch wird die Lampe auch stark belastet und das dürfte für die Lebensdauer insgesamt schädlicher sein.
Das Problem in der Jugend ist einfach, dass du noch keinen Bezug zur Anwenderwelt hast.
...
Und eine funktionierende! Warenwirtschaftssoftware hat mit Basics recht wenig zu tun. Das ist schon eher high end.
Eine funktionierende (!) Warenwirtschaftssoftware ist absolut high end.
Ohne Bezug zur Anwenderwelt ist das aber quasi unmöglich.
Ich habe beruflich viel mit Warenwirtschaftssystemen zu tun und weiss ungefähr (naja) worauf es ankommt.
Das ist kein Projekt für einen Einzelperson.
Als Praxiserfahrung würde ich eher empfehlen nur einen Teil des Warenwirtschaftssystems herauszunehmen und den sauber ausarbeiten.
z.B. eine Software zur reinen Rechnungsschreibung mit Stammdatenverwaltung, Import der Gegenstandswerte, Export für die Buchführung
Hört sich einfach an, ist aber schon sehr viel Arbeit!
z.B. müsstest du dich im ersten Schritt mal schlau machen welche gesetzlichen Vorschriften es für Rechnungen gibt.