Deutsch
Bugs und vermeintliche

XProfan X2

GroupBox überlagert UpDown-Control eines Spin-Edits, nicht aber das Edit-Feld

 

Nico
Madysa

 $H Windows.ph
cls
var Long upDownIsVisible = Create("SpinEdit", %hWnd, "0;0;10", 25, 25, 100, 20)
var Long hidesUpDownControlsAfterIt = Create("GroupBox", %hWnd, "a", 0, 0, 200, 200)
var Long upDownIsHidden = Create("SpinEdit", %hWnd, "0;0;10", 25, 50, 100, 20)
Create("Text", %hWnd, "Press any key to repair the second spin edit", 230, 5, 100, 100)
waitinput
RescueLostUpDown(upDownIsHidden)
waitinput
end

proc RescueLostUpDown

    parameters Long spinEdit
    ' Retrieve handle of updown control
    var Long theLostOne = GetHandle(%hWnd, ItemID(spinEdit) + 1)
    ' move groupbox behind updown control
    ~SetWindowPos(hidesUpDownControlsAfterIt, theLostOne, 0, 0, 0, 0, ~SWP_NOMOVE | ~SWP_NOSIZE)
    ' this line shouldn't even be necessary.
    SendMessage(theLostOne, $469, spinEdit, 0)' UDM_SETBUDDY

endproc






Man beachte, dass das UpDown-Control im ersten Bild immer noch da ist.
Es kann angeklickt werden, IsWindowEnabled  und IsWindowVisible  liefern beide true , das einzig Auffälige ist, dass der Nutzer es nicht sehen kann.

14 kB
Kurzbeschreibung: Fenster vor dem Tastendruck
Hochgeladen:20.02.2014
Ladeanzahl159
Herunterladen
15 kB
Kurzbeschreibung: Fenster nach dem Tastendruck
Hochgeladen:20.02.2014
Ladeanzahl156
Herunterladen
 
20.02.2014  
 




E.T.
it's not a bug, it's a feature 
...
var Long upDownIsVisible = Create("SpinEdit", %hWnd, "0;0;10", 25, 25, 100, 20)
var Long upDownIsHidden = Create("SpinEdit", %hWnd, "0;0;10", 25, 50, 100, 20)
var Long hidesUpDownControlsAfterIt = Create("GroupBox", %hWnd, "a", 0, 0, 200, 200)
...

... und schon passt es
 
XProfan X2
Grüße aus Sachsen... Mario
WinXP, Win7 (64 Bit),Win8(.1),Win10, Win 11, Profan 6 - X4, XPSE, und 'nen schwarzes, blinkendes Dingens, wo ich das alles reinschütte...
20.02.2014  
 




Nico
Madysa
Dieser Methode der Problemlösung bin ich mir durchaus bewusst. Deswegen habe ich die beiden SpinEdits in meinem Beispiel so angeordnet: Um zu zeigen, dass es die Groupbox ist, die sich auf der Z-Achse zwischen Edit und UpDown-Control mogelt.

Mir fällt es nur gelinde gesagt schwer, einen Anwendungsbereich für so ein "Feature" zu finden.

Außerdem fühlt es sich nicht gerade konsistent an, dass sich die Groupbox auf der Z-Achse gerade zwischen zwei sehr stark  zusammengehörige Controls schiebt.

Außerdem  wird der Code auch nicht gerade lesbarer, wenn alle Groupboxen nach allen Spinedits ereugt werden.

Außerdem hat mich dieser Mist mehrere Stunden Debugging gekostet und hat mir moderat aufs Gemüt geschlagen.
 
21.02.2014  
 




E.T.
Hm, das das UpDown-Control nach dem RescueLostUpDown  im Edit des SpinEdits liegt ist aber auch nicht Sinn der der Sache, oder
 
Grüße aus Sachsen... Mario
WinXP, Win7 (64 Bit),Win8(.1),Win10, Win 11, Profan 6 - X4, XPSE, und 'nen schwarzes, blinkendes Dingens, wo ich das alles reinschütte...
21.02.2014  
 




Nico
Madysa
Es liegt nicht im Edit-Feld, sondern das Editfeld wird verkürzt, um Platz für das UpDown-Control zu machen. Kannst du nachprüfen, in dem du die Message mehrmals versendest. Das MSDN [...] sagt auch:


An up-down control with the UDS_ALIGNLEFT or UDS_ALIGNRIGHT style aligns with the left or right edge of its buddy window. The width of the buddy window is decreased to accommodate the width of the up-down control.


Und klar ist es nur eine sehr krude Lösung. Für mich funktioniert sie aber, weil ich für mein größenveränderbares Fenster sowieso regelmäßig SetWindowPos  auf das Editfeld anwenden muss und das UpDown-Control dabei gleich mit in die Rechnung einbeziehen kann.
' Ausschnitt: mainwindow.inc
/* <...> */

proc ?_Init

    /* <...> */
    Window x, y - dx, dy
    /* <...> */
    ?_form.intervalEdit& = Create("SpinEdit", %hWnd, intervalEditCaption, 0, 0, 0, 0)
    ?_intervalUpDown = GetHandle(%hWnd, ItemID(?_form.intervalEdit&) + 1)
    /* <...> */
    ' Workaround for updown control being overlaid by groupbox!
    SetWindowPos(mainwindow.advancedGroup, mainwindow.intervalUpDown, 0, 0, 0, 0, ~SWP_NOSIZE | ~SWP_NOMOVE)
    /* <...> */
    Subclass %hWnd, 1

endproc

/* <...> */

proc ?_AdjustContents

    parameters Long width, height
    declare Long currentX, currentY, currentHeight
    /* <...> */
    var Long tracker = BeginDeferWindowPos(controlCount)
    casenot tracker: return 0
    /* <...> */
    ' Das Editfeld nimmt hier die gesamte zur
    ' Verfügung stehende Breite ein.
    tracker = DeferWindowPos(tracker, ?_form.intervalEdit&, 0, \
    currentX, currentY, groupInnerWidth, editHeight, flags)
    /* <...> */
    var Int result = EndDeferWindowPos(tracker)
    ' Hier wird das Editfeld so verkürzt, dass das UpDown-Control genug Platz hat.
    SendMessage(?_intervalUpDown, ~WM_USER + $69, ?_form.intervalEdit&, 0)' UDM_SETBUDDY
    return result

endproc


Dass bei einem SetWindowPos  auf das SpinEdit das zugehörige UpDown-Control nicht  mitverschoben wird, ist noch so ein Gag, den ich noch nicht mal erwähnt habe ...
 
21.02.2014  
 




RGH
Dummerweise sind beide Controls getrennte Controls und das eine weiß nichts vom anderen. Nur der Programmierer selbst, weiß, dass sie zusammengehören.
Ich sehe da im Moment keine sinnvolle Möglichkeit, das mit erträglichem Aufwand zu ändern.

Gruß
Roland
 
XProfan X2
Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4
25.09.2014  
 



Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

7.784 Betrachtungen

Unbenanntvor 0 min.
KJ06.12.2015
Heltal04.11.2015
XpKurt21.01.2015
Sascha Haak20.01.2015
Mehr...

Themeninformationen

Dieses Thema hat 3 Teilnehmer:

Nico Madysa (3x)
E.T. (2x)
RGH (1x)


Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie