EDIT: Omförmulerar mig. Om formuläret _OrderWorkorder har en publik metod som heter DoSomething så kan du anropa den med: Så trodde jag att man skulle göra men det vill inte fungera. Visa mer kod, visa hur koden ser ut i verkligheten. Gissningsvis är du i fel scope och härjar Jag har en sida som heter _Main där man väljer vad man vill göra, t.ex skapa en ny order. Då öppnar man en ny order genom en knapp. Då körs följande kod: > Förresten vad menar du med scope? Ok tack då förstår jag lite mer. Du kan t.ex. skapa en array (dock lite omständigt då du inte på förhand vet hur många fönster du vill öppna), eller använda en lista/dictionary. Titta på klasserna System.Collections.Generic.List resp. Dictionary. Tack för hjälpen. Som sagt, eftersom att en array kräver att du vet hur många element du behöver ifrån början så.. Titta på list resp. dictionary Här är ett exempel: Jag tycker det sista förslaget verkar invecklat. Jag kör nu med en array och jag har fått funktionerna jag sökte och det fungerar. Ditt förslag är mer invecklat, och käkar mer minne, än att köra med list eller dictionary. Jag tackar och bockar för all vänlig hjälp. Får se om jag får till det med list eller dictionary.Anropa en public sub
Hej
Hur anropar man en public sub som ligger i en form som öppnas genom:
Dim myOrder_Workorder As New _OrderWorkorder
myOrder_Workorder.Show()
(Gör att man kan öppna flera fönster med samma form)
Hittar inget på nätet om det. (troligtvis fel sökfraser)
Nån som kan ge lite tips på sökfraser eller några tips på hur man görSv: Anropa en public sub
myOrder_WorkOrder.DoSomething()Sv:Anropa en public sub
Men jag får ett medelande om att myOrder_WorkOrder inte är deklarerad.
Jag deklarerar ju den när jag ska öppna formen:
Dim myOrder_Workorder As New _OrderWorkorder
myOrder_Workorder.Show()
den kodsnutten körs när man klickar på en knapp.
Hur ska man annars deklarera den. Kan tänkamig att det är där felet ligger.
Jag vill ju kunna ha flera likadana fönster öppna samtidigt. det är ju det som ställer till det för migSv: Anropa en public sub
Sv:Anropa en public sub
Dim myOrder_Workorder As New _OrderWorkorder
myOrder_Workorder.Show()
Där fyller man div uppgifter. När man lägger till en artikel och ska fylla i artnr kan man välja att söka efter en artikel. Man klickar på en knapp och denna kod körs:
SokArtikel_Order.Show()
När man väl har hittat artiklen man vill ha i sökfönstret klickar man på "lägg till" och artikel numret ska hamna i fältet för artikelnummer i fönstret "myOrder_Workorder"
Då försökte jag att lösa det så här.
Jag skapar en sub i "_OrderWorkorder"
Public Sub Hamta_sökord()
text_Artikelnummer.Text = SokArtikel_Order.label_ValtArtnr.Text
End Sub
Jag kallar på subben från sökfönstret när jag klickar på "lägg till"
_OrderWorkorder.Hamta_sokord()
Det skulle kanske vara "myOrder_Workorder" istället för "_OrderWorkorder" men då får jag fel att den inte är deklarerad.
Om jag öppnar orderfönstret med "_OrderWorkorder.show" istället så fungerar det.
Men så vill jag inte ha det. man måste kunna ha flera aktiva ordrar uppe samtidigt.
Hoppas du blir lite klokar på hur jag menar.
Förresten vad menar du med scope?Sv: Anropa en public sub
En variabel är bara giltig inom sitt scope. Nu är det lite knöligare att förklara i vb.net, men i c# kan man på ett ungefär säga att varje { och } är ett nytt scope. Om jag deklararerar någonting innanför ett par { och } så är det jag deklarerar bara giltigt sålänge jag fortfarande befinner mig innanför nyss nämnda { och }. Så fort jag hamnar utanför (t.ex. för att jag skriver en } ) så är det jag deklarerat inte giltigt längre.
Exempel i vb.net: (med reservation för syntaxfel)
public sub anka()
dim foo as string
foo = "kaka" 'Går alltid bra, foo är ju redan deklarerad
bar = "kaka" 'Ogiltigt, bar är inte deklarerad än, och dessutom i fel scope
while true
foo = "kaka"
bar = "kaka" 'Ogiltigt, bar är inte deklarerad än
dim bar as string
foo = "kaka"
bar = "kaka" 'Går bra
loop
foo = "kaka"
bar = "kaka" 'Ogiltigt, bar är visserligen deklarerad, men vi befinner oss i fel scope
end sub
public sub fisk()
foo = "kaka" 'Ogiltigt, är ju i helt fel scope. foo är deklarerad i en annan funktion, men det vet jag ingenting om
bar = "kaka" 'Ogiltigt, är ju i helt fel scope. bar är deklarerad i en annan funktion, men det vet jag ingenting om
end sub
Vad du troligtvis försöker gör är att deklarera din variabel myOrder_Workorder i en funktion för att sedan försöka använda den i en annan. Det är två helt skilda scope. Du måste hitta på en annan lösning, den ena funktionen kan omöjligt veta någonting om variabler i den andra funktionen.
Förslagsvis kan du skapa en Lista eller liknande som du deklarerar i klassen (_inte_ i någon funktion) som du sedan fyller på i samband med att du skapar nya instanser av klassen _OrderWorkorder. Den listan kan du sedan komma åt ifrån din andra funktion. På så sätt kan du skapa "oändligt" många instanser av den klassen. Hur du sedan väljer vilken utav dem du vill exekvera din funktion på är dock ett annat problem.
Sv:Anropa en public sub
Men hur menar du med att skapa en lista? Kan man då skapa flera instanser av samma form med ett unikt namn som man kan kalla på
Om man ändrar namnet när man skapar en ny "myOrder_Workorder" till ett unikt namn då blir det väll samma sak som tidigare. Man kan inte kalla på det unika fönstret från ett annat scope.
Vet du någon webbsida där man kan läsa på lite om hur man hanterar dessa instanser?Sv: Anropa en public sub
Sv:Anropa en public sub
Verkar som att det går att lösa genom en array. (det lilla jag hunnit testa)
Jag löste det så här:
Dim myOrderWorkorder(2) As _OrderWorkorder
i formen _Main
När jag öppanar ett nytt fönster:
myOrderWorkorder(0) = New _OrderWorkorder
myOrderWorkorder(0).Show()
Vill jag ändra något i formen
myOrderWorkorder(0).text_artikelnr.text = SokArtikel_Order.label_ValtArtikelnr.text
Jag tror nog att det ska funka nu.
Men vad händer om fler antal i arrayen än jag kommer att behöva? ex Dim myOrderWorkorder(100) As _OrderWorkorder
Tack än en gångSv: Anropa en public sub
Sv: Anropa en public sub
Public Class Form1
'Deklarerar en klassnivå variabel,
'tillgänglig för alla procedurer i klassen
Private ReadOnly children As New System.Collections.Generic.List(Of Form2)
'Funktion för att skapa ett nytt fönster
Private Function NewForm() As Form2
'Deklarerar en lokal variabel och skapar en instans av ett nytt fönster,
'tillgänglig bara inom funktionen NewForm()
Dim f As New Form2()
'Sätter huvudfönstret som ägare,
'Innebär att fönstrena kommer ligga över huvudfönstret samt att om om huvudfönstret stängs
'stängs även barnfönstren
f.Owner = Me
'Lägger till fönsterinstansen i samlingen children
children.Add(f)
'Lägger till en event handler vilket gör att objektet tas bort från samlingen när det stängs
AddHandler f.FormClosed, AddressOf RemoveFormOnClose
'Visar fönstret
f.Show()
'Retunerar fönstret
Return f
End Function
Private Sub RemoveFormOnClose(ByVal sender As System.Object, ByVal e As System.EventArgs)
'Tar bort objektet från listan
children.Remove(sender)
'Tar bort event handler
RemoveHandler ctype(sender, Form2).FormClosing, AddressOf RemoveFormOnClose
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'Skapar ett nytt tomt fönster
NewForm()
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
'Skapar ett nytt tomt fönster
Dim f As Form2 = NewForm()
'Anropar en metod på det nyss skapadet fönstret.
f.Focus()
End Sub
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
'Kontrolerar om det finns några öppna fönster
If children.Count > 0 Then
'Anropar en metod på det nyss skapadet fönstret.
children(0).BringToFront()
End If
End Sub
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
'Deklarerar en lokal variabel
Dim f As Form2
'Går igenom alla barnfänster
For Each f In children
'Anropar en metod på det nyss skapadet fönstret.
f.Focus()
Next
End Sub
End Class
Sv:Anropa en public sub
Men är det någon fara att deklarera så här: "Dim myOrderWorkorder(10000) As _OrderWorkorder"
Jag kan ju då skapa upp till 10000 nya fönster, men käkar det mycket minne eller processorkraft.?Sv: Anropa en public sub
Sv:Anropa en public sub
Annars får jag anse detta som löst.
Tack och bock