Toon posts:

[VB.NET2003/property control]Gebruik resourcemanager error

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik zit in het OpenSource project MapWindow (www.mapwindow.org).
Mapwindow is een GIS-applicatie.

Ik ben daarin bezig met het geschikt maken van de applicatie voor meerdere talen (Engels, Nederland, Duits, etc).
Hiervoor gebruiken we de standaard manier van .NET door resourcefiles te gebruiken. Dit gaat prima voor de forms.
Nu gebruiken we ook de standaard .NET property control om de gegevens van een kaart weer te geven en te laten wijzigen (zoals projectie, displaynaam, kleuren, icon, labels, etc.)

Een deel van die code ziet er als volgt uit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    <Category("Project Projection"), _
    TypeConverter(GetType(SubCategoryCls)), _
    ReadOnlyAttribute(False)> _
    Public Property Group() As String
        Get
            Return m_SubCategory
        End Get
        Set(ByVal Value As String)
            If m_MainCategory = "" Then 'Should select MainCategory first
                MessageBox.Show("Please Select Main Category")
                Return
            End If
            m_SubCategory = Value
            m_CurrentSub = Value
            Name = ""   'refresh Name because subcategory has changed
        End Set
    End Property


Ik heb een resourcefile (PrjSetGrid.resx) toegevoegt en ik heb de code als volgt aangepast:
In de declarations:
code:
1
Private resMan As ResourceManager = New ResourceManager("MapWindow.PrjSetGrid", System.Reflection.Assembly.GetExecutingAssembly())

en in
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    <Category(resMan.GetString("ProjectProjection.Text")), _
    TypeConverter(GetType(SubCategoryCls)), _
    ReadOnlyAttribute(False)> _
    Public Property Group() As String
        Get
            Return m_SubCategory
        End Get
        Set(ByVal Value As String)
            If m_MainCategory = "" Then 'Should select MainCategory first
                MessageBox.Show(resMan.GetString("PleaseSelectMainCategory.Text"))
                Return
            End If
            m_SubCategory = Value
            m_CurrentSub = Value
            Name = ""   'refresh Name because subcategory has changed
        End Set
    End Property


De regel
code:
1
MessageBox.Show(resMan.GetString("PleaseSelectMainCategory.Text"))

gaat prima.

Maar op de eerste regel
code:
1
<Category(resMan.GetString("ProjectProjection.Text")), _

krijg ik de volgende foutmelding op resMan:
Reference to a non-shared member requires an object reference.

Als ik vervolgens de declaratie can resMan verander van Private naar Public Shared, krijg ik de melding dat het een constant string moet zijn. :?

Ik heb al op Google en MSN gezocht maar ik kan niets vinden hoe ik dit kan oplossen/omzeilen.

Heeft iemand van jullie een idee?

Paul

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 26-04 09:25

pjvandesande

GC.Collect(head);

De Category is een static (Shared in VB) Attribute. Dus je moet hem ook static voedsel geven :)

Waarom zou je alleen de Category's ook willen meenemen in je Resource file. Dit is toch alleen voor de ontwikkeling. Hou dit lekker engels, je gaat toch ook niet:

C#:
1
MyClass myClass = new MyClass();

Veranderen in:
C#:
1
MyClass myClass = nieuwe MyClass();


Beetje zoals [rml].oisyn in "[ ALG]Goede Commentstyle?"[/rml]

[ Voor 72% gewijzigd door pjvandesande op 26-10-2005 09:33 ]


Verwijderd

Topicstarter
@questa: Je hebt helemaal gelijk. Alleen de CategoryAttribute wordt wel weergegeven in de control. En de control wil ik vertaald hebben. Dus niet "Project Projection", maar "Projectprojectie" en niet "Color", maar "Kleur". En zo zijn er meer properties die vertaald moeten worden.
Het gaat om de output en zeker niet om de code.

Ik heb naam van de/het control niet goed genoemd. Het gaat om de PropertyGrid control.

Enkele quotes over de PropertyGrid uit MSDN:
There are numerous places in an application where you might want to provide a richer editing experience by having the user interact with a PropertyGrid. One example is an application that has several "settings" or options, some of them complex, that a user can set. You could use radio buttons, combo boxes, or text boxes to represent these options.
The settings are much easier to manage and maintain if you create a separate class rather than using individual variables.
CategoryAttribute. Sets the category that the property is under in the grid. This is useful when you want a property grouped by a category name. If a property does not have a category specified, then it will be assigned to the Misc category.
Paul

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 26-04 09:25

pjvandesande

GC.Collect(head);

Ik vind het nog steeds een beetje overdreven, je gaat je documentatie en je comment's in je code ook niet in een Resource Manager donderen.

Maar als je het toch wil berijken zul je toch een static object moeten gebruiken daar.

Je kunt beter met werken met Preprocessor Directives denk ik. Hoewel dit je code wel echt enorm vervuild.

[ Voor 9% gewijzigd door pjvandesande op 26-10-2005 09:57 ]


Verwijderd

Topicstarter
Ik geloof niet dat we over hetzelfde hebben.
Het gaat er niet om dat ik in design-time een Nederlandse property grid wil maar in run-time.
Hieronder staan een plaatje van Mapwindow in run-time.
Ik heb met groen aangegeven welke teksten inmiddels met succes zijn vertaald naar het Nederlands.
Het form vooraan heeft een property grid en toont de eigenschappen van de geselecteerde laag. In dit geval prov.
Met rood heb ik hier aangegeven welke tekst nog vertaald moet worden.
Om deze tekst gaat het dus.
Hopelijk verduidelijkt dit het geheel.

Afbeeldingslocatie: http://www.soilcompany.nl/ftp/PropertyGrid.gif

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 26-04 09:25

pjvandesande

GC.Collect(head);

Oke je gebruikt dus de Attribute values ook binnen je programma. Maar zoals ik al twee keer heb aangegeven, gebruikt dan gewoon een static member. Dat is het probleem opgelost.

Verwijderd

Topicstarter
OK.
Ik zal het gaan proberen. Bedankt voor je hulp.

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 26-04 09:25

pjvandesande

GC.Collect(head);

Een anderen oplossing is er niet en aan Preprocessor Directives heb je geen drol, het probleem is mij nu helemaal duidelijk en de enige oplossing is om gewoon een static membertje te gebruiken.
Pagina: 1