Gå til innhold

Anbefalte innlegg

Heisan

Jeg pleier ha referanser til forskjellige objekter på alle nivåer. På den måten kan alle objekter "snakke" med hverandre, selv på tvers av tråder etc. I Clarion kan jeg definere en referanse slik

MyReference   &ClassTypeDef

 

Det betyr at MyReference ikke er et objekt, men bare en tom referanse. Den peker altså på NULL

 

Dermed kan jeg i kode gjøre slik:

MyReference &= new(ClassTypeDef)

Først da er det et objekt. Videre kan jeg gjøre slik:

MySecondReference    &ClassTypeDef
.
.
MySecondReference &= MyReference

Dermed peker begge referansene på det samme objektet. Dette åpner for en del morsomheter, da jeg i en klasse kan ha en referanse til en hvilken som helst klasse, slik: NB! Skrevet på Clarionsk

MyClass        CLASS()
SomeOtherObject      &SomeOtherClass
       END!CLASS

Jeg kan dermed bruke denne slik i en annen klasse:

MyClass.SomeOtherObject &= ThisWindowObject

 

Det som gjør dette spennende er jo at jeg fra MyClass kan henvise direkte tilbake til objektet over, direkte.

 

Håper noen forstod hva jeg tenkte på her. Det er IKKE snakk om arving av klasser, men kunn referanser.

 

Håper noen kan hjelpe.

 

Grunnen til at jeg vil ha til dette er fordi jeg fra en klasse, trenger å kalle en funksjon i vinduet som har instansert klassen. Det aktuelle vinduet blir opprettet fra en hovedmeny og eksisterer derfor i flere instanser. Hvert av vinduene lager en ny instas av klassen jeg har laget, og jeg trenger derfor en måte å fortelle klassen hvilket vindu som har laget den. Noe av det samme skjer jo med MDI vinduer. Der setter man jo referansen slik:

NewWindow.MdiParent = Me

 

 

Ole

Lenke til kommentar
Videoannonse
Annonse

Alle klasser i Visual Basic er alltid referanser, en null referanse het Nothing i Visual Basic.

Strukturer og verdier blir som regel kopiert ved å referere til dem; dvs.

 

Litt generell kode:

 

X As Integer = 30

Y As Integer = X

 

&X != &Y

 

X As Class = New Class()

Y As Class = X

&X == &Y

 

Public Sub ReferanseTest2()

Ref As Integer = 30

ReferanseTest(Ref)

End Sub

 

Public Sub ReferanseTest(ByRef referanseverdi As Integer)

&referanseverdi == ReferanseTest2.Ref

End Sub

Public Sub IkkeReferanseTest(ByVal referanseverdi As Integer)

&referanseverdi != ReferanseTest2.Ref

End Sub

 

Så du kan gi ting som referanser, men alle klasser er alltid det, som er like greit.

 

I C# kan du bruke pekere og referanser på samme måte som i C++, som er noe Clarionish. (ihvertfall referanse operator &)

public unsafe void MyRefTest()
{
 int avalue = 20; 
 int &myref = avalue; // Dette blir en referanse til avalue 
 int *myptr = &avalue; // Dette blir en peker til avalue

 myref = 33; // avalue blir satt til 33
 myptr = 33; // Dette går ikke, siden myptr er en peker, og må bli satt slik:
 *myptr = 44; // Sett verdien som myptr peker til(avalue), lik 44
}

 

Men dette går da ikke i Visual Basic,

ikke det at det egentlig er nødvendig.

Lenke til kommentar
Ok.  Ser den, men ingen av disse vil løse problemet jeg ga ved et eksepel i vedlegget (tror jeg da ;-)

 

Ole

7057456[/snapback]

 

 

HAHAHAHA! Dette løste seg elegant. Jeg missforstod det med OBJECT i datatype. Jeg byttet ut

dim MinRef as new Object

 

med

 

dim MinRef as New Form2

 

Dermed fungerte det som en drøm. Det jeg dermed er liltt skeptisk på er, hvor blir det av disse objektene etter at prosedyren er terminert?

 

jeg mener, Når jeg lager et nytt objekt med NEW Form2 så går jeg ut ifra at dette tar minne. Når jeg da et annet sted i koden setter

 

Objektet.Referanse = Me

 

Så går jeg ut ifra at jeg får noe minnetap som ikke ryddes opp i. Må jeg rydde dette selv med en eller slags DESTROY eller skjønner VB dette selv?

 

Ole

Lenke til kommentar
Så går jeg ut ifra at jeg får noe minnetap som ikke ryddes opp i.  Må jeg rydde dette selv med en eller slags DESTROY eller skjønner VB dette selv?

7057524[/snapback]

VB6 og VB.NET har garbage collector, så dette går helt fint. I COM fungerer dette ved at alle referanser til en klasse registeres (via IUnknown) og legger til et tall i en teller. Når referansen frigjøres (når en prosedyre er ferdig, en form lukkes, et program termineres, avhenging av scope), senkes telleren. Når denne telleren når null, frigjøres all minne. Jeg husker ikke helt hvordan dette fungerer i .NET (mener å ha lest en artikkel om akkurat hva Microsoft forsøkte for å forbedre denne fremgangsmåten til .NET), men sluttresultatet er i det minste at det meste tas hånd om for programmereren.

Endret av aadnk
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...