[vb.net] variable in andere form beschikbaar maken

Pagina: 1
Acties:

  • PreDaTorY
  • Registratie: November 2000
  • Laatst online: 30-03 12:25
Misschien een wat onduidelijke titel maar dat komt een beetje omdat ik geen idee heb hoe ik het anders moet verwoorden

Ik zit met het volgende: In het hoofdform heb ik een aantal variable, die wil ik aan kunnen spreken in een zelfgemaakt dialoogvenster voor het laden/opslaan.

Ik heb het volgende in me hoofdform staan:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
enum status 
  open
  closed
end enum

private _conn as connection    'adodb connection

    Public Property _connstate() As status
        Get
            If _conn.State > 0 Then
                Return status.open
            Else
                Return status.close
            End If
        End Get
        Set(ByVal Value As status)
            If Value = status.close Then
                Me.StatusBarPanel3.Text = "Closed"
            Else
                Me.StatusBarPanel1.Text = "Open"
            End If
        End Set
    End Property


Wat moet ik nu doen om deze variable bekend te maken in mijn dialog?

in het dialogform heb ik het volgende geprobeerd:
Visual Basic:
1
private hoofdform as form1 

deze moet alleen nog verwijzen naar het hoofdscherm.

nu zijn de variable wel bekend maar omdat ik niet weet hoe ik goed verwijs naar die pointer krijg ik de volgende foutmelding
Object reference not set to an instance of an object.

wie oh wie kan mij helpen? :)

  • whoami
  • Registratie: December 2000
  • Laatst online: 10:17
Je opent je dialogvenster toch via je hoofdform?

Je kan toch aangeven dat je hoofdform parent of owner is van je dialoogvenster?

code:
1
2
MyDialogForm frmMyDialog = new MyDialogForm( this );
frmMyDialog.Show();

C# code

En dan kan je in je dialoogvenster adhv de owner property aan de public en internal properties/data members van je hoofdform.


Je moet trouwens niet alleen een variable declareren, je zult ook moeten geheugen toewijzen aan die variabele.

[ Voor 17% gewijzigd door whoami op 15-05-2003 14:53 ]

https://fgheysels.github.io/


  • PreDaTorY
  • Registratie: November 2000
  • Laatst online: 30-03 12:25
zoiets als dit?
Visual Basic:
1
private hoofdform as form1 = me.owner


en in het andere form bij het aanmaken dialog.owner = me

dan zat ik dus heel erg dicht in de buurt.. ik was alleen vergeten om dialog.owner = me in te stellen :)

  • whoami
  • Registratie: December 2000
  • Laatst online: 10:17
Nee, daar ga je heel wat anders doen.

Met die code maak je een object van het type hoofdform, en ga je me.owner er aan gaan assignen.

Ik stel voor dat je eens een boek koopt over .NET (VB.NET), en je daar eea in leest. Bv over classes, constructors ed.

In VB.NET wordt het zoiets denk ik:
(die code zet je in je hoofdform, daar waar je je dialogform oproept)
code:
1
2
3
Dim MyDialogForm As New frmDialog(me)

MyDialogForm.Show()


Dan kan je in je dialogform dmv de owner property aan de properties die je nodig hebt.

https://fgheysels.github.io/


  • PreDaTorY
  • Registratie: November 2000
  • Laatst online: 30-03 12:25
het werkt dus nogsteeds niet :(

ik doe nu het volgende:
form1
code:
1
2
3
4
5
dim dialog as new databaseform()
dialog.owner = me

if dialog.showdialog = dialogresult.ok then
....


databaseform
code:
1
2
3
4
5
6
private hoofdform as form1 = me.owner

Private Sub databaseForm_Load(ByVal sender As Object, ByVal e As _
System.EventArgs) Handles MyBase.Load
msgbox(me.hoofdform.name)
end sub


tot nu toe krijg deze mooie foutmelding: Object reference not set to an instance of an object.

[edit]
dat stukje met nieuw had ik dus al wel uit het boek gehaald :) alleen het boek laat de rest dus niet zien :(

[ Voor 11% gewijzigd door PreDaTorY op 15-05-2003 15:13 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 10:17
je krijgt die fout waarschijnlijk op deze regel:
code:
1
private hoofdfrom as form1 = me.owner

?

Wat doet die code precies? Wat doet dat daar? Weet je wat die foutmelding wil zeggen?

https://fgheysels.github.io/


  • PreDaTorY
  • Registratie: November 2000
  • Laatst online: 30-03 12:25
ik krijg de foutmelding op de msgbox, denk dat ie bedoeld dat het form naar niks verwijst.
als ik me.owner laat zien geeft ie al wel wat weer, maar op 1 of andere manier is dat dus niet het goede.

  • whoami
  • Registratie: December 2000
  • Laatst online: 10:17
MessageBox.Show() laat toch een messagebox zien?

https://fgheysels.github.io/


  • PreDaTorY
  • Registratie: November 2000
  • Laatst online: 30-03 12:25
en daarin laat ik die variable zien... beetje luie manier van debuggen :)

kan je misschien een voorbeeld geven in c# hoe ik dan een variable kan aanspreken in het dialog form?

[ Voor 43% gewijzigd door PreDaTorY op 15-05-2003 15:22 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 10:17
Ik bedoel, wat doet die MsgBox functie daar. Das geen VB.NET toch, maar VB6?

https://fgheysels.github.io/


  • PreDaTorY
  • Registratie: November 2000
  • Laatst online: 30-03 12:25
euh die msgbox werkt prima als ik gewoon "hoi" in die msgbox wil hebben

  • whoami
  • Registratie: December 2000
  • Laatst online: 10:17
Ok.
Het probleem zal hem er dus gewoon inzitten dat hoofdform null (nothing) is.

En ik blijf er nog steeds bij, wat doet die hoofdform variabele daar?

code:
1
MsgBox ( frmHoofdForm(Me.Owner).blaat )


Doe dat eens.

Waarbij frmHoofdForm dus de class-name (type) is van je hoofdform, en blaat een public variabele / property is van die hoofdform.

https://fgheysels.github.io/


  • PreDaTorY
  • Registratie: November 2000
  • Laatst online: 30-03 12:25
hmmz het loopt een beetje door mekaar heen.

Ik heb 2 classes:

- Form1 (das me programma)
- Databaseform(dat is het form waar ik de variable nodig heb)

dan word het dus:
code:
1
2
3
dim frmform1 as form1

msgbox(frmform1(me.owner).name)


Foutmelding: form1 cannot be indexed because it has no default property

  • whoami
  • Registratie: December 2000
  • Laatst online: 10:17
Leg nu eens uit wat je precies wilt.

Je wilt vanuit Form1 een DatabaseForm openen ?

Zoja:

Zet ergens in je code in Form1 (achter een buttonclick event bv) volgende code
Ik ga de code wel in C# zetten hier
code:
1
2
3
Databasefrom frmMyDbForm = new Databaseform( this );

frmMyDbForm.Show();


Wat wil je nu in die databaseform doen? Aan data kunnen die in je Form1 staat?
code:
1
2
3
4
5
string someString;

someString = ((form1)this.owner).SomeDataOnForm1;

MessageBox.Show(someString);

https://fgheysels.github.io/


  • PreDaTorY
  • Registratie: November 2000
  • Laatst online: 30-03 12:25
een nieuw dialoog maken zoals je daar boven doet heb ik al voor mekaar, dat heb ik in de voorbeelden hierboven al laten zien. Enige probleem is wat jij daar onder laat zien. Ik kan dat stukje code dus niet zo maken dat het in VB gaat werken.

En het grootste probleem is dus een object aanmaak dat "een" form1 is... maar nu moet ik het programma nog duidelijk maken dat ik naar het actieve form1 verwijs. alleen hoe ik die verwijzing maak weet ik dus niet.

  • whoami
  • Registratie: December 2000
  • Laatst online: 10:17
PreDaTorY schreef op 15 mei 2003 @ 16:59:

En het grootste probleem is dus een object aanmaak dat "een" form1 is... maar nu moet ik het programma nog duidelijk maken dat ik naar het actieve form1 verwijs. alleen hoe ik die verwijzing maak weet ik dus niet.
Je moet helemaal geen object aanmaken. Dat object heb je al, die form is nl al actief. Je kan er aan via de owner property, maar die moet je dan wel nog casten naar het type 'Form1'.

https://fgheysels.github.io/


  • PreDaTorY
  • Registratie: November 2000
  • Laatst online: 30-03 12:25
maar als ik het goed begrijp maak je in VB een verwijzing/pointer met:
dim frmform1 as form1

en een nieuw object form1 maak je dan toch met:
dim frmform1 as form1 = new form1() of,
dim frmform1 as new form1()

vandaar dat ik een object wil maken met de verwijzing naar form1 (dus geen nieuw object maken want 1 hoofdform lijkt me wel genoeg :))

in form1 heb ik nu een nieuw databaseform aangemaakt en het form als owner gezet
nu probeer ik het volgende in het databaseform:
code:
1
2
3
4
Dim frmform As Form1 = CType(Me.Owner, Form1)

   msgbox(frmform.name)
   MsgBox(frmform._connstate())


ik kan nu de naam van form1 wel uitlezen maar bij de 2e msgbox loopt het programma vast en krijg ik de volgende foutmelding:

Object reference not set to an instance of an object.

ik snap dr ondertussen nog minder van dan ik daarvoor deed... volgensmij zou het nu gewoon moeten werken... maarja ik zal wel gek zijn 8)7

[edit] typfout

  • whoami
  • Registratie: December 2000
  • Laatst online: 10:17
Moet het niet zijn:
code:
1
MsgBox (frmform._connstate())

ipv
code:
1
MsgBox (frmform1._connstate())

https://fgheysels.github.io/


  • PreDaTorY
  • Registratie: November 2000
  • Laatst online: 30-03 12:25
ik heb het dus nogsteeds niet werken, ik wil dus gewoon de variable van form1 kunnen gebruiken in databaseform. Maar ik ga nog wel even verder op onderzoek uit

  • whoami
  • Registratie: December 2000
  • Laatst online: 10:17
Deze code doet het bij mij anders perfect:

C#

Code in het mainform om het dialoogvenster te openen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
private void button1_Click(object sender, System.EventArgs e)
{                       

  frmDialog         myDialogForm;
        
  theValue  = textBox1.Text;
            
  myDialogForm      = new frmDialog ();         
  myDialogForm.Owner    = this;
            
  myDialogForm.Show();
}


Waarbij 'theValue' een public member is van frmMain.

Code in het dialoogvenster om de waarde op te halen:
code:
1
2
3
4
private void frmDialog_Load(object sender, System.EventArgs e)
{
  this.textBox1.Text = ((frmMain)this.Owner).theValue;
}

[ Voor 5% gewijzigd door whoami op 16-05-2003 10:34 ]

https://fgheysels.github.io/


  • PreDaTorY
  • Registratie: November 2000
  • Laatst online: 30-03 12:25
dat eerste stukje gaat prima. alleen om dat de waarde te laten zien. ik krijg de foutmelding foutmelding "frmmain is a type and cannot be used as an expression"

Daarom probeer ik dus steeds een object van frmMain in frmDialog te maken.

  • whoami
  • Registratie: December 2000
  • Laatst online: 10:17
PreDaTorY schreef op 16 May 2003 @ 11:04:
dat eerste stukje gaat prima. alleen om dat de waarde te laten zien. ik krijg de foutmelding foutmelding "frmmain is a type and cannot be used as an expression"

Daarom probeer ik dus steeds een object van frmMain in frmDialog te maken.
Tja, kijk eens hoe je moet casten in VB.NET.

https://fgheysels.github.io/


  • PreDaTorY
  • Registratie: November 2000
  • Laatst online: 30-03 12:25
met ctype(object, type)

maar waar moet je em dan in die regel typecasten?

  • whoami
  • Registratie: December 2000
  • Laatst online: 10:17
Dit is casten in C#:
code:
1
(frMain)this.owner;


Je zult die regel dus moeten aanpassen.
code:
1
dim theMain as frmMain = CType(this.owner, frmMain)

ofzo.

https://fgheysels.github.io/


  • PreDaTorY
  • Registratie: November 2000
  • Laatst online: 30-03 12:25
ik heb het werkend _/-\o_ ... eigenlijk had ik die link dus steeds goed gedaan, het enige probleem was dat de waardes die ik door wil geven nog niks waren...

zoiets als dit:
code:
1
2
3
dim Button1 as button

thisvalue = button.name


dus new vergeten :)
Pagina: 1