Toon posts:

[VB.NET] Object in ander Form benaderen.

Pagina: 1
Acties:
  • 440 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik heb een application met twee forms.

Eerste form is de "main" appplicatie.
Tweede form is voor de settings.

In het eerste forum laad ik een object.
Nu wil ik in het tweede forum een eigenschap van dat object veranderen.

Maar ik kan hem niet zien via FormNaam.ObjectNaam

Mijn code:

MainForm
Visual Basic .NET:
1
2
3
4
5
6
7
8
Public Class MainForm
Public Object as Class

Private Sub Button_Clicked
Object.Run
End Sub

End Class


SettingsForm
Visual Basic .NET:
1
2
3
4
5
6
7
Public Class SettingsForum

Private Sub ChangeSetting
<hoe verander ik hier de eigenschappen (een property) van Object uit klasse hierboven>
End Sub

End Class

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 19-05 13:45

gorgi_19

Kruimeltjes zijn weer op :9

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:34
Kan je geen reference naar dat object meegeven aan je settingsform ?

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op donderdag 02 december 2004 @ 11:12:
Kan je geen reference naar dat object meegeven aan je settingsform ?
Ik open SettingsForm met SettingsForm.Show. Maar welke Sub wordt er dan geladen waarin ik de reference kan opvangen? Niet SettingsForm_Load zo te zien.

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:34
Verwijderd schreef op donderdag 02 december 2004 @ 11:21:
[...]


Ik open SettingsForm met SettingsForm.Show. Maar welke Sub wordt er dan geladen waarin ik de reference kan opvangen? Niet SettingsForm_Load zo te zien.
Ehm, je zult ze zelf moeten doorgeven.
Maak een property, een method , whatever die je kunt aanroepen op je settingsform en waaraan je dat object kunt doorgeven.

https://fgheysels.github.io/


  • MrSleeves
  • Registratie: Februari 2004
  • Laatst online: 10-04 19:23

MrSleeves

You'll thank me later.

Verwijderd schreef op donderdag 02 december 2004 @ 11:21:
[...]

Ik open SettingsForm met SettingsForm.Show. Maar welke Sub wordt er dan geladen waarin ik de reference kan opvangen? Niet SettingsForm_Load zo te zien.
Je doet toch zoiets:
Visual Basic .NET:
1
2
3
dim f as new MySettingsForm
f.ReftoObject = myObjectToChange
f.Show


te laat..

30Drie Web Design & IT Consultancy | Raven Consultancy Services


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 18-05 09:50

pjvandesande

GC.Collect(head);

Je kunt het natuurlijk ook meegeven in de constructor.

Of is dit niet mogelijk in VB.NET, ik word namelijk in 1x niet zo zeker van mij zaak. :+

Verwijderd

Topicstarter
Chief.NET schreef op donderdag 02 december 2004 @ 11:22:
[...]

Je doet toch zoiets:
Visual Basic .NET:
1
2
3
dim f as new MySettingsForm
f.ReftoObject = myObjectToChange
f.Show


te laat..
Als ik in SettingsClass een propery (writeonly) maak, dan zet hij er automatisch ByVal bij.

Visual Basic .NET:
1
2
3
4
5
Public WriteOnly Property Encoder() As WMEncoder
        Set(ByVal Value As WMEncoder)

        End Set
    End Property


Ik mag ByVal niet veranderen naar ByRef, dus kan het object niet als Reference opgeven bij property?

  • MrSleeves
  • Registratie: Februari 2004
  • Laatst online: 10-04 19:23

MrSleeves

You'll thank me later.

Verwijderd schreef op donderdag 02 december 2004 @ 11:29:
[...]

Als ik in SettingsClass een propery (writeonly) maak, dan zet hij er automatisch ByVal bij.

Visual Basic .NET:
1
2
3
4
5
Public WriteOnly Property Encoder() As WMEncoder
        Set(ByVal Value As WMEncoder)

        End Set
    End Property


Ik mag ByVal niet veranderen naar ByRef, dus kan het object niet als Reference opgeven mij property?
Euhm:
Visual Basic .NET:
1
2
3
Public Sub SetReference(ByRef mySettings as mySettingsClass)
      ..bla
End Sub
questa schreef op donderdag 02 december 2004 @ 11:27:
Je kunt het natuurlijk ook meegeven in de constructor.

Of is dit niet mogelijk in VB.NET, ik word namelijk in 1x niet zo zeker van mij zaak. :+
Kan ook... Gewoon New "overloaden" (bij New alleen zonder keyword)
Je kan ook Show overloaden, dus meegeven bij het openen, maar da's wat minder netjes.
Ik doe het meestal met een subroutine. New kan je alleen maar overloaden, je moet er wel eentje zonder parameters hebben (o.a. vanwege design-time rommel).

[ Voor 34% gewijzigd door MrSleeves op 02-12-2004 11:36 ]

30Drie Web Design & IT Consultancy | Raven Consultancy Services


Verwijderd

Topicstarter
[quote]Chief.NET schreef op donderdag 02 december 2004 @ 11:33:
[...]

Euhm:
Visual Basic .NET:
1
2
3
Public Sub SetReference(ByRef mySettings as mySettingsClass)
      ..bla
End Sub



[...]

Dan moet ik eerst FormSettings.SetReference uitvoeren en daarna FormSettings.Show

Maar als SetReference is uitgevoerd gaat het Object toch weer terug naar MainForm voordat ik FormSettings.Show uitvoer? Of blijft hij in het object tot dat ik het form sluit?

Ter info:

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
Public Class Settings
    Inherits System.Windows.Forms.Form
    Private _Encoder As WMEncoder

    Public Sub SetEncoder(ByRef EncoderObject As WMEncoder)
        _Encoder = EncoderObject
    End Sub

Private Sub Settings_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    _Encoder.Settingiets = waarde
End Sub
End Class

  • MrSleeves
  • Registratie: Februari 2004
  • Laatst online: 10-04 19:23

MrSleeves

You'll thank me later.

F5 geeft de oplossing denk ik.... NOFI :)

30Drie Web Design & IT Consultancy | Raven Consultancy Services


Verwijderd

Topicstarter
Chief.NET schreef op donderdag 02 december 2004 @ 12:21:
F5 geeft de oplossing denk ik.... NOFI :)
Tja had gehoopt dat iemand kon uitleggen waarom het wel of niet zo is.

  • MrSleeves
  • Registratie: Februari 2004
  • Laatst online: 10-04 19:23

MrSleeves

You'll thank me later.

Verwijderd schreef op donderdag 02 december 2004 @ 12:23:
[...]

Tja had gehoopt dat iemand kon uitleggen waarom het wel of niet zo is.
Okee.. :)
Het is heel simpel. Je maakt een instance aan van je SettingsForm.
Vervolgens geef je je settings m.b.v. de subroutine. Daar sla je de ref op in een variabele.
Dit is geen local variable in de functie, maar in de class.

Die variable blijft daar net zo lang als jij wilt. Dus totdat je 'm zelf Nothing maakt, of totdat je het SettingsForm op laat houden met bestaan.

Hoe kom je er bij dat ie de waarde kwijt zou raken?
Vergelijk _Encoder en localEnc:

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
Public Class Settings 
    Inherits System.Windows.Forms.Form 
    Private _Encoder As WMEncoder 

    Public Sub SetEncoder(ByRef EncoderObject As WMEncoder) 
        _Encoder = EncoderObject 'Wordt vastgehouden
        Dim localEnc as WMEncoder = EncoderObject 'ben je kwijt na de End Sub
    End Sub 

Private Sub Settings_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    _Encoder.Settingiets = waarde 
End Sub 
End Class

30Drie Web Design & IT Consultancy | Raven Consultancy Services


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 18-05 09:50

pjvandesande

GC.Collect(head);

Chief.NET schreef op donderdag 02 december 2004 @ 11:33:
[...]

Kan ook... Gewoon New "overloaden" (bij New alleen zonder keyword)
Je kan ook Show overloaden, dus meegeven bij het openen, maar da's wat minder netjes.
Ik doe het meestal met een subroutine. New kan je alleen maar overloaden, je moet er wel eentje zonder parameters hebben (o.a. vanwege design-time rommel).
Ik doe het zelf meestal in de ctor. Het is wel mooi omdat je het afdwingt om het te setten voordat je show aanroept. Maar met een extra set method is het natuurlijk ook goed te doen.

De designer heeft er bij mij nooit problemen mee als ik geen ctor zonder arguments heb.

Verwijderd

Topicstarter
Chief.NET schreef op donderdag 02 december 2004 @ 12:35:
[...]

Okee.. :)
Het is heel simpel. Je maakt een instance aan van je SettingsForm.
Vervolgens geef je je settings m.b.v. de subroutine. Daar sla je de ref op in een variabele.
Dit is geen local variable in de functie, maar in de class.

Die variable blijft daar net zo lang als jij wilt. Dus totdat je 'm zelf Nothing maakt, of totdat je het SettingsForm op laat houden met bestaan.

Hoe kom je er bij dat ie de waarde kwijt zou raken?
Vergelijk _Encoder en localEnc:

Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
Public Class Settings 
    Inherits System.Windows.Forms.Form 
    Private _Encoder As WMEncoder 

    Public Sub SetEncoder(ByRef EncoderObject As WMEncoder) 
        _Encoder = EncoderObject 'Wordt vastgehouden
        Dim localEnc as WMEncoder = EncoderObject 'ben je kwijt na de End Sub
    End Sub 

Private Sub Settings_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    _Encoder.Settingiets = waarde 
End Sub 
End Class
Hoe kun je het EncoderObject weer vrij geven / terug geven?

_Encoder = nothing dan destroy je het object ook in MainForm
EncoderObject = nothing dan destroy je het object rechtstreeks in MainForm

[ Voor 17% gewijzigd door Verwijderd op 02-12-2004 13:59 ]


  • MrSleeves
  • Registratie: Februari 2004
  • Laatst online: 10-04 19:23

MrSleeves

You'll thank me later.

questa schreef op donderdag 02 december 2004 @ 13:04:
[...]

Ik doe het zelf meestal in de ctor. Het is wel mooi omdat je het afdwingt om het te setten voordat je show aanroept. Maar met een extra set method is het natuurlijk ook goed te doen.

De designer heeft er bij mij nooit problemen mee als ik geen ctor zonder arguments heb.
Normaal gesproken gaat het ook prima.
Dit komt omdat je overerft van bv. Form of UserControl. In de designer wordt dan de ctor van die class aangeroepen.
Maar als je daar weer van gaat overerven (van de door jouw gemaakte class) gaat het mis, want dan kan de designer geen ctor vinden zonder parameters.
Hetzelfde geldt voor een MustInherit class. Als dat nou toevallig een UserControl is, dan gaat de MustInherit class zelf prima, maar als je er van overerft (wat het hele idee is), dan krijg je geen designer te zien (een foutmelding wel :( ).

Op zich wel logisch, maar toch heel vervelend.
Er zijn overigens allerlei workarounds m.b.v. #DESIGN ofzo, maar dat vind ik helemaal niks.

Meestal laat ik de ctors en de mustinherits achterwege en zet ik het in de documentatie.
Hee, niet mijn code trashen! ;) (serieus: als je het eronder zet is het wat duidelijker)
Euhm.. volgens mij kan je in het settingsform de _Encoder gewoon Nothing maken. Je maakt dan alleen de referentie Nothing, maar dat wil niet zeggen dat het object ook Disposed is.

Ik kijk net naar mijn code (doe de hele dag niet anders B) ) en ik gebruik gewoon een property (met Get en Set). En dan gewoon in de _encoder zetten.

[ Voor 20% gewijzigd door MrSleeves op 02-12-2004 13:34 ]

30Drie Web Design & IT Consultancy | Raven Consultancy Services


Verwijderd

Topicstarter
Chief.NET schreef op donderdag 02 december 2004 @ 13:27:
[...]

Ik kijk net naar mijn code (doe de hele dag niet anders B) ) en ik gebruik gewoon een property (met Get en Set). En dan gewoon in de _encoder zetten.
Get Set property werkt met ByVal en niet met ByRef, dus dat zou niet mogen werken.

  • MrSleeves
  • Registratie: Februari 2004
  • Laatst online: 10-04 19:23

MrSleeves

You'll thank me later.

Verwijderd schreef op donderdag 02 december 2004 @ 14:00:
[...]

Get Set property werkt met ByVal en niet met ByRef, dus dat zou niet mogen werken.
Hangt er vanaf wat je er mee gaat doen.
Maar op zich werkt dat prima.
Het verschil:
Visual Basic .NET:
1
2
3
Public Sub Settings(ByVal i as integer)
    i+=1
End Sub

Als je deze functie aanroept, dan verandert de waarde niet (alleen in de sub zelf); neem je ByRef, dan verandert de waarde wel.
Maar bij Classes gaat dit niet op. Als je integer in een eigen class veranderd en je wijzigt in die class een property, dan wijzigt die property wel degelijk (ook als je weer uit de sub komt).

Check anders even de MSDN, maar volgens mij gaat het alleen op bij data-types.
Je kan bij een ByRef ook niet gewoon 10 als getal opgeven, want daar is niet aan te refereren.

30Drie Web Design & IT Consultancy | Raven Consultancy Services


Verwijderd

Topicstarter
Chief.NET schreef op donderdag 02 december 2004 @ 14:15:
[...]

Hangt er vanaf wat je er mee gaat doen.
Maar op zich werkt dat prima.
Het verschil:
Visual Basic .NET:
1
2
3
Public Sub Settings(ByVal i as integer)
    i+=1
End Sub

Als je deze functie aanroept, dan verandert de waarde niet (alleen in de sub zelf); neem je ByRef, dan verandert de waarde wel.
Maar bij Classes gaat dit niet op. Als je integer in een eigen class veranderd en je wijzigt in die class een property, dan wijzigt die property wel degelijk (ook als je weer uit de sub komt).

Check anders even de MSDN, maar volgens mij gaat het alleen op bij data-types.
Je kan bij een ByRef ook niet gewoon 10 als getal opgeven, want daar is niet aan te refereren.
Maar toch niet als je de waarde van een property van een object veranders als je dat laatste object als ByVal in een property laad? Dan kopieer je het object toch alleen maar even?

  • MrSleeves
  • Registratie: Februari 2004
  • Laatst online: 10-04 19:23

MrSleeves

You'll thank me later.

Verwijderd schreef op donderdag 02 december 2004 @ 14:22:
[...]

Maar toch niet als je de waarde van een property van een object veranders als je dat laatste object als ByVal in een property laad? Dan kopieer je het object toch alleen maar even?
Nope.. Een Class != DataType. De property wordt niet gekopieerd (daar is ook geen functie voor).
Ik denk dat de referentie als variabele meegegeven wordt. En als je ByRef neemt, dan wordt de referentie als referentie meegegeven (denk ik).

TADA: MSDN - Argument Passing Mechanism

[ Voor 13% gewijzigd door MrSleeves op 02-12-2004 14:31 ]

30Drie Web Design & IT Consultancy | Raven Consultancy Services


Verwijderd

Topicstarter
Chief.NET schreef op donderdag 02 december 2004 @ 14:27:
[...]

Nope.. Een Class != DataType. De property wordt niet gekopieerd (daar is ook geen functie voor).
Ik denk dat de referentie als variabele meegegeven wordt. En als je ByRef neemt, dan wordt de referentie als referentie meegegeven (denk ik).

TADA: MSDN - Argument Passing Mechanism
Haha raar dit, eerste wat ze over .NET zeiden tegen mij een OO programmeren dat alles een datatype is ook classes. Maar dat klopt dan niet?

  • MrSleeves
  • Registratie: Februari 2004
  • Laatst online: 10-04 19:23

MrSleeves

You'll thank me later.

Verwijderd schreef op donderdag 02 december 2004 @ 14:37:
[...]

Haha raar dit, eerste wat ze over .NET zeiden tegen mij een OO programmeren dat alles een datatype is ook classes. Maar dat klopt dan niet?
Ik zeg het verkeerd: Value Type != Reference Type (zoals ook in de MSDN-pagina staat).
Dit kan ook niet:
Visual Basic .NET:
1
Dim i as New Integer

Omdat het een Value Type is. Daar kan je geen instance van maken.

30Drie Web Design & IT Consultancy | Raven Consultancy Services


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 19-05 13:45

gorgi_19

Kruimeltjes zijn weer op :9

Visual Basic .NET:
1
Dim LL As Integer = New Integer

Compileert anders wel hoor :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 18-05 09:50

pjvandesande

GC.Collect(head);

Als jij een eigen struct hebt (Value Type) dan kun je toch gewoon:


C#:
1
MyStruct m_MyStruct = new MyStruct("iets van een args", "en nog 1");

Of gewoon met een int werkt dit ook en de ctor hoeft geen args te accepteren.

edit:
Kijk bij gorgi werkt dit dus ook.
:Y)

[ Voor 65% gewijzigd door pjvandesande op 02-12-2004 14:54 . Reden: Gorgi support :+ ]


Verwijderd

Topicstarter
Chief.NET schreef op donderdag 02 december 2004 @ 14:41:
[...]

Ik zeg het verkeerd: Value Type != Reference Type (zoals ook in de MSDN-pagina staat).
Dit kan ook niet:
Visual Basic .NET:
1
Dim i as New Integer

Omdat het een Value Type is. Daar kan je geen instance van maken.
Denk dat ik het snap.

Ook al staat er ByVal in een Property, als je een object er in laadt dan wordt deze er ook echt in gebruikt en niet naar toe gekopieerd zoals bij een Sub Telop(ByVal getal as integer) waabij getal buiten de sub gewoon weer de oorspronkelijk waarde heeft (altijd al gehad dus).

  • MrSleeves
  • Registratie: Februari 2004
  • Laatst online: 10-04 19:23

MrSleeves

You'll thank me later.

gorgi_19 schreef op donderdag 02 december 2004 @ 14:50:
Visual Basic .NET:
1
Dim LL As Integer = New Integer

Compileert anders wel hoor :)
Hee, dat werkt... ik weet dat het eerst niet werkte.. zal wel VS2002 zijn geweest ofzo.
questa schreef op donderdag 02 december 2004 @ 14:50:
Als jij een eigen struct hebt (Value Type) dan kun je toch gewoon:

C#:
1
MyStruct m_MyStruct = new MyStruct("iets van een args", "en nog 1");

Of gewoon met een int werkt dit ook en de ctor hoeft geen args te accepteren.

edit:
Kijk bij gorgi werkt dit dus ook.
:Y)
Een struct(ure) wordt wel als reference doorgegeven (schijnt).. ofzo. 8)7

30Drie Web Design & IT Consultancy | Raven Consultancy Services

Pagina: 1