Degeim Skrevet 20. mars 2006 Skrevet 20. mars 2006 (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 22. mars 2006 av Degeim
j000rn Skrevet 20. mars 2006 Skrevet 20. mars 2006 (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 20. mars 2006 av jorn79
Degeim Skrevet 21. mars 2006 Forfatter Skrevet 21. mars 2006 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 ')'".
wolf5 Skrevet 21. mars 2006 Skrevet 21. mars 2006 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.
Degeim Skrevet 21. mars 2006 Forfatter Skrevet 21. mars 2006 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".
j000rn Skrevet 21. mars 2006 Skrevet 21. mars 2006 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.
wolf5 Skrevet 21. mars 2006 Skrevet 21. mars 2006 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
wolf5 Skrevet 21. mars 2006 Skrevet 21. mars 2006 Visste ikke at man kunne ta "c As Control" i VB.NET. Greit å vite.
Degeim Skrevet 21. mars 2006 Forfatter Skrevet 21. mars 2006 (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 21. mars 2006 av Degeim
Degeim Skrevet 21. mars 2006 Forfatter Skrevet 21. mars 2006 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".)
wolf5 Skrevet 21. mars 2006 Skrevet 21. mars 2006 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)
Degeim Skrevet 21. mars 2006 Forfatter Skrevet 21. mars 2006 (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 21. mars 2006 av Degeim
wolf5 Skrevet 21. mars 2006 Skrevet 21. mars 2006 (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 21. mars 2006 av wolf5
Degeim Skrevet 21. mars 2006 Forfatter Skrevet 21. mars 2006 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
j000rn Skrevet 21. mars 2006 Skrevet 21. mars 2006 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
j000rn Skrevet 21. mars 2006 Skrevet 21. mars 2006 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.
Degeim Skrevet 21. mars 2006 Forfatter Skrevet 21. mars 2006 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?
wolf5 Skrevet 21. mars 2006 Skrevet 21. mars 2006 (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 22. mars 2006 av wolf5
Degeim Skrevet 22. mars 2006 Forfatter Skrevet 22. mars 2006 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].
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å