Toon posts:

[VB.net] Array dupliceren

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

Verwijderd

Topicstarter
Beste dev tweakers,

ergens in een private sub heb ik een array staan welke ik wil gebruiken in een andere sub. De grootte van die array hangt af van het aantal resultaten dat ik uit een dataset haal (indirect het aantal rijen uit een database tabel), het aantal dimensies is 2.

Nu lijkt het mij het gemakkelijkste om die array gewoon te dupliceren in een array die ik in een module als public declareer, maar hoe dupliceer ik die array als ik de grootte niet weet? Want die zal ik in mijn module op zijn minst moeten aangeven, gewoon een variable as string maken en dan myarray = mynieuwevariable werkt natuurlijk niet.

Zo maak ik mijn array momenteel aan
code:
1
Dim wizProjectdelenArrayEntries(tblCalculatieProjectdelenpDataset.Tables(0).Rows.Count - 1, 1) As String


Nu heb ik al dit geprobeerd
In mijn module:
code:
1
2
Public wizProjectdelenArrayEntries As Integer
Public wizProjectdelenArray(wizProjectdelenArrayEntries, 1) As String

En dan alleen dit in de sub:
code:
1
wizProjectdelenArrayEntries = tblCalculatieProjectdelenpDataset.Tables(0).Rows.Count - 1


Maarja daarvan kon ik ook wel ruiken dat dat niet ging werken :) en nu heb ik dus geen idee hoe ik die hele array inclusief inhoud van de ene sub naar de andere krijg aangezien ik geen public arrays mag declareren in een private sub?

  • YellowCube
  • Registratie: December 2001
  • Laatst online: 29-04 18:11

YellowCube

Wait...what?

ik ben zlef redelijk beginnend, maar waarom geef je de array niet gewoon door van de eerste naar de 2e sub

Sub waarin je de array aanmaakt
code:
1
2
3
4
Sub1
Dim Array as Variant
Vul de array
Call Sub2(array)


Sub 2
code:
1
2
Sub2 (array as Variant) 
doe hier iets met de array

[ Voor 6% gewijzigd door YellowCube op 07-10-2005 13:23 ]

My doctor says that I have a malformed public-duty gland and a natural deficiency in moral fibre and that I am therefore excused from saving the world


Verwijderd

Topicstarter
De sub waar ik die array in wil hebben is een on_click event, maar naar mijn weten kun je arrays toch niet zo doorgeven?

Je bedoeld zoiets?
code:
1
ByVal array As Object


Ik kan toch niet meteen een andere sub callen, de sub waar het over gaat mag dus pas geactiveerd worden als er op een knop geklikt wordt?

[ Voor 46% gewijzigd door Verwijderd op 07-10-2005 13:28 ]


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Je kan toch gewoon de lengte van een Array opvragen door zijn Length property. En je kan array's ook gewoon doorgeven hoor. Ik weet niet veel van vb.net af en ik vindt je voorbeeldjes ook niet echt duidelijk.
Maar in .NET is een array gewoon een object en dus kun je die gewoon doorgeven.
C#:
1
2
3
4
string[] myArray = new string[ 41 ];
int length = myArray.Length;

string[] andereArray = myArray;

Ik weet wel zeker dat dit ook gewoon in vb.net kan

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 22:35

TeeDee

CQB 241

Waarom gebruik je geen Arraylist oid?

Vervolgens kan je zoiets doen:


tis vrijdag. Niet goed gelezen...

[ Voor 68% gewijzigd door TeeDee op 07-10-2005 13:33 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 27-04 18:17

gorgi_19

Kruimeltjes zijn weer op :9

Je hebt toch een clone method?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Standeman
  • Registratie: November 2000
  • Laatst online: 07:06

Standeman

Prutser 1e klasse

rwb schreef op vrijdag 07 oktober 2005 @ 13:30:
Je kan toch gewoon de lengte van een Array opvragen door zijn Length property. En je kan array's ook gewoon doorgeven hoor. Ik weet niet veel van vb.net af en ik vindt je voorbeeldjes ook niet echt duidelijk.
Maar in .NET is een array gewoon een object en dus kun je die gewoon doorgeven.
C#:
1
2
3
4
string[] myArray = new string[ 41 ];
int length = myArray.Length;

string[] andereArray = myArray;

Ik weet wel zeker dat dit ook gewoon in vb.net kan
Zo kopieer je je array niet, aangezien wanneer je wat verandert in andereArray het in myArray ook wijzigt (aangezien ze beide dezelfde referenties naar het geheugen bevatten. Het in principe dezelfde array).

Wat je wel kan doen is de data met een for-loopje van het ene naar het andere array kopieren

The ships hung in the sky in much the same way that bricks don’t.


Verwijderd

Topicstarter
rwb schreef op vrijdag 07 oktober 2005 @ 13:30:
Je kan toch gewoon de lengte van een Array opvragen door zijn Length property. En je kan array's ook gewoon doorgeven hoor. Ik weet niet veel van vb.net af en ik vindt je voorbeeldjes ook niet echt duidelijk.
Maar in .NET is een array gewoon een object en dus kun je die gewoon doorgeven.
C#:
1
2
3
4
string[] myArray = new string[ 41 ];
int length = myArray.Length;

string[] andereArray = myArray;
Ik weet wel zeker dat dit ook gewoon in vb.net kan
Ik kan een array met 2 dimensies niet omzetten in een string (zo maak je arrays aan in vb). Als ik die variable declare met Public myArray as string in een module en dan in die sub MyArray = AndereArray werkt dat dus niet, tenzij ik in mijn module kan aangeven hoeveel dimensies myArray heeft.

Ik kan alleen aangeven hoeveel dimensies MyArray heeft als ik ook weet hoeveel entries drin komen, toch?
Standeman schreef op vrijdag 07 oktober 2005 @ 13:37:
[...]


Zo kopieer je je array niet, aangezien wanneer je wat verandert in andereArray het in myArray ook wijzigt (aangezien ze beide dezelfde referenties naar het geheugen bevatten. Het in principe dezelfde array).

Wat je wel kan doen is de data met een for-loopje van het ene naar het andere array kopieren
Probleem is dat ik die array moet declareren als public in een module, daar moet ik dus ook aangeven hoeveel entries er in mijn array komen, maar dat is geen vast aantal! Als ik dat wist zou ik idd met een for loopje kunnen kopieeren ja klopt. Ik moet een van de 2 dingen kunnen bereiken:
- vanuit mijn sub doorgeven aan de module hoeveel entries er in die array zitten
- een array maken waarvan ik alleen het aantal dimenies opgeef en niet het aantal entries

[ Voor 43% gewijzigd door Verwijderd op 07-10-2005 13:46 ]


  • YellowCube
  • Registratie: December 2001
  • Laatst online: 29-04 18:11

YellowCube

Wait...what?

Verwijderd schreef op vrijdag 07 oktober 2005 @ 13:25:
De sub waar ik die array in wil hebben is een on_click event, maar naar mijn weten kun je arrays toch niet zo doorgeven?

Je bedoeld zoiets?
code:
1
ByVal array As Object


Ik kan toch niet meteen een andere sub callen, de sub waar het over gaat mag dus pas geactiveerd worden als er op een knop geklikt wordt?
je hebt die array dus nodig op het moment dat je die knop aanklikt.
Waarom maak je dan niet een aparte sub aan die enkel en alleen die array genereert en die je vanuit andere subs aanroept.
code:
1
2
3
Sub_Maak_Array () as Variant
Dim Array as Variant
maak de array


Vanuit de andere subs roep je 'm dan zo aan
code:
1
2
3
Sub_Andere_Sub ()
Dim array_andere_sub as Variant
array_andere_sub = Sub_Maak_Array


Zoiets.
Nadeel lijkt me dan alleen dat je meerder malen die array aanmaakt.

My doctor says that I have a malformed public-duty gland and a natural deficiency in moral fibre and that I am therefore excused from saving the world


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Standeman schreef op vrijdag 07 oktober 2005 @ 13:37:
[...]
Zo kopieer je je array niet, aangezien wanneer je wat verandert in andereArray het in myArray ook wijzigt (aangezien ze beide dezelfde referenties naar het geheugen bevatten. Het in principe dezelfde array).
Nee dat is natuurlijk zo. Je kopieert alleen de refference ernaar. Maar ik zie ook nergens dat hij wil dat als hij de een wijzigt dat de andere niet meewijzigt.
Verwijderd schreef op vrijdag 07 oktober 2005 @ 13:41:
[...]
Ik kan een array met 2 dimensies niet omzetten in een string (zo maak je arrays aan in vb).
Je moet een array ook niet omzetten naar een string. Een array is een array en geen string.
Verwijderd schreef op vrijdag 07 oktober 2005 @ 13:41:
[...]
Ik kan alleen aangeven hoeveel dimensies MyArray heeft als ik ook weet hoeveel entries drin komen, toch?
Heb je het nou over dimensies of over aantal elementen? Ik zie namenlijk nergen dat je een variabel aantal dimensies hebt.

En hoeveel elementer er in een array zitten kan je dus gewoon opvragen en dat veranderd niks aan het type.
YellowCube schreef op vrijdag 07 oktober 2005 @ 13:46:
[...]
code:
1
2
3
Sub_Maak_Array () as Variant
Dim Array as Variant
maak de array
Hoezo heb je als returnvalue een Variant? je moet het toch gewoon het type gevan dat het is dus als het een array van strings is moet je return value string[] zijn. Ik weet niet hoe je een Array type schrijft in vb.net maar ik dacht dat het met gewone haakjes was dus dan

Visual Basic .NET:
1
2
3
sub GetMyArray() as string()
    'return je array
end sub

[ Voor 19% gewijzigd door Woy op 07-10-2005 13:52 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Topicstarter
rwb schreef op vrijdag 07 oktober 2005 @ 13:47:
Nee dat is natuurlijk zo. Je kopieert alleen de refference ernaar. Maar ik zie ook nergens dat hij wil dat als hij de een wijzigt dat de andere niet meewijzigt.
Maakt idd in princiepe niet veel uit
Je moet een array ook niet omzetten naar een string. Een array is een array en geen string.
Zo maak ik arrays aan: Dim myArray( 2, 2) as String

Is dat dan een foute manier?
Heb je het nou over dimensies of over aantal elementen? Ik zie namenlijk nergen dat je een variabel aantal dimensies hebt.
Nee het aantal dimensies is 2, maar het aantal elementen is onbekend.
En hoeveel elementer er in een array zitten kan je dus gewoon opvragen en dat veranderd niks aan het type.
Klopt maar als ik dat doe in die sub, en dat in een variable zet die ik in een module gedeclared hebt zou ik in de module zoiets moeten doen:
code:
1
MyArray (VarGeteldHoeveelElement, 1) as string
Waar VarGeteldHoeveelElement een integer is met het aantal elementen dat ik reeds geteld heb in die sub waar mijn oorspronkelijke array staat. Dit kan wel in een sub (MyArray (VarGeteldHoeveelElement, 1) as string) maar niet in een module..?

  • YellowCube
  • Registratie: December 2001
  • Laatst online: 29-04 18:11

YellowCube

Wait...what?

rwb schreef op vrijdag 07 oktober 2005 @ 13:47:
[...]

Nee dat is natuurlijk zo. Je kopieert alleen de refference ernaar. Maar ik zie ook nergens dat hij wil dat als hij de een wijzigt dat de andere niet meewijzigt.
[...]

Je moet een array ook niet omzetten naar een string. Een array is een array en geen string.


[...]

Heb je het nou over dimensies of over aantal elementen? Ik zie namenlijk nergen dat je een variabel aantal dimensies hebt.

En hoeveel elementer er in een array zitten kan je dus gewoon opvragen en dat veranderd niks aan het type.


[...]

Hoezo heb je als returnvalue een Variant? je moet het toch gewoon het type gevan dat het is dus als het een array van strings is moet je return value string[] zijn. Ik weet niet hoe je een Array type schrijft in vb.net maar ik dacht dat het met gewone haakjes was dus dan

Visual Basic .NET:
1
2
3
sub GetMyArray() as string()
    'return je array
end sub
?
je zegt net dat je een array niet naar een string om kunt zetten en je wilt 'm terug geven als string?
Dat werkt bij mij in ieder geval niet. Ik declareer een array meestal als Variant en dat werkt prima

My doctor says that I have a malformed public-duty gland and a natural deficiency in moral fibre and that I am therefore excused from saving the world


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Ik weet dus niet veel van VB.NET en ik probeer het alleen een beetje te interpreteren zoals het in C# werkt aangezien dat er ( op de syntax na ) veel op lijkt.
C#:
1
2
3
4
int aantal = 10;
int[,] test = new int[ aantal, aantal ];
int aantal2 = test.GetLength( 0 );
int aantal3 = test.GetLength( 1 );

Hier maak ik op de 2e regel dus ook een array aan met 2 dimensies met variabele lengte ( ok is hier altijd 10 ;) ) en met de GetLength methode kan je gewoon per dimensie de lengtes opvragen.

Dus ik zie niet in hoe het aantal elementen onbekend kan zijn?

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
YellowCube schreef op vrijdag 07 oktober 2005 @ 13:55:
[...]
?
je zegt net dat je een array niet naar een string om kunt zetten en je wilt 'm terug geven als string?
Dat werkt bij mij in ieder geval niet. Ik declareer een array meestal als Variant en dat werkt prima
Ik wil hem niet terug geven als string. Ik wil hem terug geven als Array van strings. In C# kan je het zo zien
C#:
1
2
3
4
5
//Deze geeft een string terug
public string GetString(){ return ""; }

//Deze geeft een array van strings terug en het return type is dan ook string[]
public string[] GetStringArray(){ return new string[ 10 ]; }

Waarom zou je Variant willen gebruiken als je ook gewoon het type wat je terug geeft weet?

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Topicstarter
rwb schreef op vrijdag 07 oktober 2005 @ 14:00:
Ik weet dus niet veel van VB.NET en ik probeer het alleen een beetje te interpreteren zoals het in C# werkt aangezien dat er ( op de syntax na ) veel op lijkt.
C#:
1
2
3
4
int aantal = 10;
int[,] test = new int[ aantal, aantal ];
int aantal2 = test.GetLength( 0 );
int aantal3 = test.GetLength( 1 );

Hier maak ik op de 2e regel dus ook een array aan met 2 dimensies met variabele lengte ( ok is hier altijd 10 ;) ) en met de GetLength methode kan je gewoon per dimensie de lengtes opvragen.

Dus ik zie niet in hoe het aantal elementen onbekend kan zijn?
Het IS bekend in se SUB, maar die gekloonde array wil ik in mijn module hebben. Wat jij voorsteld heb ik dus geprobeerd door in de sub het aantal element te tellen en door te geven aan de module. Maar in een MODULE (in een sub wel) mag je dit niet doen:
Visual Basic:
1
2
Public wizProjectdelenArrayAantalElemten As Integer
Public wizProjectdelenArray(wizProjectdelenArrayAantalElementen, 1) As String
Sorry dat ik zo onduidelijk ben, ben helemaal nieuw in de taal en ken zoals jullie zien nog niet zo goed de weg, moet nog een intregratie cursus volgen om boetes te vermijden :P

[ Voor 10% gewijzigd door Verwijderd op 07-10-2005 14:10 ]


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op vrijdag 07 oktober 2005 @ 14:07:
[...]
Maar in een MODULE (in een sub wel) mag je dit niet doen:
Visual Basic:
1
2
Public wizProjectdelenArrayAantalElemten As Integer
Public wizProjectdelenArray(wizProjectdelenArrayAantalElementen, 1) As String
kan je dan niet iets dergelijks doen ( Nogmaars ik weet niet veel van VB.NET dus mischien iemand die er meer vanaf weet die zich hier over uit kan laten )
Visual Basic .NET:
1
Public wizProjectdelenArray(,) As String

Je geeft hier dan aan dat je een variabele wizProjectdelenArray hebt die een 2 dimensionale array van strings kan bevatten.
Je kunt dan bijvoorbeeld in je sub doen
Visual Basic .NET:
1
wizProjectdelenArray = myArrayInMySub;


In je andere stukje code waar je je code wilt gebruiken kun je dan gewoon
Visual Basic .NET:
1
2
wizProjectdelenArray.GetLength( 0 )
wizProjectdelenArray.GetLength( 1 )

doen.
( weet dus niet zeker of dit goed is qua syntax allemaal )

[ Voor 17% gewijzigd door Woy op 07-10-2005 14:24 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Topicstarter
Als ik in mijn module een variable van het type variant aanmaak, en in mijn sub mijn array in die variant zet krijg ik deze foutmelding zodra die form in mijn programma geladen wordt en ook alsk m zo declareer in mn module "Public wizProjectdelen(,) As String"

An unhandled exception of type 'System.OutOfMemoryException' occurred in system.windows.forms.dll

Additional information: Error creating window handle.

Duse:
Visual Basic:
1
2
3
4
5
6
' In module.vb
Public wizProjectdelen(,) As String

' In form.vb in een sub
 Dim wizProjectdelenArray(tblCalculatieProjectdelenpDataset.Tables(0).Rows.Count - 1, 1) As String
wizProjectdelenArray = wizProjectdelen

[ Voor 39% gewijzigd door Verwijderd op 07-10-2005 14:48 ]


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Dan doe je denk toch wat anders fout. Ik heb even snel met google gekeken wat de syntax van vb.net is en volgens mij kan je gewoon zo doen hoor
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
Class ArrayClass
  Private classArray(,) As string

  Public Sub MakeArray( number as Integer )
    dim subArray( number, number ) as string
    classArray = subArray
  End Sub

End Class


Als je nou de sub MakeArray aanroept dan word classArray gevuld met een array met lengte number, number. Met de function GetLegth kun je dan de lengte van beide dimensies opvragen.

[edit]
Het probleem is dus gewoon dat je geen refference naar het object hebt waar je array in staat.

[ Voor 30% gewijzigd door Woy op 07-10-2005 14:51 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 23:38
Lijkt me dat je design kapot is. Als je hetzelfde array in meerdere functies nodig hebt zou het op zijn minst een parameter moeten zijn.
Als een van die functies een event is, moet het een obect zijn waar die event functie bij kan op een of andere manier. ( Al was het als een static veld van een class )

Arrays kopieren zal normaal gesproken niet gewenst zijn, en niet nodig ook.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Topicstarter
farlane schreef op vrijdag 07 oktober 2005 @ 14:49:
Lijkt me dat je design kapot is. Als je hetzelfde array in meerdere functies nodig hebt zou het op zijn minst een parameter moeten zijn.
Als een van die functies een event is, moet het een obect zijn waar die event functie bij kan op een of andere manier. ( Al was het als een static veld van een class )

Arrays kopieren zal normaal gesproken niet gewenst zijn, en niet nodig ook.
Ik moet die array tussen subs verplaatsen omdat ik een wizard aan het maken ben waarvan de data van de ene pagina door gaat naar de andere. En er is niets kapot aan mn design, als ik de regel waar ik array naar array kopieer quote is er niets aan de hand.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op vrijdag 07 oktober 2005 @ 14:51:
[...]


Ik moet die array tussen subs verplaatsen omdat ik een wizard aan het maken ben waarvan de data van de ene pagina door gaat naar de andere. En er is niets kapot aan mn design, als ik de regel waar ik array naar array kopieer quote is er niets aan de hand.
Blijkbaar is er dus wel wat verkeerds met je design. Als je gegevens door moet geven dan moet je het ook zo designen dat het doorgegeven wordt.

Als je bijvoorbeeld in je ene form data hebt en die wil je bij het openen van het volgende form door wilt geven zul je dat via een property of een constructor moeten doen bijvoorbeeld.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

Topicstarter
rwb schreef op vrijdag 07 oktober 2005 @ 14:53:
[...]

Blijkbaar is er dus wel wat verkeerds met je design. Als je gegevens door moet geven dan moet je het ook zo designen dat het doorgegeven wordt.

Als je bijvoorbeeld in je ene form data hebt en die wil je bij het openen van het volgende form door wilt geven zul je dat via een property of een constructor moeten doen bijvoorbeeld.
Hmm, het boek dat bij de learning edition zit is kwa opzetten van een programma heel beperkt, ik kan nu redelijk uit de voeten in visual basic en leuke programmatjes schrijven maar dat soort dingen staan er niet in beschreven helaas. Maar daar zal ik me dan even in moeten verdiepen dan.

Object georienteerd programeren is voorlopig ff niet weggelegd voor mij.

[ Voor 5% gewijzigd door Verwijderd op 07-10-2005 15:02 ]

Pagina: 1