Gå til innhold

Oppgradere objekt-funksjon fra VB6 til VB .Net 05


Anbefalte innlegg

Skrevet (endret)

Som tittelen sier vil jeg gjerne bruke denne koden (fikk den her på forumet) i VB .Net (2005).

 

Private Function FindObject(Name As String) As Object
   Dim Object As Object
   For Each Object In Me.Controls
       If LCase(Object.Name) = LCase(Name) Then
           Set FindObject = Object
           Exit Function
       End If
   Next
End Function

 

Det den gjør er å gå gjennom alle kontrollene i en form, og finner den som samsvarer med "Name", hvis det er en. Da vil jeg kunne skrive FindObject(Button1).text="Hei".

 

Kan noen hjelpe meg med dette? Den automatisk oppgraderingen sier følgende:

	'UPGRADE_NOTE: Name was upgraded to Name_Renamed. Click for more: 'ms-help://MS.VSExpressCC.v80/dv_commoner/local/redirect.htm?keyword="A9E4979A-37FA-4718-9994-97DD76ED70A7"'
Private Function FindObject(ByRef Name_Renamed As String) As Object
 'UPGRADE_NOTE: Object was upgraded to Object_Renamed. Click for more: 'ms-help://MS.VSExpressCC.v80/dv_commoner/local/redirect.htm?keyword="A9E4979A-37FA-4718-9994-97DD76ED70A7"'
 Dim Object_Renamed As Object
 For	Each Object_Renamed In Me.Controls
 	'UPGRADE_WARNING: Couldn't resolve default property of object Object_Renamed.Name. Click for more: 'ms-help://MS.VSExpressCC.v80/dv_commoner/local/redirect.htm?keyword="6A50421D-15FE-4896-8A1B-2EC21E9037B2"'
 	If LCase(Object_Renamed.Name) = LCase(Name_Renamed) Then
   FindObject = Object_Renamed
   Exit Function
 	End If
 Next Object_Renamed
End Function

 

Takk,

Degeim

Endret av Degeim
Videoannonse
Annonse
Skrevet (endret)

private function FindControl(name as string) as Control
 foreach( control c in me.Controls)
   if  string.compare(c.name,name,true) == 0 then
      return c
   end if
 next
 return nothing
end function

 

sånn ca....

 

eller mye bedre:

asp.net: Page.FindControl()

forms: me.Controls.Find(name,true).Text = "blah"

Endret av jorn79
Skrevet

Er dette C? Jeg bruker VB 2005. Uansett, så ble ikke "Control" og "C" på andre linje godkjent: "'Control is a type, and cannot be used as an expression", og på c: "Expected ')'".

Skrevet

Han har skrevet såkalt "pseudo" kode. Dette er bare for å vise deg hva du skal gjøre. Det er litt blanding av VB og C# kode.

 

C# og VB.NET er omtrent helt identisk bortsett fra at det er 2 dialekter. Den ene bruker parenteser overalt. Den andre gjør det ikke.

 

Kun snakk om noen parenteser osv som du kan fjerne. Om du kan VB så kan du gjette deg raskt frem til at

 

foreach(x in y)

 

er akkurat det samme som

 

For Each x In y

 

samtidig kan det være store og små bokstaver som du må fikse.

Skrevet

Jeg har allerede gjettet meg til alle desse tingene,og endret litt (feks == skal være = i VB). Men fremdeles, så sier VB at "Control is a type, and cannot be used as an expression".

Skrevet

Det var egentlig meningen å skrive VB.Net, men jeg testet den ikke og var vist litt trøtt igår ;)

 

 

Denne skal fungere bedre:

   Private Function FindControl(ByVal name As String) As Control
       For Each c As Control In Me.Controls
           If String.Compare(c.Name, name, True) = 0 Then
               Return c
           End If
       Next
       Return Nothing
   End Function

 

 

Uansett, som jeg sa er det bedre å bruke de innebygde funksjonene som gjør akuratt det samme, men bare bedre.

Skrevet

I C# har du muligheten til å opprette datatypen rett i foreach linjen.

 

C#

foreach(Control c in this.Controls)

 

VB.NET

Dim c as Control

For Each c in me.Controls

Skrevet (endret)

Jorn79, du snakker om innebygde funksjoner som gjør det samme, men bedre. Er det en slik i VB .NET?

 

Den vi (dere) har fått til nå, sjekker nemlig bare de "ytterste" kontrollene, den sjekker feks ikke kontroller som er inni en groupbox. Jeg må ha noe som sjekker alle kontroller i hele formen, inkudert "underkontroller".

 

Takk,

Degeim

Endret av Degeim
Skrevet

Takk, men hvordan bruker jeg denne? Det går ikke å skrive:

Dim Kontroll as Control
Kontroll=Me.Controls.Find("Button1",True)

 

Da får jeg "Value of 1-dimensional array of System.Windows.Forms.Control cannot be converted to System.Windows.Forms.Control".

 

Hva gjør jeg med dette?

 

(Jeg har prøvd: Dim Kontroll() as Control, men da returnerer den ikke annet enn "System.Windows.Forms.Control[]", uansett hva jeg skriver der det nå står "Button1".)

Skrevet

Vil tro at Find returnerer en helt vanlig array med controls.

       Dim KontrollArr() As Control
       KontrollArr = Me.Controls.Find("Button1", True)

       Dim Kontroll As Control
       Kontroll = KontrollArr(0)

Skrevet (endret)

Kontroll = KontrollArr(0) <-- "Index was outside the bounds of the array".

 

Kanskje det er på tide jeg utdyper hva jeg skal gjøre litt bedre, så dere kan komme med alternative forslag, evt bedre løsninger.

 

Det jeg har, er en fil der det står navn, tekst, og tooltiptext til samtlige kontroller i en form. Denne er til for å enklere kunne lage flerspråklige versjoner av programmet mitt.

 

Formatet er som følger:

Navn%Tekst%Tooltiptekst

Eks: Button1%Knapp1%Dette er en knapp

 

Nå henter altså programmet inn denne filen, og splitter den med "vbnewline" som splitter. Deretter looper det gjennom hvert element i arrayen, og splitter den med "%" som splitter til variabelen "Element()". Så tar den KontrollArr=Me.Controls.Find(Element(0),True), og Kontroll=KontrollArr(0). Og til slutt Kontroll.Text=Element(1), og ToolTip1.SetToolTip(Kontroll,Element(2)).

 

EDIT2: Deler av problemet er løst. Nå gjenstår det bare å få til tooltiptext på ToolStripButtoner. Jeg har kode for å finne ut om dette er en ToolStripButton, men jeg vet ikke hvordan jeg kan gjøre følgende:

 

If ToolStripButton then
Kontroll.ToolTipText=Element(2)
else
ToolTip1.SetToolTipText(Kontroll,Element(2))
end if

 

Problemet ligger i hvordan jeg kan få Kontroll som er dimmet som Control, eller hvilken som helst annen variabel, dimmet som det som er riktig, til å representere en ToolStripButton med et gitt navn, feks ToolStripButton1.

 

Forslag?

Endret av Degeim
Skrevet (endret)

Her er hvordan jeg ser koden din.

 

        Dim t As New ToolTip

       'Les filen
       Dim filedata As String = ReadFile("blahblah.psl")

       'Splitt opp i linjer
       Dim lines() As String = Split(filedata, vbCrLf)

       'For hver linje
       For Each line As String In lines
           'Splitt opp linjen
           Dim data() As String = line.Split("#")
           Dim KontrollNavn As String = data(0)
           Dim KontrollText As String = data(1)
           Dim KontrollToolTip As String = data(3)

           'Finn kontroller som har dette navnet. 
           Dim kontrollTreff() As Control = Me.Controls.Find(KontrollNavn, True)

           'For hver kontroll (høyst sannsynlig kun 1)
           For Each kontroll As Control In kontrollTreff
               'Sett tekst (bruk '.Length > 0' istedet for '<> ""' da den er hurtigere)
               If KontrollText.Length > 0 Then kontroll.Text = KontrollText
               If KontrollToolTip.Length > 0 Then t.SetToolTip(kontroll, KontrollToolTip)
           Next

       Next

 

Ellers: Språk-filen din blir kanskje bedre lesbar om du heller benytter deg av XML til å holde infoen.

Endret av wolf5
Skrevet

Tusen takk for all hjelp fra Wolf5 og Jorn79. Jeg setter stor pris på at dere vier så my tid til en helt ukjent persons problemer;). Hovedproblemet er nå løst, men det er fremdeles et lite problem. Se EDIT2 i min forrige post.

 

Takk,

Degeim

Skrevet

Bare moro å hjelpe :) Lykke til!

 

If TypeOf Kontroll Is ToolStripButton then
    cType(Kontroll,ToolStripButton).ToolTipText=Element(2)
else
    ToolTip1.SetToolTipText(Kontroll,Element(2))
end if

Skrevet

Bare et lite tips når det gjelder språk. VB.Net har for windows applikasjoner veldig god støtte for dette uten at du trenger å gjøre slike krumspring du har gjordt her...

 

På selve form'en din er det en property som heter Language.

1) Lag formen på vanlig måte og skriv på engelsk over alt.

2) Sett Language til Norsk.

3) Oversett propertiene til kontrollene på formen

4) Bytt Language til/fra (Default) og Norsk og du skal se at formen nå støtter 2 språk :)

5) Du kan sette flere språk. Og la brukeren velge ved oppstart eller sjekke System.Diagnosticts.CultureInfo.CurrentCulture for å se hvilket språk brukeren har på maskinen.

Skrevet

Tusen takk, Jorn. Koden din (litt modifisert for å virke for meg, med Wolf5 sin kode, vel å merke):

 

If TypeOf kontroll Is ToolStripButton Then
                   CType(kontroll, ToolStripButton).ToolTipText = KontrollToolTip
               Else
                   If KontrollToolTip.Length > 0 Then t.SetToolTip(kontroll, KontrollToolTip)
               End If

 

Returnerer dessverre:

Linje1: Expression of type System.Windows.Forms.Control can never be of type System.Windows.Forms.ToolStripButton

Linje2: Value of type System.Windows.Forms.Control cannot be converted to System.Windows.Forms.ToolStripButton

 

Det er ca det samme jeg fikk når jeg prøvde...

 

Forslag?

Skrevet (endret)

Har ikke lekt meg så mye med ToolStrips, men det virker som om ToolStrip barn (ToolStripButton osv) ikke lar seg enumerere under me.Controls.

 

Normalt har du alle kontrollene i et Control hierarki under me.Controls, men ToolStrip har en egen måte å ha barna på. Tror rett og slett du må for hver enkelt ToolStrip objekt du treffer, enumere ToolStrip.Items for å få tak i barna der.

 

Pga dette må du nok restrukturere hele koden:

  Dim t As New ToolTip

   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
       'Les filen
       Dim filedata As String = ReadFile("blahblah.psl")

       'Splitt opp i linjer
       Dim lines() As String = Split(filedata, vbCrLf)

       Dim dic As New Dictionary(Of String, Info)

       'Bygger en liste med all infoen fra filen. Navn er nøkkel
       For Each line As String In lines
           Dim data() As String = line.Split("#")

           Dim info As New Info
           info.Navn = data(0)
           info.Text = data(1)
           info.ToolTip = data(2)

           dic.Add(info.Navn, info)
       Next

       'Kaller en iterativ funksjon som løper gjennom alle kontrollene
       TraverseControls(Me, dic)

   End Sub

   Public Class Info
       Public Navn As String
       Public Text As String
       Public ToolTip As String
   End Class

   Public Sub TraverseControls(ByVal c As Control, ByVal dic As Dictionary(Of String, Info))
       If TypeOf c Is ToolStrip Then
           'Unntakshåndter ToolStrip
           For Each tsi As ToolStripItem In CType(c, ToolStrip).Items
               If dic.ContainsKey(c.Name) Then
                   tsi.Text = dic(c.Name).Text
                   'Tooltip finnes IKKE for ToolStripItem. Det er TEXT som faktisk er tooltipteksten....
               End If
           Next

       Else
           'Finnes kontrollen i listen min?
           If dic.ContainsKey(c.Name) Then
               c.Text = dic(c.Name).Text
               t.SetToolTip(c, dic(c.Name).ToolTip)
           End If
           'Løp gjennom barne-kontrollene
           For Each kontroll As Control In c.Controls
               TraverseControls(kontroll, dic)
           Next
       End If
   End Sub

Endret av wolf5
Skrevet

Jeg måtte gjøre noen ørsmå endringer i TraverseControls:

If TypeOf c Is ToolStrip Then
           'Unntakshåndter ToolStrip
           For Each Tsi As ToolStripItem In CType(c, ToolStrip).Items
               If dic.ContainsKey(Tsi.Name) Then
                   Tsi.Text = dic(Tsi.Name).ToolTip
                   'ToolTip finnes IKKE for ToolStripItem. Det er TEXT som faktisk er toolstripteksten....
               End If
           Next
       Else

 

Og så virket det perfekt! Igjen; tusen takk Wolf og Jorn!

 

Hvis jeg finner ut hvordan skal jeg sette dette emnet som [Løst].

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...