By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
446,231 Members | 1,326 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 446,231 IT Pros & Developers. It's quick & easy.

Create new "me"

P: n/a
Hi,

Instead of doing this....
Public Class Form1
Public Shared Sub CreateAndShow()
Dim f As New Form1
f.Show()
End Sub
End Class

I would like to make it generic by doing something like...

Public Class Form1
Public Shared Sub CreateAndShow()
Dim f As New Me
f.Show()
End Sub
End Class

.... but "Me" is not accepted, neither is "Dim f As New TypeOf(Me)".

I would like to put the CreateAndShow in a base form and then inherit from
it and still be able to use the CreateAndShow method.

Any suggestions? TANKS!!! :o)

M O J O
Sep 29 '06 #1
Share this Question
Share on Google+
24 Replies


P: n/a
That's a good idea, so I tried solving it as an exercise. The good
news is that it works.

The bad news is that I've been learning .NET for about a week, so I'm
rather embarassed to show you how I did it. But here goes:

Dim s1 As String = Me.ToString
' s1 is in the format "WindowsApplication1.Form1, Text: Form1"
' Now remove the part that isn't the class name.
Dim i1 As Integer = InStr(s1, ",")
If i1 0 Then s1 = Mid(s1, 1, i1 - 1)
' Note: Can't use Left(s1, i1-1) above - for some reason VB thinks
I'm trying to
' access Me.Left instead! <grrr>
Dim objNewForm As Object =
Activator.CreateInstance(Type.GetType(s1))
Dim frm As Form = DirectCast(objNewForm, Form)
frm.Show()

Sep 29 '06 #2

P: n/a
Ok, I worked on it some more, and this version is far less embarrasing!
Enjoy:

DirectCast(Activator.CreateInstance(Type.GetType(M e.GetType.ToString)),
Form).Show()

Sep 29 '06 #3

P: n/a
te******@hotmail.com wrote:
If i1 0 Then s1 = Mid(s1, 1, i1 - 1)
' Note: Can't use Left(s1, i1-1) above - for some reason VB thinks
I'm trying to
' access Me.Left instead! <grrr>
You can use the line:

Imports VB = Microsoft.VisualBasic

before your code so that you can use VB.Left(s1, i1-1). That tells it that
you want to use VB as an abbreviation for Microsoft.VisualBasic.

Also, if you use Option Strict On, it will tell you when things don't match
up the way they should.

HTH

Andrew
Sep 29 '06 #4

P: n/a
Hi teslar91,

Thanks for helping me out here.

My problem is, that I can't use "Me", so your solution...

Public Shared Sub CreateAndShow()
Dim s1 As String = Me.ToString
' s1 is in the format "WindowsApplication1.Form1, Text: Form1"
' Now remove the part that isn't the class name.
Dim i1 As Integer = InStr(s1, ",")
If i1 0 Then s1 = Mid(s1, 1, i1 - 1)
' Note: Can't use Left(s1, i1-1) above - for some reason VB thinks'm
trying to
' access Me.Left instead! <grrr>
Dim objNewForm As Object = Activator.CreateInstance(Type.GetType(s1))
Dim frm As Form = DirectCast(objNewForm, Form)
frm.Show()
End Sub
.... gives me this error:

'Me' is valid only within an instance method.

I need to call the sub inside a shared sub, so I don't have an instance yet.

Any other suggestions? :o(

M O J O

"te******@hotmail.com" wrote:
Ok, I worked on it some more, and this version is far less embarrasing!
Enjoy:

DirectCast(Activator.CreateInstance(Type.GetType(M e.GetType.ToString)),
Form).Show()

Sep 29 '06 #5

P: n/a
>
'Me' is valid only within an instance method.

I need to call the sub inside a shared sub, so I don't have an instance
yet.

Any other suggestions? :o(

M O J O
Static (shared) methods don't have a "Me". They are applicable to any
instance, hence cannot work on any specific instance. In this case you have
to pass in a "Me" as a parameter.
Sep 29 '06 #6

P: n/a
Mojo,

It is possible to create objects from classes. But never objects from
objects. (Although object is a class itself as well. To be more precise the
highest class from which every thing derives).

The startup form is a kind of strange thing in VB.Net (but handy) it has
inbuild a Sub main, where in it creates an object from itself. For the same
case you use a Module or Shared Class in which you can create your form
object. Than you can create as much objects from that class as you wish.

I hope this gives an idea.

Cor

"M O J O" <MO**@discussions.microsoft.comschreef in bericht
news:88**********************************@microsof t.com...
Hi,

Instead of doing this....
Public Class Form1
Public Shared Sub CreateAndShow()
Dim f As New Form1
f.Show()
End Sub
End Class

I would like to make it generic by doing something like...

Public Class Form1
Public Shared Sub CreateAndShow()
Dim f As New Me
f.Show()
End Sub
End Class

... but "Me" is not accepted, neither is "Dim f As New TypeOf(Me)".

I would like to put the CreateAndShow in a base form and then inherit from
it and still be able to use the CreateAndShow method.

Any suggestions? TANKS!!! :o)

M O J O

Sep 29 '06 #7

P: n/a
Hello M O J O,

What's the point of this? If the goal is to not have to call .Show when
you create a form (lazy-ass).. then add Me.Show to the base form's ctor.

-Boo
Hi,

Instead of doing this....

Public Class Form1
Public Shared Sub CreateAndShow()
Dim f As New Form1
f.Show()
End Sub
End Class
I would like to make it generic by doing something like...

Public Class Form1
Public Shared Sub CreateAndShow()
Dim f As New Me
f.Show()
End Sub
End Class
... but "Me" is not accepted, neither is "Dim f As New TypeOf(Me)".

I would like to put the CreateAndShow in a base form and then inherit
from it and still be able to use the CreateAndShow method.

Any suggestions? TANKS!!! :o)

M O J O

Sep 29 '06 #8

P: n/a
M O J O wrote:
My problem is, that I can't use "Me", so your solution...
[...]
... gives me this error:

'Me' is valid only within an instance method.

I need to call the sub inside a shared sub, so I don't have an
instance yet.
Try this:

\\\
Dim myTypeName As String
Dim myObject As Object

'Get the name of the type of this class
myTypeName =
Reflection.MethodBase.GetCurrentMethod.DeclaringTy pe.ToString
'Create a new instance of this type
myObject = Activator.CreateInstance(Type.GetType(myTypeName))
///

This can be used in a Shared method. It uses Reflection to get a handle to
the executing method, and from there to the type that contains that method
(i.e., your class). It then uses the Activator object to create a new
instance of an object of that type. Hopefully this will get you closer to
where you want to be?

--

(O)enone
Sep 29 '06 #9

P: n/a
-Boo,
Must you berate everyone?
"GhostInAK" <gh*******@gmail.comwrote in message
news:be**************************@news.microsoft.c om...
Hello M O J O,

What's the point of this? If the goal is to not have to call .Show when
you create a form (lazy-ass).. then add Me.Show to the base form's ctor.
-Boo
>Hi,

Instead of doing this....

Public Class Form1
Public Shared Sub CreateAndShow()
Dim f As New Form1
f.Show()
End Sub
End Class
I would like to make it generic by doing something like...

Public Class Form1
Public Shared Sub CreateAndShow()
Dim f As New Me
f.Show()
End Sub
End Class
... but "Me" is not accepted, neither is "Dim f As New TypeOf(Me)".

I would like to put the CreateAndShow in a base form and then inherit
from it and still be able to use the CreateAndShow method.

Any suggestions? TANKS!!! :o)

M O J O


Sep 29 '06 #10

P: n/a
Hello Steve,

I'll berate whoever I want. Must you be so freakin sensitive? Grow a pair,
ya pansy.

-Boo
-Boo,
Must you berate everyone?
"GhostInAK" <gh*******@gmail.comwrote in message
news:be**************************@news.microsoft.c om...
>Hello M O J O,

What's the point of this? If the goal is to not have to call .Show
when you create a form (lazy-ass).. then add Me.Show to the base
form's ctor. -Boo
>>Hi,

Instead of doing this....

Public Class Form1
Public Shared Sub CreateAndShow()
Dim f As New Form1
f.Show()
End Sub
End Class
I would like to make it generic by doing something like...
Public Class Form1
Public Shared Sub CreateAndShow()
Dim f As New Me
f.Show()
End Sub
End Class
... but "Me" is not accepted, neither is "Dim f As New TypeOf(Me)".
I would like to put the CreateAndShow in a base form and then
inherit from it and still be able to use the CreateAndShow method.

Any suggestions? TANKS!!! :o)

M O J O

Sep 29 '06 #11

P: n/a
mg
Watching Boo's replies to this and another recent post about retaining
changed values of a textbox, I think I see the reason. Boo does not
post to this NG to actually help anyone with VB, he's only here to show
everyone how much he knows. So if someone posts a question where he
can't do that, it shows in the caustic reply.

Boo, if the SNR is too high for you here, ignore it. As this is a
public NG, you are going to get all kinds of clueless nubes posting
stupid questions. Find a better way to deal with it so you can play
nicely.

GhostInAK wrote:
Hello Steve,

I'll berate whoever I want. Must you be so freakin sensitive? Grow a pair,
ya pansy.

-Boo
-Boo,
Must you berate everyone?
"GhostInAK" <gh*******@gmail.comwrote in message
news:be**************************@news.microsoft.c om...
Hello M O J O,

What's the point of this? If the goal is to not have to call .Show
when you create a form (lazy-ass).. then add Me.Show to the base
form's ctor. -Boo
>Any suggestions? TANKS!!! :o)

M O J O
Sep 30 '06 #12

P: n/a
Oenone wrote:
Try this:
[...]

Which, ahem, can of course be optimised to this (apologies for the
wrapping):

\\\
Dim myObject As Object

'Create a new instance of this type
myObject =
Activator.CreateInstance(Reflection.MethodBase.Get CurrentMethod.DeclaringType)
///

--

(O)enone
Sep 30 '06 #13

P: n/a
Oerlone,

And do you think that this is a acceptable performing method for any
problem?

While you just can do

Dim myObject as new Myform (jor whatever other class)

Reflection is the same as setting the horse behind the cart.

Cor

"Oenone" <oe****@nowhere.c
omschreef in bericht news:ka*******************@newsfe4-gui.ntli.net...
Oenone wrote:
>Try this:
[...]

Which, ahem, can of course be optimised to this (apologies for the
wrapping):

\\\
Dim myObject As Object

'Create a new instance of this type
myObject =
Activator.CreateInstance(Reflection.MethodBase.Get CurrentMethod.DeclaringType)
///

--

(O)enone

Sep 30 '06 #14

P: n/a
Cor Ligthert [MVP] wrote:
And do you think that this is a acceptable performing method for any
problem?
I think it's what the OP asked for. Whether he's doing it the best way is up
to him, but he asked a question and I gave him an answer.

I can't see why that would have any noticeable performance penalty, anyway.
If he's doing this to manage the opening of forms, it'll be called .. what,
a couple of dozen times per app run?

--

(O)enone
Sep 30 '06 #15

P: n/a
Oenone,
>
I can't see why that would have any noticeable performance penalty,
anyway. If he's doing this to manage the opening of forms, it'll be called
.. what, a couple of dozen times per app run
You are right, but in my idea is Reflection something that should be used if
there is no other solution. I get more and more the idea that it is a kind
of toy. It is late binding you know.

Cor

Oct 1 '06 #16

P: n/a
Hi Oenone,

Thank you!!!!!!!

It is the only solution I've seen so far and it works. The performance
penalty is not noticeable.

:o)

THANKS!!!!!!!!!!!

M O J O

"Oenone" wrote:
Cor Ligthert [MVP] wrote:
And do you think that this is a acceptable performing method for any
problem?

I think it's what the OP asked for. Whether he's doing it the best way is up
to him, but he asked a question and I gave him an answer.

I can't see why that would have any noticeable performance penalty, anyway.
If he's doing this to manage the opening of forms, it'll be called .. what,
a couple of dozen times per app run?

--

(O)enone
Oct 2 '06 #17

P: n/a
Hi Cor,

I was hoping that since my shared sub was inside a class, vb somehow new
what type of class the shared sub was called from.

I'm building a CRM system for my company. I want to have a base form that
can inherit all my form from. This base form will have many base stuff ....
forexample I will have three diferent ways to create and show a form ...

1) Normal - just create the form and show it.

2) Single instance - if the form is not yet created, create the form an show
it.

3) Single instance by ID - if for example the customer-form with customer
ID=xxx is not showing, create the form and show it, else show it.

Hope you get my pont.

Here's my code so far (beware of wrappings)....
Public Class BaseForm

Private _singleInstanceID As Guid
Private Shared _singleInstances As Dictionary(Of Guid, BaseForm)
Public Shared Sub CreateAndShowNormal(Optional ByVal owner As
IWin32Window = Nothing)
Dim f As Object =
Activator.CreateInstance(Reflection.MethodBase.Get CurrentMethod.DeclaringType)
DirectCast(f, BaseForm).Show(owner)
End Sub
Public Shared Sub CreateAndShowSingleInstace(Optional ByVal owner As
IWin32Window = Nothing)
Call CreateAndShowSingleInstace(Guid.Empty, owner)
End Sub
Public Shared Sub CreateAndShowSingleInstace(ByVal ID As Guid, Optional
ByVal owner As IWin32Window = Nothing)
If _singleInstances Is Nothing Then
_singleInstances = New Dictionary(Of Guid, BaseForm)
End If

Dim f As BaseForm

If Not _singleInstances.ContainsKey(ID) Then
Dim fa As Object =
Activator.CreateInstance(Reflection.MethodBase.Get CurrentMethod.DeclaringType)
f = DirectCast(fa, BaseForm)
f._singleInstanceID = ID
_singleInstances.Add(ID, f)
AddHandler f.FormClosed, AddressOf SingleInstanceClosed
Else
f = _singleInstances(ID)
End If

f.Show()
f.Focus()
End Sub
Private Shared Sub SingleInstanceClosed(ByVal sender As Object, ByVal e
As FormClosedEventArgs)
_singleInstances.Remove(DirectCast(sender,
BaseForm)._singleInstanceID)
End Sub

End Class
If there's a better way to do it, please let me know.

Thanks!

:o)

M O J O

"Cor Ligthert [MVP]" wrote:
Mojo,

It is possible to create objects from classes. But never objects from
objects. (Although object is a class itself as well. To be more precise the
highest class from which every thing derives).

The startup form is a kind of strange thing in VB.Net (but handy) it has
inbuild a Sub main, where in it creates an object from itself. For the same
case you use a Module or Shared Class in which you can create your form
object. Than you can create as much objects from that class as you wish.

I hope this gives an idea.

Cor

"M O J O" <MO**@discussions.microsoft.comschreef in bericht
news:88**********************************@microsof t.com...
Hi,

Instead of doing this....
Public Class Form1
Public Shared Sub CreateAndShow()
Dim f As New Form1
f.Show()
End Sub
End Class

I would like to make it generic by doing something like...

Public Class Form1
Public Shared Sub CreateAndShow()
Dim f As New Me
f.Show()
End Sub
End Class

... but "Me" is not accepted, neither is "Dim f As New TypeOf(Me)".

I would like to put the CreateAndShow in a base form and then inherit from
it and still be able to use the CreateAndShow method.

Any suggestions? TANKS!!! :o)

M O J O


Oct 2 '06 #18

P: n/a
Hi Boo,

Please see my reply to Cor.

:o)

M O J O

"GhostInAK" wrote:
Hello M O J O,

What's the point of this? If the goal is to not have to call .Show when
you create a form (lazy-ass).. then add Me.Show to the base form's ctor.

-Boo
Hi,

Instead of doing this....

Public Class Form1
Public Shared Sub CreateAndShow()
Dim f As New Form1
f.Show()
End Sub
End Class
I would like to make it generic by doing something like...

Public Class Form1
Public Shared Sub CreateAndShow()
Dim f As New Me
f.Show()
End Sub
End Class
... but "Me" is not accepted, neither is "Dim f As New TypeOf(Me)".

I would like to put the CreateAndShow in a base form and then inherit
from it and still be able to use the CreateAndShow method.

Any suggestions? TANKS!!! :o)

M O J O


Oct 2 '06 #19

P: n/a
Mojo,

You could use a variation on the GoF's Prototype pattern. Basically,
it provides the ability for objects to create other instances of
themselves. Actually, it's very similar to cloning.

Brian

M O J O wrote:
Hi,

Instead of doing this....
Public Class Form1
Public Shared Sub CreateAndShow()
Dim f As New Form1
f.Show()
End Sub
End Class

I would like to make it generic by doing something like...

Public Class Form1
Public Shared Sub CreateAndShow()
Dim f As New Me
f.Show()
End Sub
End Class

... but "Me" is not accepted, neither is "Dim f As New TypeOf(Me)".

I would like to put the CreateAndShow in a base form and then inherit from
it and still be able to use the CreateAndShow method.

Any suggestions? TANKS!!! :o)

M O J O
Oct 2 '06 #20

P: n/a
Well then, too bad you need to go that route to gain any sense of self
worth. It would be so much better had you never answered this person's post
than belittle them. Shame does not teach. I used to do the same self-serving
kind of belittling that you know do but I rose above it to be able to give
greater support to more people. Perhaps someday, you'll try the same
"GhostInAK" <gh*******@gmail.comwrote in message
news:be**************************@news.microsoft.c om...
Hello Steve,

I'll berate whoever I want. Must you be so freakin sensitive? Grow a
pair, ya pansy.

-Boo
>-Boo,
Must you berate everyone?
"GhostInAK" <gh*******@gmail.comwrote in message
news:be**************************@news.microsoft. com...
>>Hello M O J O,

What's the point of this? If the goal is to not have to call .Show
when you create a form (lazy-ass).. then add Me.Show to the base
form's ctor. -Boo

Hi,

Instead of doing this....

Public Class Form1
Public Shared Sub CreateAndShow()
Dim f As New Form1
f.Show()
End Sub
End Class
I would like to make it generic by doing something like...
Public Class Form1
Public Shared Sub CreateAndShow()
Dim f As New Me
f.Show()
End Sub
End Class
... but "Me" is not accepted, neither is "Dim f As New TypeOf(Me)".
I would like to put the CreateAndShow in a base form and then
inherit from it and still be able to use the CreateAndShow method.

Any suggestions? TANKS!!! :o)

M O J O


Oct 2 '06 #21

P: n/a
Perhaps your right mg. Also, perhaps he's never heard the saying, "people
don't care what you know until they know you care."
"mg" <bi*****@gmail.comwrote in message
news:11**********************@k70g2000cwa.googlegr oups.com...
Watching Boo's replies to this and another recent post about retaining
changed values of a textbox, I think I see the reason. Boo does not
post to this NG to actually help anyone with VB, he's only here to show
everyone how much he knows. So if someone posts a question where he
can't do that, it shows in the caustic reply.

Boo, if the SNR is too high for you here, ignore it. As this is a
public NG, you are going to get all kinds of clueless nubes posting
stupid questions. Find a better way to deal with it so you can play
nicely.

GhostInAK wrote:
>Hello Steve,

I'll berate whoever I want. Must you be so freakin sensitive? Grow a
pair,
ya pansy.

-Boo
-Boo,
Must you berate everyone?
"GhostInAK" <gh*******@gmail.comwrote in message
news:be**************************@news.microsoft.c om...

Hello M O J O,

What's the point of this? If the goal is to not have to call .Show
when you create a form (lazy-ass).. then add Me.Show to the base
form's ctor. -Boo
>>Any suggestions? TANKS!!! :o)

M O J O

Oct 2 '06 #22

P: n/a
Mojo,

Public class myform
Inherits myBaseForm

https://msdn.microsoft.com/library/d...tminherits.asp

Cor

"M O J O" <MO**@discussions.microsoft.comschreef in bericht
news:17**********************************@microsof t.com...
Hi Cor,

I was hoping that since my shared sub was inside a class, vb somehow new
what type of class the shared sub was called from.

I'm building a CRM system for my company. I want to have a base form that
can inherit all my form from. This base form will have many base stuff
....
forexample I will have three diferent ways to create and show a form ...

1) Normal - just create the form and show it.

2) Single instance - if the form is not yet created, create the form an
show
it.

3) Single instance by ID - if for example the customer-form with customer
ID=xxx is not showing, create the form and show it, else show it.

Hope you get my pont.

Here's my code so far (beware of wrappings)....
Public Class BaseForm

Private _singleInstanceID As Guid
Private Shared _singleInstances As Dictionary(Of Guid, BaseForm)
Public Shared Sub CreateAndShowNormal(Optional ByVal owner As
IWin32Window = Nothing)
Dim f As Object =
Activator.CreateInstance(Reflection.MethodBase.Get CurrentMethod.DeclaringType)
DirectCast(f, BaseForm).Show(owner)
End Sub
Public Shared Sub CreateAndShowSingleInstace(Optional ByVal owner As
IWin32Window = Nothing)
Call CreateAndShowSingleInstace(Guid.Empty, owner)
End Sub
Public Shared Sub CreateAndShowSingleInstace(ByVal ID As Guid, Optional
ByVal owner As IWin32Window = Nothing)
If _singleInstances Is Nothing Then
_singleInstances = New Dictionary(Of Guid, BaseForm)
End If

Dim f As BaseForm

If Not _singleInstances.ContainsKey(ID) Then
Dim fa As Object =
Activator.CreateInstance(Reflection.MethodBase.Get CurrentMethod.DeclaringType)
f = DirectCast(fa, BaseForm)
f._singleInstanceID = ID
_singleInstances.Add(ID, f)
AddHandler f.FormClosed, AddressOf SingleInstanceClosed
Else
f = _singleInstances(ID)
End If

f.Show()
f.Focus()
End Sub
Private Shared Sub SingleInstanceClosed(ByVal sender As Object, ByVal e
As FormClosedEventArgs)
_singleInstances.Remove(DirectCast(sender,
BaseForm)._singleInstanceID)
End Sub

End Class
If there's a better way to do it, please let me know.

Thanks!

:o)

M O J O

"Cor Ligthert [MVP]" wrote:
>Mojo,

It is possible to create objects from classes. But never objects from
objects. (Although object is a class itself as well. To be more precise
the
highest class from which every thing derives).

The startup form is a kind of strange thing in VB.Net (but handy) it has
inbuild a Sub main, where in it creates an object from itself. For the
same
case you use a Module or Shared Class in which you can create your form
object. Than you can create as much objects from that class as you wish.

I hope this gives an idea.

Cor

"M O J O" <MO**@discussions.microsoft.comschreef in bericht
news:88**********************************@microso ft.com...
Hi,

Instead of doing this....
Public Class Form1
Public Shared Sub CreateAndShow()
Dim f As New Form1
f.Show()
End Sub
End Class

I would like to make it generic by doing something like...

Public Class Form1
Public Shared Sub CreateAndShow()
Dim f As New Me
f.Show()
End Sub
End Class

... but "Me" is not accepted, neither is "Dim f As New TypeOf(Me)".

I would like to put the CreateAndShow in a base form and then inherit
from
it and still be able to use the CreateAndShow method.

Any suggestions? TANKS!!! :o)

M O J O



Oct 2 '06 #23

P: n/a
Hello M O J O,

Ewwww.. YUCK.
Just use the .Show method with the Me keyword in your base form's ctor (to
hell with the shared functions). All that reflection gunk is noisy and ugly.

Public Sub New()
Me.Show()
End Sub

....Or better yet, stop bein a lazy-ass and call .Show yourself when you create
the form.

-Boo
Hi Boo,

Please see my reply to Cor.

:o)

M O J O

"GhostInAK" wrote:
>Hello M O J O,

What's the point of this? If the goal is to not have to call .Show
when you create a form (lazy-ass).. then add Me.Show to the base
form's ctor.

-Boo
>>Hi,

Instead of doing this....

Public Class Form1
Public Shared Sub CreateAndShow()
Dim f As New Form1
f.Show()
End Sub
End Class
I would like to make it generic by doing something like...
Public Class Form1
Public Shared Sub CreateAndShow()
Dim f As New Me
f.Show()
End Sub
End Class
... but "Me" is not accepted, neither is "Dim f As New TypeOf(Me)".
I would like to put the CreateAndShow in a base form and then
inherit from it and still be able to use the CreateAndShow method.

Any suggestions? TANKS!!! :o)

M O J O


Oct 3 '06 #24

P: n/a
hey it is me so give me a shout!!

*** Sent via Developersdex http://www.developersdex.com ***
Oct 14 '06 #25

This discussion thread is closed

Replies have been disabled for this discussion.