Danke, immer diese Kleinigkeiten
- habe hDC einfach als hWnd gelesen
Super, nun mal sehen, wie man damit GUI's aufpeppen kann.
Beiträge von BugFix
-
-
Hi,
ich habe mal probiert folgendes VB-Bsp.:Spoiler anzeigen
Code
Alles anzeigenPrivate Type TRIVERTEX x As Long y As Long Red As Integer 'Ushort value Green As Integer 'Ushort value Blue As Integer 'ushort value Alpha As Integer 'ushort End Type Private Type GRADIENT_RECT UpperLeft As Long 'In reality this is a UNSIGNED Long LowerRight As Long 'In reality this is a UNSIGNED Long End Type Const GRADIENT_FILL_RECT_H As Long = &H0 'In this mode, two endpoints describe a rectangle. The rectangle is 'defined to have a constant color (specified by the TRIVERTEX structure) for the left and right edges. GDI interpolates 'the color from the top to bottom edge and fills the interior. Const GRADIENT_FILL_RECT_V As Long = &H1 'In this mode, two endpoints describe a rectangle. The rectangle ' is defined to have a constant color (specified by the TRIVERTEX structure) for the top and bottom edges. GDI interpolates ' the color from the top to bottom edge and fills the interior. Const GRADIENT_FILL_TRIANGLE As Long = &H2 'In this mode, an array of TRIVERTEX structures is passed to GDI 'along with a list of array indexes that describe separate triangles. GDI performs linear interpolation between triangle vertices 'and fills the interior. Drawing is done directly in 24- and 32-bpp modes. Dithering is performed in 16-, 8.4-, and 1-bpp mode. Const GRADIENT_FILL_OP_FLAG As Long = &HFF Private Declare Function GradientFillRect Lib "msimg32" Alias "GradientFill" (ByVal hdc As Long, pVertex As TRIVERTEX, ByVal dwNumVertex As Long, pMesh As GRADIENT_RECT, ByVal dwNumMesh As Long, ByVal dwMode As Long) As Long Private Function LongToUShort(Unsigned As Long) As Integer 'A small function to convert from long to unsigned short LongToUShort = CInt(Unsigned - &H10000) End Function Private Sub Form_Load() 'KPD-Team 1999 'URL: http://www.allapi.net/ 'E-Mail: KPDTeam@Allapi.net 'API uses pixels Me.ScaleMode = vbPixels End Sub Private Sub Form_Paint() Dim vert(1) As TRIVERTEX Dim gRect As GRADIENT_RECT 'from black With vert(0) .x = 0 .y = 0 .Red = 0& .Green = 0& '&HFF& '0& .Blue = 0& .Alpha = 0& End With 'to blue With vert(1) .x = Me.ScaleWidth .y = Me.ScaleHeight .Red = 0& .Green = 0& .Blue = LongToUShort(&HFF00&) .Alpha = 0& End With gRect.UpperLeft = 0 gRect.LowerRight = 1 GradientFillRect Me.hdc, vert(0), 2, gRect, 1, GRADIENT_FILL_RECT_H End Subnach AutoIt zu portieren. Leider ohne sichtbaren Erfolg.
Der Dll-Call wird zwar ohne Fehler ausgeführt, aber der Return ist immer '0', also Mißerfolg. Hat jemand eine Idee?Spoiler anzeigen
[autoit]Global Const $tagTRIVERTEX = 'long x;long y;int Red;int Green;int Blue;int Alpha'
[/autoit] [autoit][/autoit] [autoit]
Global Const $tagGRADIENT_RECT = 'ulong UpperLeft;ulong LowerRight'
Global Const $GRADIENT_FILL_RECT_H = 0x0 ;'In this mode, two endpoints describe a rectangle. The rectangle is
;~ 'defined to have a constant color (specified by the TRIVERTEX structure) for the left and right edges. GDI interpolates
;~ 'the color from the top to bottom edge and fills the interior.
Global Const $GRADIENT_FILL_RECT_V = 0x1 ;'In this mode, two endpoints describe a rectangle. The rectangle is
;~ ' defined to have a constant color (specified by the TRIVERTEX structure) for the top and bottom edges. GDI interpolates
;~ ' the color from the top to bottom edge and fills the interior.
Global Const $GRADIENT_FILL_TRIANGLE = 0x2 ;'In this mode, an array of TRIVERTEX structures is passed to GDI
;~ 'along with a list of array indexes that describe separate triangles. GDI performs linear interpolation between triangle vertices
;~ 'and fills the interior. Drawing is done directly in 24- and 32-bpp modes. Dithering is performed in 16-, 8.4-, and 1-bpp mode.
Global Const $GRADIENT_FILL_OP_FLAG = 0xFFFunc GradientFillRect($hdc, $pTRIVERTEX, $dwNumVertex, ByRef $tGRADIENT_RECT, $dwNumMesh, $dwMode)
[/autoit] [autoit][/autoit] [autoit]
Local $ret = DllCall("msimg32", 'long', "GradientFill", 'long', $hdc, 'ptr', $pTRIVERTEX, _
'long', $dwNumVertex, 'ptr', $tGRADIENT_RECT, 'long', $dwNumMesh, 'long', $dwMode)
If @error > 0 Then Return SetError(1,@error,-1)
Return $ret[0] ; True or False
EndFuncFunc LongToUShort($Unsigned)
[/autoit] [autoit][/autoit] [autoit]
Return Int($Unsigned - 0x10000)
EndFuncForm_Paint()
[/autoit] [autoit][/autoit] [autoit]Func Form_Paint()
[/autoit] [autoit][/autoit] [autoit]
Local $width = 400, $height = 300
Local $gui = GUICreate('Test', $width, $height)
Local $vert0 = DllStructCreate($tagTRIVERTEX)
Local $vert1 = DllStructCreate($tagTRIVERTEX)
Local $vert = DllStructCreate('ptr[2]')
DllStructSetData($vert, 1, DllStructGetPtr($vert0), 1)
DllStructSetData($vert, 1, DllStructGetPtr($vert1), 2)Local $gRect = DllStructCreate($tagGRADIENT_RECT)
[/autoit] [autoit][/autoit] [autoit];~ 'from black
[/autoit] [autoit][/autoit] [autoit]
DllStructSetData($vert0, 'x', 0)
DllStructSetData($vert0, 'y', 0)
DllStructSetData($vert0, 'Red', 0)
DllStructSetData($vert0, 'Green', 0xFF)
DllStructSetData($vert0, 'Blue', 0)
DllStructSetData($vert0, 'Alpha', 0);~ 'to blue
[/autoit] [autoit][/autoit] [autoit]
DllStructSetData($vert1, 'x', $width)
DllStructSetData($vert1, 'y', $height)
DllStructSetData($vert1, 'Red', 0)
DllStructSetData($vert1, 'Green', 0)
DllStructSetData($vert1, 'Blue', LongToUShort(0xFF00))
DllStructSetData($vert1, 'Alpha', 0)DllStructSetData($gRect, 'UpperLeft', 0)
[/autoit] [autoit][/autoit] [autoit]
DllStructSetData($gRect, 'LowerRight', 1)GUISetState()
[/autoit] [autoit][/autoit] [autoit]
Local $ret = GradientFillRect(WinGetHandle($gui), $vert, 2, $gRect, 1, $GRADIENT_FILL_RECT_H)ConsoleWrite($ret & ' @err: ' & @error & @CRLF)
[/autoit] [autoit][/autoit] [autoit]Do
[/autoit]
Until GUIGetMsg() = -3
EndFunc -
Sicherste Methode ist _DateDiff().
[autoit]
Wenn es nur Uhrzeit ist, kannst du auch einen reinen Stringvergleich machen:$t1 = '10:17'
[/autoit][autoit][/autoit][autoit]
$t2 = '10:15'Select
[/autoit]
Case $t1 < $t2
MsgBox(0, '', 'Früher')
Case $t1 = $t2
MsgBox(0, '', 'Genaue Zeit')
Case Else
MsgBox(0, '', 'zu spät')
EndSelect -
Dann verwende einfach das KEYUP-Event in Func _KeyProc:
[autoit]If ($wParam = $WM_KEYUP) And ($vkCode = 0x20) Then
[/autoit] -
Das geht am Besten mit Hook auf die Leertaste:
Spoiler anzeigen
[autoit]#include <WinAPI.au3>
[/autoit] [autoit][/autoit] [autoit]
#Include <WindowsConstants.au3>OnAutoItExitRegister('OnAutoItExit')
[/autoit] [autoit][/autoit] [autoit]
Opt("GUIOnEventMode", 1)Global $hHookKeyboard, $pStub_KeyProc, $active = False, $ctrl2effect = 'SysListView321'
[/autoit] [autoit][/autoit] [autoit]
$pStub_KeyProc = DllCallbackRegister("_KeyProc", "int", "int;ptr;ptr")
$hHookKeyboard = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($pStub_KeyProc), _WinAPI_GetModuleHandle(0), 0)Global $hGui = GUICreate("Listview", 520, 600, -1, -1)
[/autoit] [autoit][/autoit] [autoit]
GUISetOnEvent(-3, "_Exit")Global $hLV = GUICtrlCreateListView("Index|Alarmtext|Nummer", 10, 10, 500, 582, -1, 0x00000004)
[/autoit] [autoit][/autoit] [autoit]
For $i = 1 To 100
GUICtrlCreateListViewItem($i, $hLV)
GUICtrlSetOnEvent(-1, "_CheckStatus")
NextGUISetState()
[/autoit] [autoit][/autoit] [autoit]While 1
[/autoit] [autoit][/autoit] [autoit]
Sleep(100)
If BitAND(WinGetState($hGui),
And ControlGetFocus($hGui) = $ctrl2Effect Then ; nur wirksam wenn GUI aktiv und Fokus auf Listview
$active = True
Else
$active = False
EndIf
WEndFunc _Exit()
[/autoit] [autoit][/autoit] [autoit]
Exit
EndFuncFunc _CheckStatus()
[/autoit] [autoit][/autoit] [autoit]
ConsoleWrite(@GUI_CtrlId & " - " & GUICtrlRead(@GUI_CtrlId, 1) & @CR)
EndFuncFunc OnAutoItExit()
[/autoit] [autoit][/autoit] [autoit]
DllCallbackFree($pStub_KeyProc)
_WinAPI_UnhookWindowsHookEx($hHookKeyboard)
EndFunc ;==>OnAutoITExitFunc _KeyProc($nCode, $wParam, $lParam)
[/autoit]
If $nCode < 0 Or Not $active Then Return _WinAPI_CallNextHookEx($hHookKeyboard, $nCode, $wParam, $lParam)
Local $tKEYHOOKS = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam)
Local $vkCode = DllStructGetData($tKEYHOOKS, "vkCode")
If ($wParam = $WM_KEYDOWN) And ($vkCode = 0x20) Then
_CheckStatus()
EndIf
Return _WinAPI_CallNextHookEx($hHookKeyboard, $nCode, $wParam, $lParam)
EndFunc ;==>_KeyProc -
Hier mal noch ein paar zusätzliche API-Funktionen für die RECT-Struktur:
Spoiler anzeigen
[autoit]Local $tRECT = DllStructCreate('int Left;int Top;int Right;int Bottom')
[/autoit] [autoit][/autoit] [autoit]; === Befüllen
[/autoit] [autoit][/autoit] [autoit]
ConsoleWrite('=== Befüllen' & @CRLF)
ConsoleWrite( _WinAPI_SetRect($tRECT, 20, 30, 200, 300) & @CRLF)
_ConsoleWriteRECT($tRECT); === Verschieben
[/autoit] [autoit][/autoit] [autoit]
ConsoleWrite('=== Verschieben' & @CRLF)
ConsoleWrite( _WinAPI_OffsetRect($tRECT, 5, 5) & @CRLF)
_ConsoleWriteRECT($tRECT); === Punkt innerhalb RECT?
[/autoit] [autoit][/autoit] [autoit]
ConsoleWrite('=== Punkt innerhalb RECT?' & @CRLF)
ConsoleWrite(_WinAPI_PointInRect($tRECT, 150, 35) & @CRLF)
ConsoleWrite(_WinAPI_PointInRect($tRECT, 150, 25) & @CRLF); === Leeren
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
ConsoleWrite('=== Leeren' & @CRLF)
ConsoleWrite( _WinAPI_SetRectEmpty($tRECT) & @CRLF)
_ConsoleWriteRECT($tRECT)Func _ConsoleWriteRECT(ByRef $tRECT)
[/autoit] [autoit][/autoit] [autoit]
For $i = 1 To 4
ConsoleWrite(DllStructGetData($tRECT, $i) & @CRLF)
Next
EndFunc;===============================================================================
[/autoit] [autoit][/autoit] [autoit]
; Function Name: _WinAPI_SetRect(ByRef $tRECT, $X1, $Y1, $X2, $Y2)
; Description: Befüllt eine RECT-Struktur in einem Aufruf mit Werten
; Parameter(s): $tRECT RECT-Struktur
; $X1, $Y1, $X2, $Y2 Werte des Rectangle
; Return Value(s): Erfolg <> 0
; Fehler 0 set @error
; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
;===============================================================================
Func _WinAPI_SetRect(ByRef $tRECT, $X1, $Y1, $X2, $Y2)
Local $ret = DllCall("user32", 'long', 'SetRect', 'ptr', DllStructGetPtr($tRECT), 'long', $X1, 'long', $Y1, 'long', $X2, 'long', $Y2)
If @error > 0 Then Return SetError(1,@error,0)
Return $ret[0]
EndFunc ;==>_WinAPI_SetRect;===============================================================================
[/autoit] [autoit][/autoit] [autoit]
; Function Name: _WinAPI_SetRectEmpty(ByRef $tRECT)
; Description: Leert alle Werte einer RECT-Struktur in einem Aufruf
; Parameter(s): $tRECT RECT-Struktur
; Return Value(s): Erfolg <> 0
; Fehler 0 set @error
; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
;===============================================================================
Func _WinAPI_SetRectEmpty(ByRef $tRECT)
Local $ret = DllCall("user32", 'long', 'SetRectEmpty', 'ptr', DllStructGetPtr($tRECT))
If @error > 0 Then Return SetError(1,@error,0)
Return $ret[0]
EndFunc ;==>_WinAPI_SetRectEmpty;===============================================================================
[/autoit] [autoit][/autoit] [autoit]
; Function Name: _WinAPI_OffsetRect(ByRef $tRECT, $X, $Y)
; Description: Verschiebt eine RECT-Struktur um die $X/$Y-Werte
; Parameter(s): $tRECT RECT-Struktur
; $X Wert horizontale Verschiebung
; $Y Wert vertikale Verschiebung
; Return Value(s): Erfolg <> 0
; Fehler 0 set @error
; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
;===============================================================================
Func _WinAPI_OffsetRect(ByRef $tRECT, $X, $Y)
Local $ret = DllCall("user32", 'long', "OffsetRect", 'ptr', DllStructGetPtr($tRECT), 'long', $X, 'long', $Y)
If @error > 0 Then Return SetError(1,@error,0)
Return $ret[0]
EndFunc ;==>_WinAPI_OffsetRect;===============================================================================
[/autoit]
; Function Name: _WinAPI_PointInRect(ByRef $tRECT, $X, $Y)
; Description: Prüft ob ein Punkt innerhalb einer RECT-Struktur ist
; Parameter(s): $tRECT RECT-Struktur
; $X, $Y Koordinaten des Punktes
; Return Value(s): Erfolg Punkt innerhalb=True / außerhalb=False
; Fehler -1 set @error
; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
;===============================================================================
Func _WinAPI_PointInRect(ByRef $tRECT, $X, $Y)
Local $ret = DllCall("user32", 'long', 'PtInRect', 'ptr', DllStructGetPtr($tRECT), 'long', $X, 'long', $Y)
If @error > 0 Then Return SetError(1,@error,-1)
If $ret[0] > 0 Then
Return True
Else
Return False
EndIf
EndFunc ;==>_WinAPI_PointInRectEdit: Noch eine Funktion ergänzt.
Edit2: Und genau die gibt es doch schon in der WinAPI.au3 (_WinAPI_PointInRect - dort: _WinAPI_PtInRect)
Edit 17.09.2012
Neue Funktion hinzugefügt, s. Post #2DL bisher: 52
-
aber ich wollte wissen wie (oder ob) es in einer Zeile mit StringregExpreplace geht
Wenn in einer Zeile, dann auch nur ein geschachtelter Aufruf. Ein Pattern zum wahlweise aber gezielten Ersetzen von 3 verschiedenen Zielen ist m.W. nicht machbar. -
das Problem ist, dass ich die Datenfelder nicht direkt ansprechen kann
Einspruch Euer Ehren
- Bis jetzt haben wir noch jeden Zugang zu einer Datenbank gefunden. Evtl. muß etwas am Format gefeilt werden, aber eine direkte Abfrage sollte machbar sein.
Welche DB wird verwendet? Hast du administrativen Zugang (User, PW). Zugang vom Client oder auf dem Server?Bei meiner DB benutze ich den kleinen Umweg, Daten per SQL-Abfrage zusammenzustellen und das Ergebnis in eine Datei zu exportieren (Format wählbar: z.B. xls, csv). Diese verwende ich dann mit AutoIt.
-
ein special disign für die koda oberfläche
Wozu das denn? So selten, wie man Koda nutzt (oder machst du jeden Tag 10 GUI's
), ist es doch total Banane, wie die Oberfläche aussieht. 
-
Die Softwareersteller halten sich hier leider an keine gemeinsamen Normen. Und somit findest du die Verweise auf den Installationsort auch an ganz unterschiedlichen Stellen.
Ein häufig verwendeter Schlüssel ist: HKEY_LOCAL_MACHINE\SOFTWARE
Hier tragen sich viele Programm ein. Mußt du durch die Schlüssel iterieren. Im Allgemeinen ist Hersteller oder Produktname auch der Schlüsselname. Dann mußt du den Schlüssel nach Path, InstallDir oder ähnlichem durchsuchen. Wenn du das Programm bei dir installiert hast, weißt du ja in welcher Form der Schlüssel angelegt wird.
Im Unterschlüssel HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall tragen auch viele (leider nicht alle) Installer den Installationsort ein. -
Versuch mal ControlSend mit Flag 1 (RawString).
-
Belegte Zeilen / Spalten lassen sich einfacher so auslesen (Nummer des Sheets ggf. anpassen):
[autoit]Local $oBook = ObjCreate("Excel.Application")
[/autoit][autoit][/autoit][autoit]
; === letzte Zeile
ConsoleWrite('Anzahl Zeilen: ' & $oBook.Worksheets(1).UsedRange.Rows.Count & @CRLF); === letzte Spalte
[/autoit]
ConsoleWrite('Anzahl Spalten: ' & $oBook.Worksheets(1).UsedRange.Columns.Count & @CRLF)Wenn du alle Inhalte (Spalten) einer Zeile auslesen möchtest, kannst du das in einer Schleife erledigen.
[autoit]Local $i = 0, $inhalt = ''
[/autoit]
Local $zeile = 1
While $i < $oBook.Worksheets(1).UsedRange.Columns.Count
$inhalt &= $oBook.Range("A" & $zeile).Offset($i, 0).Value & '|' ; <== Pipe als Trenner, dann kannst du gleich das Listview bestücken
$i += 1
Next
$inhalt = StringTrimRight($inhalt, 1) ; <== die letzte Pipe abschneiden
Das Darstellen in einer ListBox ist aber wenig sinnvoll. Verwende ein Listview, dort hast du ebenfalls Zeilen und Spalten.
Du kannst natürlich auch die Exceltabelle selbst als eingebettetes Objekt darstellen. -
Da musst du dann aber vorher alles reinpacken, ich wollte ja nur so die Funktion nehmen ohne was vorher zumachen. Deswegen pack ich es ja in eine Funktion. Ich machs jetzt anders.
Für den Fall, dass du nicht erst ein Array bestücken möchtest und danach dieses übergibst, kannst du eine (sicher begrenzte, weiß grad nicht die Größe) Zahl an optionalen Parametern im Funktionskopf deklarieren und diese alle mit '0' oder einem anderen Wert, der nicht übergeben werden soll, vorbelegen. Hatte ich mal so gelöst:Spoiler anzeigen
[autoit];===============================================================================
[/autoit]
; Function Name: _InList($var, $CaseSens, $op1, $op2='-0', $op3='-0', $op4='-0', $op5='-0', $op6='-0', $op7='-0', $op8='-0', $op9='-0', $op10='-0')
; Description:: Prüft auf Übereinstimmung einer Variablen mit bis zu 10 Operanden (min 1) einer Auflistung
; Es kann Case Sensitiv geprüft werden
; Parameter(s): $var die Variable
; $CaseSens 1 = Case Sensitiv; 0 (oder alles <> 1) = nicht CS
; $op1..10 die Listenelemente
; Return Value(s): True bei Übereinstimmung, sonst False
; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
;===============================================================================
Func _InList($var, $CaseSens, $op1, $op2='-0', $op3='-0', $op4='-0', $op5='-0', $op6='-0', $op7='-0', $op8='-0', $op9='-0', $op10='-0')
Local $match = 0
For $i = 1 To 10
If $match Then Return True
If $CaseSens = 1 Then
If Eval("op" & $i) == '-0' Then ExitLoop
If $var == Eval("op" & $i) Then $match += 1
Else
If Eval("op" & $i) == '-0' Then ExitLoop
If $var = Eval("op" & $i) Then $match += 1
EndIf
Next
Return False
EndFunc ;==>_InList
Eine andere Variante:
Du übergibst die unbekannte Anzahl zusätzlicher Parameter als Trennzeichenbasierten String und splittest intern am Trennzeichen. -
Was mir auch noch so im Nachhinein aufgefallen ist: Die komfortable RAID-Erstellung versteckt einen Nachteil in sich. Sollten die Platten einmal voll sein und ich komme auf den Gedanken eine HD als Archiv extern zu lagern und bei Bedarf wieder einzustöpseln um die Daten zu lesen, dann ist das ein Irrtum. In dem Moment, wenn ich eine HD einstecke, wird diese sofort neu in das Array eingebunden und formatiert. :wacko:
Schon komisch, da die anderen Netgearprodukte eigentlich recht überzeugend sind ist es doch verwunderlich, wie man die Kunden mit so einem Sche... vor den Kopf stößt.
-
Oder wurde das mittlerweile behoben?
Das kann ich (noch) nicht sagen. Stellt für mein Einsatzgebiet aber kein Problem dar, da dort nur ein 100er Netz ist. -
Alina: Das ist ein Leergehäuse - kannst du reinstecken was du willst:
Zitat2x SATA Einschübe für 3,5" Festplatten (1.5 oder 3.0Gb/s) ohne Größenbeschränkung
-
Im Detail geht das so:
- einmalig: Die Stora bei Netgear registrieren, User anlegen, PW vergeben
- bei Aufruf der Konfigurationssoftware: Anwahl http://www.mystora.com, Username und PW eingeben (ja, wirklich - immer über Internet!)
- nach erfolgreicher Authentifizierung Redirektion mit Sitzungs-ID auf die Stora
- und nun erst hat man Zugriff auf die Konfig-OberflächeWeiterer entscheidener Nachteil:
- in der Standardversion (ohne Abo) können nur 3 Benutzer angelegt werden! D.h. max. 3 PC im LAN. Denn ohne Anmeldung kein Zugriff auf die Daten
- aber: jeder Nutzer hat volle Zugriffsrechte, keine Konfiguration möglichIch habe das Teil heute zurückgebracht. Gebe lieber 30 EUR mehr aus (für eine IcyBox IB-NAS4220-B) und bin dann der Herr im Hause.

Übrigens: Das kpl. Manual findest du hier.
-
Das kann eigentlich nicht sein. Was sagt denn Netgear dazu?
Das ist leider genau so und wird von Netgear im Handbuch (dass du separat laden darfst) auch so beschrieben. Wenn auch die Wortwahl so ist, dass es als Vorteil dargestellt werden soll.
Netgears Position: Dies Stora ist ein Modul für User, die keine Ahnung von Administration haben und die man nicht mit IP's und dergleichen belasten soll. Für User, die mehr wollen gibt es die ReadyNAS-Baureihe. -
Spielen mit Wahrscheinlichkeiten ist ja ganz witzig, doch in Bezug auf die Lottozahlen finde ich das wenig sinnvoll.
Dann sollten wir ehr 'berechnen', welches Insekt als nächstes in unserem Zimmer auftaucht. Die ermittelte Wahrscheinlichkeit dürfte eher mit der Wirklichkeit übereinstimmen als das bei den Lottozahlen der Fall sein wird.
-