[VB.Net] Anchors, 2 CheckedListBoxes

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Satom
  • Registratie: Mei 2011
  • Laatst online: 19-09 10:46

Satom

Verzamel ervaringen

Topicstarter
Beste Tweakers!

Ik hoop dat ik legaal bezig ben, anders heb ik niet goed gelezen.

Maar waar het om draait. Ik heb twee CheckedListBoxes in mijn programma, die ik graag zie vergroten bij het groter maken van de Main form. Nu heb ik d.m.v. een stukje code het wel al voor elkaar gekregen dat de linker CheckedListbox netjes vergroot en de grote krijgt als gewenst.

Helaas krijg ik het met de tweede CheckedListBox niet voor elkaar. Ik weet niet hoe ik de Locatie (Location X) moet bepalen.

Hier volgt de code dat ik gebruik voor de linker CheckedListBox, geplaatst in de Main.Resize:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
Private Sub Main_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Resize
        Try
            Dim t_w As Decimal = (Me.Size.Width / Width_Window) * T_Width
            Dim t_h As Decimal = (Me.Size.Height / Height_Window) * T_Height

            Me.CListBox_LoadFromZip.Size = New Size(t_w, t_h)
        Catch
        End Try
End Sub


De waarden Width_Windows en Height_Window heb ik in de Load stukje geplaatst, zodat deze gelijk gezet worden bij het laden/starten van de Applicatie
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
Private Sub Main_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Height_Window = Me.Size.Height
        Width_Window = Me.Size.Width

        T_Height = CListBox_LoadFromZip.Size.Height
        T_Width = CListBox_LoadFromZip.Size.Width

End Sub


Voor het rechter CheckedListBox heb ik dit al geprobeerd in de Main.Resize:

Visual Basic .NET:
1
2
3
Me.CheckedListBox1.Size = New Size(t_w, t_h) 'Size is same as the first CheckedListBox

Me.CheckedListBox1.Location = New Size(CListBox_LoadFromZip.Location.X + t_w, Me.CheckedListBox1.Location.Y)
Zonder gewenste resultaat. (Zie: http://i.imgur.com/cd9qq.png, is zit geen ruimte meer tussen de twee CheckedListBoxes)

Toen dacht ik er nog aan om de Anchor op Top en Right te zetten, met in het achterhoofd: "Als de Anchor op Right staat, komt de CheckedListBox aan de rechterkant te staan, dan hoef ik het 'alleen' nog maar 'even' te verplaatsen."

Alleen weet ik niet hoe ik erachter kom hoeveel ik het moet verplaatsen naar links.

Ik heb nog even een screenshot gemaakt om het (misschien) iets duidelijker te maken:
De Form zonder vergroten, in standaard formaat.
http://i.imgur.com/bvs8n.png

En nog één waar de linker perfect is; http://i.imgur.com/RJ8DT.png

Alles is geschreven in Visual Basic .NET en ik hoop dat iemand mij in de goede richting kan duwen.. misschien is het ook wel een "beginnersfout".. maar ik ben zelf ten einde raad, heb Google ook geraadpleegd (vrijwel de gehele middag) en kon niet het gewenste resultaat vinden..

Alvast bedankt _/-\o_

Acties:
  • 0 Henk 'm!

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 13:19

Reptile209

- gers -

Volgens mij zit je veel moeilijker te denken dan nodig. Je moet de boel alleen even overzichtelijk uitschrijven:

Linker list
• Left = vaste waarde, zeg A = 20 px
• Width = functie van window-breedte, zie verderop, zeg B
• -> dus rechter hoek zit op Left + Width = A + B

Tussenruimte
• Vaste waarde, zeg C = 10 px

Rechter list
• Left = D = A+B+C, want beginpunt + breedte andere box + breedte tussenruimte
• Width = net zo breed als linker, dus B
• -> dus rechter hoek zit op Left + Width = D + B = A + B + C + B = A + 2B + C, en die moet dan ook weer een afstand A van de windowrand zitten.

En nu wil je B kunnen berekenen, als functie van je window-size. Dus als je window breedte Q heeft, reken je: Q = 2A + 2B + C = 2*20 + 2*B + 10 = 30 + 2* B. Als Q = 500 px, is B dus (500 - 30)/2 = 470/2 = 235. En dan kan je alle posities invullen:
• Linker list op Left = A = 20, Width = B = 235
• Rechter list op Left = A+B+C = 20 + 235 + 10 = 265, Width = 235.

En elke keer als je window resized, bereken je de nieuwe B en zet je de nieuwe Left's en Width's. Tot slot kan je nog een check doen voor als je window kleiner dan 2*A + C wordt (of een andere minimale breedte), en dan de resize blocken.

Helpt dat? :)

Edit: oh, en omdat je alles handmatig regelt, kan je je anchors uitzetten, die maken het dan alleen maar nodeloos complex. Hoewel, voor de hoogte kan je die misschien nog wel gebruiken, kijk maar wat je handig vindt :+.

[ Voor 7% gewijzigd door Reptile209 op 01-08-2012 21:15 ]

Zo scherp als een voetbal!


Acties:
  • 0 Henk 'm!

  • edeboeck
  • Registratie: Maart 2005
  • Laatst online: 11-09 13:47

edeboeck

mie noow noooothing ...

Vergis ik me of kan je dat niet veel eenvoudiger via een Splitcontainer doen? Als je dan voor beide checkedlistboxes de "dock"-property op "Fill" zit, ben je er volgens mij... niet?

Acties:
  • 0 Henk 'm!

  • TallManNL
  • Registratie: Oktober 2005
  • Laatst online: 19-09 12:09
Kun je met die dock dan nog je rand netjes op 10px houden? Daar waar ik hem heb gebruikt moest het gewoon vullend zijn dus nooit gezocht naar enige padding mogelijkheden.

Ander kun je die splitcontainer pakken met daarin je checkedlistboxes die dan op zowel anchor left en right staan, dan houden ze automatisch hun afstanden links en rechts tov parent grenzen.

geheelonthouder met geheugenverlies


Acties:
  • 0 Henk 'm!

  • NickThissen
  • Registratie: November 2007
  • Laatst online: 09-09 10:50
Je zou nooit code hoeven te gebruiken om controls te plaatsen bij het resizen, dat kun je allemaal prima doen met een combinatie van Anchor, Dock, en Padding properties. Eventueel gebruik je SplitContainers of andere layout controls.

In dit geval neem je gewoon een SplitContainer, die heeft twee panels en een splitter. Zet een CheckedListBox aan elke kant en laat ze de ruimte vullen dmv de Dock property op Fill. De marge tussen de listbox en de rand van de splitcontainer kun je instellen via de Padding property van de panels in de SplitContainer. De SplitContainer zelf zul je waarschijnlijk via Anchoring moeten instellen (alle richtingen) zodat hij de form volgt.

Mijn iRacing profiel


Acties:
  • 0 Henk 'm!

  • Reptile209
  • Registratie: Juni 2001
  • Laatst online: 13:19

Reptile209

- gers -

Toegegeven: ik ken de (on)mogelijkheden van een SpillContainer niet. Maar mijn code-aanpak is best doorzichtig en biedt volgens mij meer mogelijkheden om de beide panels asymmetrisch te sizen, of bijvoorbeeld na een bepaalde breedte het linker panel vast te zetten (max breedte), of om het form op een minimale breedte te houden. En je ziet tenminste wat je doet :). Maargoed, ieder zijn favoriet...

Zo scherp als een voetbal!


Acties:
  • 0 Henk 'm!

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 06-09 17:51
Reptile209 schreef op donderdag 02 augustus 2012 @ 19:39:
Toegegeven: ik ken de (on)mogelijkheden van een SpillContainer niet. Maar mijn code-aanpak is best doorzichtig en biedt volgens mij meer mogelijkheden om de beide panels asymmetrisch te sizen, of bijvoorbeeld na een bepaalde breedte het linker panel vast te zetten (max breedte), of om het form op een minimale breedte te houden. En je ziet tenminste wat je doet :). Maargoed, ieder zijn favoriet...
Alles wat je hier opnoemt kun je met de standaard control properties ook al regelen. Je bent het jezelf gewoon moeilijk aan het maken en je bent potentiële edge cases aan het introduceren waar het fout kan gaan. Niet doen dus.

Wat betreft "en je ziet tenminste wat je doet": ik zie liever herkenbare control properties waar iedereen de achterliggende betekenis en het gebruik van kent dan een hele bups VB code met allerlei berekeningen zonder referentie kader. (Überhaupt is VB vanwege de verbositeit van de syntax al een stuk minder leesbaar dan bijvoorbeeld C#.)

[ Voor 18% gewijzigd door R4gnax op 02-08-2012 20:28 ]


Acties:
  • 0 Henk 'm!

  • Satom
  • Registratie: Mei 2011
  • Laatst online: 19-09 10:46

Satom

Verzamel ervaringen

Topicstarter
Reptile209 schreef op woensdag 01 augustus 2012 @ 21:12:
Volgens mij zit je veel moeilijker te denken dan nodig. Je moet de boel alleen even overzichtelijk uitschrijven:
...Heel verhaal... _/-\o_
Hartstikke bedankt! Ik heb het vandaag op papier uitgewerkt (jou verhaal), tijdens de pauze van mijn werk (Hema :9), want had geen mogelijkheid om het te testen. Maar op papier kreeg ik qua antwoorden wel wat jij vertelde, bij deze ben ik je daarom erg dankbaar ;)
NickThissen schreef op donderdag 02 augustus 2012 @ 10:10:
Je zou nooit code hoeven te gebruiken om controls te plaatsen bij het resizen, dat kun je allemaal prima doen met een combinatie van Anchor, Dock, en Padding properties. Eventueel gebruik je SplitContainers of andere layout controls.

In dit geval neem je gewoon een SplitContainer, die heeft twee panels en een splitter. Zet een CheckedListBox aan elke kant en laat ze de ruimte vullen dmv de Dock property op Fill. De marge tussen de listbox en de rand van de splitcontainer kun je instellen via de Padding property van de panels in de SplitContainer. De SplitContainer zelf zul je waarschijnlijk via Anchoring moeten instellen (alle richtingen) zodat hij de form volgt.
Ik moet heel eerlijk bekennen dat ik de optie/functie SplitContainer niet kende |:( Maar na het lezen van jou verhaal/input heb ik het zojuist uitgeprobeerd, het werkt zoals ik wil. Nou ja, niet helemaal. De tussen stukje, tussen de twee CheckedListBoxes, krijgt niet de juiste pixel breedte als ik ga debuggen (F5).. maar in het programma (Visual Studio 2010) zie ik wel de gewenste pixel breedte, namelijk de breedte die ik heb ingevuld bij de SplitContainer.

Waarschijnlijk komt dit doordat de CheckedListBox een fixed hoogte en breedte heeft?
Maar er zit een "wit"-ruimte/marge tussen dus ik ben tevreden.. wel denk ik dat ik met de method van Reptile209 de gewenste marge voor elkaar kan krijgen. (Maar zo te lezen is dit qua code niet erg verstandig.. denk dat je dan een Try, Catch, End Try eromheen moet gaan zetten. En als het dan niet werkt, tja dan hang je al. Want er zal dan waarschijnlijk niets worden vergroot/verkleind)

Maar ik wil iedereen heel erg bedanken voor zijn of haar input! Duizend maal dank _/-\o_ Ik kan mijn weg weer gaan vervolgen! O-)
Pagina: 1