HDSoftware Skrevet 12. oktober 2006 Del Skrevet 12. oktober 2006 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
HDSoftware Skrevet 12. oktober 2006 Forfatter Del Skrevet 12. oktober 2006 Tenkte jeg skulle gi eksempel. Vedlagt er en ZIP fil som inneholder et komplett prosjekt (lite da ;-) som demonstrerer hva jeg prøver på. Dette kompillerer fint, men kommer i en exeption under kjøring. Referanser.zip Lenke til kommentar
GeirGrusom Skrevet 12. oktober 2006 Del Skrevet 12. oktober 2006 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
HDSoftware Skrevet 12. oktober 2006 Forfatter Del Skrevet 12. oktober 2006 Ok. Ser den, men ingen av disse vil løse problemet jeg ga ved et eksepel i vedlegget (tror jeg da ;-) Ole Lenke til kommentar
HDSoftware Skrevet 12. oktober 2006 Forfatter Del Skrevet 12. oktober 2006 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
aadnk Skrevet 12. oktober 2006 Del Skrevet 12. oktober 2006 (endret) 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 12. oktober 2006 av aadnk Lenke til kommentar
HDSoftware Skrevet 13. oktober 2006 Forfatter Del Skrevet 13. oktober 2006 Glimrende. Da slipper jeg tenke på det ;-) Ole Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå