FTL
Da es sich hier offensichtlich um einen Bot handelt, wär es cool wenn ein Mod das dann auch schnell wieder zumachen könnte.
Beiträge von SEuBo
-
-
Meine Lösung: Transparentes Lable dahinter legen. hab selbst keine Ahnung von GDI+
-
-
Understood hatte da mal was gemacht.
Allerdings sehr langsam und ich bin auch nicht sicher ob es funktioniert *g* -
Ich werd mich jetzt mal zu nem kollegen begeben, und schauen was bei ihm aufm XP rechner passiert..
Update:
Habe es jetzt auf 2 XP-Rechnern getestet. Läuft Fehlerfrei. Der Fehler muss also bei Vista liegen, heißt ich kann wahrscheinlich nichts gegen machen.
Ich stell den Thread mal auf gelöst, auch wenn mein Problem weiterhin besteht. -
P.S. Das ganze Skript wollte ich doch gar nicht, nur ein lauffähiges Beispiel mit dem Problem zum Spielen.Hehe, ich wollte das grade mal erstellen - aber ich schaff es nicht den Fehler zu rekonstruieren. Wenn ich daraus ein neues Skript mache, gibts keinerlei Bildfehler. Langsam weiß ich echt nicht mehr wo der Fehler liegt .... -.-
-
Aber ehrlich gesagt verstehe ich das Scriptstück sowieso nicht richtig, da wie schon angesprochen das Pic ja 41x auf dieselbe Stelle gezeichnet wird.
Ich poste nicht jedesmal die komplette For-Next-Schleife wenn ich nur 2 Zeilen ändern muss. Aber ich erkläre mal die vorgehensweise:
BSP: GUI ist 700 pixel breit, 300 pixel hoch. -> $w = 100 , $h = 50
Es wird nun das erste Bild bei x: 0, y:0 erstellt. Danach gibts ein $x += $w. Das zweite pic wird dann bei x: 100 , y: 0 erstellt. Solange bis das 7te Bild gezeichnet wurde. Dann wird x wieder auf 0 gesetzt, und $y += $h. Sprich, es zeichnet wieder 7 Bilder in der nächsten Zeile. Habe ja jetzt das komplette Script angehangen (erster Post).
Was mir auch aufgefallen ist, mach mal Sicherheitshalber Integer aus $w und $h in der LOCAL-Zeile, kann sein daß bei der Berechnung (Rundung) Fehler auftreten
Habe es jetzt als Int() sowie als Floor() und als Round() probiert. Jeweils für die Version mit Größenangaben in GUICtrlCreatePic und für die Version mit vorherigem resize via GDI+.Ich habe übrigens Vista (32 Bit). Und es liegt definitiv nicht an meinem Rechner, da bei meiner Freundin (auch Vista, aber 64Bit) das selbe Problem auftritt. Zur Not müsste ich mal an einen XP rechner. Nur davon haben wir keinen *g*
-
zum Ärgern alle Male toll, aber sonst sehe ich da jetz keinen wirklichen nutzen drinne
Falsch. Das ist sehr nützlich um Festplattenspeicher zu reservieren. Stell dir vor du leitest ein Unternehmen, welches zB Webspace vermietet. Ein Kunde bezahlt nun für 500GB. Du hast aber min. 550GB partitionen. Bevor du jetzt die Platte umformatierst, oder auf Dateisystemebene bestimmte Kontingente zuweist, erstellst du doch einfach eine 50 gb große Datei um deinem Kunden nur die 500 gb zu geben. Natürlich ist das jetzt nur ein Beispiel und in der Praxis würde das wahrscheinlich anders laufen. Aber das macht es halt zum Beispiel
-
Wollt halt mal sehen wie weit ich gehen kann. Das Script ist jetzt im ersten Post. Noch ist es ja nur GUI, da denk ich mal dass es noch legitim sein dürfte.
PS: Ich weiß dass ihr Probleme haben werdet da durchzublicken - dabei versuch ich ja schon das ganze so übersichtlich wie möglich zu halten
-
Bist du dir überhaupt sicher, daß das Problem von guictrlcreatepic kommt und nicht von _DrawStringLabel()?
Jap, 2000% ig!
Denn die Fehler treten auch auf wenn,
- ich die Texte nicht per Lable sondern per GDI+ auf die Bilder zeichne
- ich garkeine Texte auf die Bilder mache (siehe screenshot)ZitatDas Konzept ist schon klar, nur ein lauffähiges Skript und die benötigten Bilder im Anhang wäre für Tester, die sich gerade keinen Reim auf das Problem machen können (so wie ich), vorteilhaft.
Würde ich leider ungern, da das ganze ja für den uIT gedacht ist
Wenns nicht anders geht lad ichs aber gleich mal hoch... -
Zitat
Besser wäre was lauffähiges mit den entsprechenden Bildern.
Ich brauche leider die einzelnen Bilder. Siehe Bild unten. Tage die im aktuellen Monat nicht vorkommen sollen ausgegraut werden. Wenn ich ein Bild für das komplette Grid erstelle, müsste ich ja zig varianten erstellen. Außerdem würde ich das gerne dynamisch auf 5 oder 6 Zeilen ändern können. Im Beispiel unten wäre dann ja eine Zeile frei, die ich , wenn der Code weiterentwickelt ist, gerne rauscshneiden möchte, um eine schönere Optik zu bekommen.hast du die Größenparameter mal angepasst?
Hier der angepasste Code:
Spoiler anzeigen
[autoit]Dim $hGrid[6][7]
[/autoit]
Local $aPos = WinGetPos($hGUI), $sx, $sy, $ix = 0, $iy = 0, $x, $y, $w = ($aPos[2] / 7), $h = ($aPos[3] / 6)
;~ _ImageResize(@ScriptDir & "\IMG\day.jpg", @ScriptDir & "\IMG\Res\day.jpg", $w, $h)
$start = _MonthsFirst2Weekday($sDate, $date, 1)
For $i = 0 To 41
GUICtrlCreatePic(@ScriptDir & "\IMG\day.jpg", $x, $y, $w, $h)
GUICtrlSetState(-1,$GUI_DISABLE)
$hGrid[$iy][$ix] = _DrawStringLable($hGUI,"",22,$x,$y,$w,$h,0x000000,"Arial",Bitor(0x01,0x0200))
;Func _DrawStringLable($hWnd, $sText, $iSize = 16, $x = 20, $y = 20, $w = -1, $h = -1, $iColor = 0x000000, $sFont = "Arial", $iDbg = 0)
GUICtrlSetOnEvent($hGrid[$iy][$ix], "_Switch2DayView")Und hier das was dabei rauskommt: (siehe Bild unten)
Edit:
ich glaube ich hab grade eine Idee wie ich das lösen kann
Nope, das war nix... -
Und wieso muss GUICtrlCreatePic() mit scheinbar konstanten Werten in die For ... Next Schleife?
Sind sie nicht, hielt es allderdings für irrelevant die ganze Schleife zu posten, da der Code korrekt ist. Die Positionen stimmen und die größen stimmen. nur die Bildfehler machen mir zu schaffen. Ich hab mal im ersten Post die komplette For-Next Schleife gepostet.
-
0 gebe ich an, weil dann die Größenwerte der ursprünglichen Datei übernommen werden.
Zitat aus der Hilfe: "Soll das Bild die Größe der Originaldatei haben, setzt man width=height=0."Default ist, so wie das nach einigen versuchen festgestellt habe 150x150.
Das Resizen über GDI+ war wie gesagt nur ein Versuch, die Bildfehler loszuwerden. Natürlich geht es auch wenn ich die Größe direkt in GUICtrlCreatePic angebe. Das Resultat bleibt allerdings das selbe. -
-
Hallo.
Wie auf dem Bild unten zu sehen ist, erzeugt GUICtrlCreatePic() einige unschöne "Artefakte" auf den Pics. Ich habe es bisher nicht geschafft den Ursprung dieser Bildfehler auszumachen. Der Code ist soweit ich das sagen kann korrekt. Die Bilder auf meiner Festplatte weisen keinerlei Fehler auf.Um dieses Problem zu beheben, habe ich bereits versucht, das Bild per GDI+ einzulesen, resizen und neu abzuspeichern. Hat auch wunderbar geklappt - Das Bild wird in der richtigen Größe erstellt. Ohne Bildfehler! (siehe Bild nr 2)
Komisch ist auch, dass die Bildfehler nur in den, mit einer For-Next-Schleife, erstellten Bildern auftreten. Ich benutze das gleiche Bild für einen Hover effekt ( siehe Bild, aufgehellte Fläche ) und in diesem treten keine Fehler auf.
Die Artefakte sind für jede Auflösung anders. manchmal ist es nur ein winziger punkt und manchmal zieht sich ein Strich durch das komplette Pic. (Im bild unten ist der Fehler immer ein Strich am rechten Rand des pics.)
Das ist zum MäusemelkenHier mal ein Ausschnitt aus dem Code:
Spoiler anzeigen
[autoit]
[/autoit]
Dim $hGrid[6][7]
Local $aPos = WinGetPos($hGUI), $sx, $sy, $ix = 0, $iy = 0, $x, $y, $w = ($aPos[2] / 7), $h = ($aPos[3] / 6)
_ImageResize(@ScriptDir & "\IMG\day.jpg", @ScriptDir & "\IMG\Res\day.jpg", $w, $h)
$start = _MonthsFirst2Weekday($sDate, $date, 1)
For $i = 0 To 41
GUICtrlCreatePic(@ScriptDir & "\IMG\Res\day.jpg", $x, $y, 0, 0)
GUICtrlSetState(-1,$GUI_DISABLE)
$hGrid[$iy][$ix] = _DrawStringLable($hGUI,"",22,$x,$y,$w,$h,0x000000,"Arial",Bitor(0x01,0x0200))
;Func _DrawStringLable($hWnd, $sText, $iSize = 16, $x = 20, $y = 20, $w = -1, $h = -1, $iColor = 0x000000, $sFont = "Arial", $sStyle=Default, $sSyleEx=Default$iDbg = 0)
GUICtrlSetOnEvent($hGrid[$iy][$ix], "_Switch2DayView")Woran kann das liegen?
Gruß, SEuBo
Edit: Für nuts hier noch mal extra die komplette Funktion
Spoiler anzeigen
[autoit]Func _CreateGrid($hGUI, $sDate)
[/autoit] [autoit][/autoit] [autoit]
$hLast = GUISwitch($hGUI)
Dim $hGrid[6][7]
Local $aPos = WinGetPos($hGUI), $sx, $sy, $ix = 0, $iy = 0, $x, $y, $w = ($aPos[2] / 7), $h = ($aPos[3] / 6)
_ImageResize(@ScriptDir & "\IMG\day.jpg", @ScriptDir & "\IMG\Res\day.jpg", $w, $h)
$start = _MonthsFirst2Weekday($sDate, $date, 1)
For $i = 0 To 41
GUICtrlCreatePic(@ScriptDir & "\IMG\Res\day.jpg", $x, $y, 0, 0)
GUICtrlSetState(-1,$GUI_DISABLE)
$hGrid[$iy][$ix] = _DrawStringLable($hGUI,"",22,$x,$y,$w,$h,0x000000,"Arial",Bitor(0x01,0x0200))
;Func _DrawStringLable($hWnd, $sText, $iSize = 16, $x = 20, $y = 20, $w = -1, $h = -1, $iColor = 0x000000, $sFont = "Arial", $iDbg = 0)
GUICtrlSetOnEvent($hGrid[$iy][$ix], "_Switch2DayView")
If $i <= 8 And $ix = $start - 1 Then
$hGridDate[$iy][$ix] = StringFormat("%02i", 01)
Local $sx = $ix
EndIf
$x += $w
$ix += 1
If $x + $w > $aPos[2] Then
$x = 0
$y += $h
$ix = 0
$iy += 1
EndIf
Next
Local $ix = $sx + 1, $iy = 0, $day = 1$aSplit = StringSplit($sDate, ".")
[/autoit] [autoit][/autoit] [autoit]
For $i = $ix To _DateDaysInMonth($aSplit[3], $aSplit[2]) + $ix - 2
If $ix + 1 > UBound($hGridDate, 2) Then
$ix = 0
$iy += 1
EndIf
$day += 1
$hGridDate[$iy][$ix] = StringFormat("%02i", $day)
$ix += 1Next
[/autoit]
GUICtrlSetData($date, _NowCalcDate())
GUISwitch($hLast)
Return $hGrid
EndFunc ;==>_CreateGridEDIT2: Script angehängt. Wenn auch ungern -
Warum denn so kompliziert Schnitzel? das geht doch viel kürzer
Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit][/autoit]
$WinListe = WinList("Edit")
If Not $WinListe[0][0] = 0 Then
For $i = 1 to $WinListe[0][0]
If BitAnd(WinGetState($WinListe[$i][1]),2) Then
WinActivate($WinListe[$i][1])
If MsgBox(4,"","War dies das gesuchte Fenster?") = 6 Then
WinSetState($WinListe[$i][1],"",@SW_HIDE)
ExitLoop
EndIf
EndIf
Next
EndIf -
Du brauchst den Fensterhandle.
Vielleicht klappt ja das hier:
[autoit]$WinListe = WinList("Edit")
[/autoit]
WinActivate($WinListe[2][1]) -
danke für die hilfe aber bei mir erscheint keine GUI zwar schon aber nur ein fenster mit tabellen drinne oO ? und nich die 3 checkboxen
Das ist der array. Der wird mit _Arraydisplay() angezeigt, damit du siehst wie der aussieht (war dazu gedacht, dass du das leichter verstehst) Einfach zumachen und das GUI erscheint.
-
Hier eine möglichkeit:
Leider jetzt nicht die "einfache" Variante, dafür hab ich ausgiebig auskommentiertSpoiler anzeigen
[autoit]#include <ButtonConstants.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Array.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 553, 165, 236, 264)
Dim $Checkbox[3] ; Erstellt einen Array (Ähnlich einer Liste)
$Checkbox[0] = GUICtrlCreateCheckbox("Checkbox1", 352, 48, 97, 17)
$Checkbox[1] = GUICtrlCreateCheckbox("Checkbox2", 352, 72, 97, 17)
$Checkbox[2] = GUICtrlCreateCheckbox("Checkbox3", 352, 96, 97, 17); Ein Array beginnt bei 0. In dem eben erstellten Array "Checkbox" befinden sich nun
[/autoit] [autoit][/autoit] [autoit]
; die ID's von deinen Checkboxen. Das hat den Vorteil, dass du die Checkboxen im Array
; in einer Schleife durchgehen kannst. Das gibt dir mehr flexibilität und hält deinen
; Code kurz! Am besten mal das AutoIt-Tutorial zum Kapitel Arrays durchlesen.
_ArrayDisplay($Checkbox,"ID's")
_Laden()
$Button1 = GUICtrlCreateButton("Check", 352, 120, 75, 25, $WS_GROUP)
$Button2 = GUICtrlCreateButton("Button2", 432, 120, 75, 25, $WS_GROUP)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###While 1
[/autoit] [autoit][/autoit] [autoit]
$msg = GUIGetMsg()
Switch $msg
Case $GUI_EVENT_CLOSE
_Speichern()
Exit
Case $Button1
MsgBox(0,"ID's der gewählten Checkboxen","Ausgewählt sind: "&@CR&_CheckCheckBoxen())
Case $Button2EndSwitch
[/autoit] [autoit][/autoit] [autoit]
WEndFunc _CheckCheckBoxen()
[/autoit] [autoit][/autoit] [autoit]
Local $sSelected
For $i = 0 to UBound($Checkbox)-1 ; geht alle Elemente im Array Checkbox durch.
If GUICtrlRead($Checkbox[$i]) = $GUI_CHECKED Then ; falls die Checkbox angeklickt war,
$sSelected = $sSelected & "," & $Checkbox[$i] ; füge sie zu dem String hinzu.
;Wenn zb Checkbox 1 und 2 ausgewählt sind, ergibt das zB: ",4,5"
EndIf
Next
$sSelected = StringTrimLeft($sSelected,1) ; vorangehendes komma abschneiden
Return $sSelected
EndFuncFunc _Speichern()
[/autoit] [autoit][/autoit] [autoit]
$selected = _CheckCheckBoxen()
$Array = StringSplit($selected,",") ; Teilt den String (den du auch beim klick auf den Check Button siehst, dan den Kommas aus, und schreibt das ergebniss in einen Array.
;~ _ArrayDisplay($Array,"gewähle Checkboxen") ; der array sieht so aus
IniDelete("config.ini","Checkbox");löscht den alten Bereich aus der ini. (nicht unbedingt nötig, aber zur sicherheit mal eingebaut)
For $i = 1 to $Array[0]; das erste Element beinhaltet die Anzahl der gefundenen Elemente
IniWrite("config.ini","Checkbox",$Array[$i],1) ; schreibt die aktuelle checkbox id in die Ini, gefolgt von "1". Das gibt an, dass die Checkbox markiert war.
Next
EndFuncFunc _Laden()
[/autoit]
$Array = IniReadSection("config.ini","Checkbox") ; Liest den Ini Bereich "Checkbox" in einen Array.
;~ _ArrayDisplay($Array,"in ini gefunden") ; hier sind die Checkboxen IDs zu finden, die vorher von _speichern() in die ini geschrieben wurden.
For $i = 1 to $Array[0][0] ; das erste Element ([0][0], es ein 2dimensionaler Array ist)beinhaltet die Anzahl der gefundenen Elemente
If $Array[$i][1] = 1 Then GUICtrlSetState($Array[$i][0],$GUI_CHECKED) ; falls eine 1 dahinter steht (also wenn sie beim speichern ausgewählt war,(siehe zeile 53), dann klicke sie auch jetzt an.
Next
EndFunc -
Schnitzel:
Nicht ganz. Er wollte daraus ein 2D Array erstellen.
$Array[11][12] ( oder [12][11] ? is ja auch egal ) Auf jeden Fall sollte der Array nach dieser Strukur aufgebaut werden (wenn ich den Startpost nicht falsch verstanden habe)0 1 0 1 0 1 0 0 0 1 1 1
1 1 1 0 1 0 0 1 1 0 1 1
0 1 0 0 1 0 1 1 0 1 0 1
0 1 0 1 0 1 0 0 0 1 1 1
1 1 1 0 1 0 0 1 1 0 1 1
0 1 0 0 1 0 1 1 0 1 0 1
0 1 0 1 0 1 0 0 0 1 1 1
1 1 1 0 1 0 0 1 1 0 1 1
0 1 0 0 1 0 1 1 0 1 0 1
0 1 0 1 0 1 0 0 0 1 1 1
1 1 1 0 1 0 0 1 1 0 1 1Aber du hast schon recht. Recht einfach würde das hiermit gehen
https://autoit.de/index.php?page…26160#post26160FileReadToArray2D
Ich liebe die UDF's von Bugfix