Toon posts:

[VB6] controls runtime toevoegen in verschillende picturebox

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb deze vraag gisteren ook al gesteld maar dat draadje heeft een slotje gekregen.
Overigens volledig terecht. Ik had duidelijker moeten zijn.
De orginele post is hier te vinden:
controls runtime toevoegen in verschillende pictureboxen

Ik ben dankzij de antwoorden toch weer verder.
In het kort:
Ik heb een XML-bestand waar de eerste knooppunten de tabbladen voorstellen en de children van een knooppunt controls op dat tabblad.
De tabbladen worden getoond door een cmdButton met een picturebox
Labels en tekstvakken maak ik zo:
code:
1
2
3
Set t = frm.Controls.Add("VB.Textbox", "txt" & teller, frm.picTab(lPicnr))
t.Text = "Komt nog" & teller
t.Visible = True

Dit werkt prima.
Maar ik moet ook cmdbuttons kunnen toevoegen met de events.
Er moet nl. een button komen met het file-open plaatje erop en als je daarop klikt dan moet de commonDialog.showOpen worden getoond.
Als ik dat op bovenstaande manier doe, krijg ik wel de button in de juiste picturebox maar dan zonder events.
Als ik het zo doe:
code:
1
2
3
Load frm.cmdPicOpenFile(i)
frm.cmdPicOpenFile(i).Top = t.Top
frm.cmdPicOpenFile(i).Visible = True

krijg ik wel een kopie van de button, met plaatje en events maar dan allemaal in de eerste picturebox.

Via een andere link heb ik op MSDN nog wat anders gevonden.
Ik declareer in het form:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Option Explicit
Dim WithEvents cmdPicOpenFile As CommandButton
Private Sub cmdPicOpenFile_Click()
On Error GoTo Err_handler
  With CommonDialog1
    .ShowOpen
    msgBox .FileName
  End With
  
  Exit Sub
  
Err_handler:

' User pressed Cancel button.
   Exit Sub
End Sub

In mijn module doe ik het volgende:
code:
1
2
3
Set frm.cmdPicOpenFile = frm.Controls.Add("VB.CommandButton", "cmdPic" & lPicnr, _
                     frm.picTab(lPicnr))
frm.cmdPicOpenFile.Visible = True

Maar dan krijg ik op de eerste regel de volgende foutmelding:

Error 438 (Object doesn't support this property or method)

Ik zie het niet meer. |:(
Iemand suggesties?

[ Voor 3% gewijzigd door Verwijderd op 06-07-2004 11:23 . Reden: Topiclink gewijzigd ]


  • RayNbow
  • Registratie: Maart 2003
  • Laatst online: 19:54

RayNbow

Kirika <3

Ik heb ongeveer dezelfde code gekopieerd van de 2e manier en bij mij werkt dat wel. Alleen moest ik cmdPicOpenFile als Public declareren anders kon ik er niet bij vanuit een module.

Ik zal nu ff kijken naar de eerste manier. Het is namelijk mogelijk om de parent van een control te veranderen...




Ok, gevonden... :)

Visual Basic 6:
1
Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long


Visual Basic 6:
1
2
3
4
5
Load frm.cmdPicOpenFile(i)
frm.cmdPicOpenFile(i).Top = t.Top
frm.cmdPicOpenFile(i).Visible = True

Call SetParent(frm.cmdPicOpenFile(i).hWnd, frm.picTab(i).hWnd)

[ Voor 37% gewijzigd door RayNbow op 06-07-2004 11:42 ]

Ipsa Scientia Potestas Est
NNID: ShinNoNoir


Verwijderd

Topicstarter
@ RayNbow:
Geweldig!
Door de functie SetParent ben ik van een hele hoop ellende af.
Ik heb het geprobeerd en inderdaad werkt het.
Bedankt. _/-\o_

Verwijderd

Topicstarter
Ik ben weer tegen een nieuw probleempje opgelopen.
Optionbuttons.
Ik wil dynamisch een aantal, bij elkaar horende, optionbuttons plaatsten, waarvan dan maar 1 tegelijk geselecteerd kan worden.
Als ik dat met load() en SetParent doe gaat het goed voor de eerste serie maar de tweede serie geeft een foutmelding.
Dat is op zich wel logisch want anders zouden alle buttons bij elkaar horen en dan kan ik maar 1 selecteren.

Ik dacht dit op te lossen door eerst een nieuw optionbutton toe te voegen met
code:
1
set r=frm.Controls.Add

en dan daar vervolgens een array van buttons van te maken via
code:
1
Load r(lIndex)

Maar dat mag niet omdat r geen array is. 8)7

Hoe los ik dit nu op?

Verwijderd

Topicstarter
Ik heb het nu opgelost door meerdere optionbuttons in design-time te maken en tijdens runtime een teller bij te houden hoeveel series al geplaatst zijn.
Ik ben niet weg van deze oplossing maar het werkt wel (mits ik genoeg optionbuttons in design-time definieer ;)).
Hier is de code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    'Omdat elke serie gemaakt moet worden van een nieuw orgineel, moet
    'dat hier gesplitst worden. 't Is niet netjes maar het werkt wel:
    Select Case lButtonSeries
    Case 1:
      Load frm.radioPic1(lIndex)
      Set radiobutton = frm.radioPic1(lIndex)
    Case 2:
      Load frm.radioPic2(lIndex)
      Set radiobutton = frm.radioPic2(lIndex)
    Case 3:
      Load frm.radioPic3(lIndex)
      Set radiobutton = frm.radioPic3(lIndex)
    Case Else:
      SchrijfError "Error"
      Exit Function
    End Select