Avatar billede rpi Nybegynder
05. februar 2002 - 10:21 Der er 20 kommentarer og
1 løsning

Object oprettelse !!!

Hejsa

Jeg har et problem med oprettelse af diverse objecter. Det jeg gerne vil opnå er at jeg ikke skal angive et bestemt objectnavn og klasse. Således at jeg f.eks udfra det der peges på i et listview kan oprette et bestemt object, se kode nedenuden.

------------------------------------------------------
Function OpretJobObject()
    Dim obj As String
    Dim cls As String
        obj = "obj" & lstview1.SelectedItem.SubItems(2)
        cls = "cls" & lstview1.SelectedItem.SubItems(2)
        Set obj = New cls
End Function
--------------------------------------------------------

obj og cls indeholder f.eks "objtest1" og "clstest1", klassen clstest1 findes naturligvis. Dette fungere ikke da obj og cls er Strings, men hvis jeg ændre dem til henholdsvis :

dim obj as object
dim cls as class

fungere det hellere ikke, nogen forslag?
Avatar billede bennytordrup Nybegynder
05. februar 2002 - 10:32 #1
createobject (obj & "." & cls")
Avatar billede jennemaan Nybegynder
05. februar 2002 - 10:34 #2
Sub OpretJobObject(Obj As Object)
Select Case lstview1.SelectedItem.SubItems(2)
Case "objtest1"
  Set obj=New objtest1 
Case "clstest1"
  Set obj=New clstest1
End Select
End Sub

/Jennemaan
Avatar billede rpi Nybegynder
05. februar 2002 - 10:41 #3
Jeg vil gerne undgå en select case, da der løbene vil blive tilføjet nye klasser. Så jeg vil gerne undgå at jeg skal ind og rette i min select case hver gang.

Rpi
Avatar billede bennytordrup Nybegynder
05. februar 2002 - 10:45 #4
Så prøv med min CreateObject. Obj og Cls skal stadig være strenge.

Jeg antager, at du vil have noget lignende dette:

obj = dao
cls = recordset

CreateObject(obj & "." & cls) vil svare til CreateObject("DAO.Recordset")
Avatar billede rpi Nybegynder
05. februar 2002 - 10:51 #5
Jeg får en fejl når jeg bruger createobject (obj & "." & cls"):

obj = "objtest1" , angiver mit object navn.
cls = "clstest1" , angiver den klasse jeg vil oprette instansen af.

Jeg tager ikke obj og cls direkte fra en database, de indlæses først i et listview som jeg herefter aflæser.

/Rpi
Avatar billede bennytordrup Nybegynder
05. februar 2002 - 10:54 #6
CreateObject Function
     

Creates and returns a reference to an ActiveX object.

Syntax

CreateObject(class,[servername])

The CreateObject function syntax has these parts:

Part Description

class Required; Variant (String). The application name and class of the object to create.

servername Optional; Variant (String). The name of the network server where the object will be created. If servername is an empty string (""), the local machine is used.


The class argument uses the syntax appname.objecttype and has these parts:

Part Description
appname Required; Variant (String). The name of the application providing the object.
objecttype Required; Variant (String). The type or class of object to create.
Avatar billede bennytordrup Nybegynder
05. februar 2002 - 10:55 #7
Hvilken fejl får du.

Indholdet af ListView1, er det en liste over filer (dll, ocx), som indeholder de klasser, du vil oprette?

Indholdet af ListView2, er det en liste over de klasser, som filerne i ListView1 indeholder?
Avatar billede rpi Nybegynder
05. februar 2002 - 11:04 #8
VB genkender ikke createobject (obj & "." & cls") (Står med rødt)

Mit listview indholder bare et tilfældig navn (string) som mit object (obj)skal hedde. Mht. cls så angiver listviewet navnet på den klasse som jeg vil oprette mit object udfra.

Der indgår altså ikke nogen filer i mit listview.

/Rpi
Avatar billede bennytordrup Nybegynder
05. februar 2002 - 11:07 #9
Set SomeObj = CreateObject(obj & "." & cls)
Avatar billede jennemaan Nybegynder
05. februar 2002 - 11:12 #10
Sub LavObjekt()
  Set SomeObj=CreateObject(lstview1.SelectedItem.SubItems(2))
End Sub

/Jennemaan
Avatar billede rpi Nybegynder
05. februar 2002 - 11:22 #11
Jeg har prøvet med Set Someobj = CreateObject(cls)
Hvor cls = "clsTest1" altså navnet på min klasse

Men får fejlen Can't create object.

Benny når du skriver Set SomeObj = CreateObject(obj & "." & cls), vil det så ikke give mig en fejl da systax jo er CreateObject(class,[servername])
og der jo så vil stå:

Set SomeObj = CreateObject("objtest1.clstest1") ?

/Rpi
Avatar billede bennytordrup Nybegynder
05. februar 2002 - 11:29 #12
Det vil ikke give en fejl, da servername er optional. Er den udeladt, oprettes på lokalmaskine.

Dette fremgår også af det udsnit af MSDN, jeg gav omkring CreateObject.

Din fejl opstår fordi, du ikke kan nøjes med klassenavnet. Du skal også have modulnavnet med, og modulnavnet er navnet på den fil (dll eller ocx), som indeholder klassen.
Avatar billede rpi Nybegynder
05. februar 2002 - 11:31 #13
Fejlen er præcis :

ActiveX component can't create object

/Rpi
Avatar billede rpi Nybegynder
05. februar 2002 - 11:37 #14
Hvordan finder jeg udaf hvilke fil det er når jeg ikke har lagt min klasse ud i en dll eller ocx, jeg har jo kun mit klasse modul (clstest1.cls)?
Avatar billede bennytordrup Nybegynder
05. februar 2002 - 11:39 #15
Projektnavnet, hvor den klasse er public
Avatar billede bennytordrup Nybegynder
05. februar 2002 - 11:39 #16
I sidste ende det navn, du oversætter til
Avatar billede rpi Nybegynder
05. februar 2002 - 11:54 #17
Jeg tror ikke at jeg er helt med, jeg har et fælles modul hvor jeg opretter en public reference til mit object

Public objtest1 As clstest1

Vil du så have at der f.eks skal stå:
Set Someobj = CreateObject("Fælles.bas" & "." & cls)

Herudover har jeg selvfølgelig mit projekt navn, project1.vbp, er det den du mener:
Set Someobj = CreateObject("project1.vbp" & "." & cls)
?

/Rpi
Avatar billede jennemaan Nybegynder
05. februar 2002 - 11:59 #18
Dit klassemodul vil være early bound - og ikke have sit egen typelibrary information i registry.

For at benytte CreateObject skal clasid'et findes i registry.

Du har 2 muligheder:

1) Flyt dine klassemoduler over i en ActiveX DLL og compile så (dette fremtvinger en registryentry som createobject så kan bruge).

2) Brug Select Case'en som jeg skitserede

/Jennemaan
Avatar billede rpi Nybegynder
05. februar 2002 - 12:18 #19
Jeg vil meget gerne undgå Select Case, da der løbende vil komme nye klasser til, og der så skal rettes her hver gang.

Hvis jeg ligger mine klassemoduler i en DLL, vil jeg jo få ligende problemmer, hver gang der kommer en ny klasse til.

Jeg vender tilbage hvis der ikke kommer andre forslag.

Jeg mener at det kan lade sig gøre i Java!

/Rpi
Avatar billede bennytordrup Nybegynder
05. februar 2002 - 12:31 #20
Hvis det hele ligger i samme projekt, hvad er så problemet? Du skal alligevel rette i projektet for at tilføje en ny klasse. Så er det heller ikke det store ekstraarbejde at tilføje den i en Select Case.
Avatar billede jennemaan Nybegynder
05. februar 2002 - 12:35 #21
Hvis du lægger dine klasser i en ActiveX.DLL kan du runtime læse typelibrariet fra filen.

Prøv følgende:

Lav din dll og compile den som ActiveX.dll

Lav et nyt vbprojekt hvor du under references refererer til "Typelib Information"

Nu kan du gøre følgende:
Dim obj As Object
Dim X As TypeLibInfo
Dim Y As CoClasses
Dim i As Integer
Set X = TypeLibInfoFromFile("c:\dindll.dll")
Set Y = X.CoClasses

For i = 1 To Y.Count
  Set obj=CreateObject(Y(i).Parent & "." & Y(i).Name) 'Lav en instans af objektet
Next i


/Jennemaan
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester