![]() |
Übersetzung in VB-Code
Hallo,
ich versuche grade Object Pascal Code nach VisualBasic bzw. Xojo zu übersetzen. An dieser Steller hapert es:
Code:
Kann mir bitte jemand einen Hinweis dazu geben?Es geht speziell darum "array[TGEDCOMApproximated] of string[3]".
type
TGEDCOMApproximated = (daExact, daAbout, daCalculated, daEstimated); const GEDCOMDateApproximatedArray: array[TGEDCOMApproximated] of string[3] = ('', 'ABT', 'CAL', 'EST'); Danke und gute Nacht |
AW: Übersetzung in VB-Code
Code:
Public Enum TGEDCOMApproximated
daExact = 0 daAbout = 1 daCalculated = 2 daEstimated = 3 End Enum
Code:
Anschließend kannst du das Array mit split und den Delemiter "," auseinandernehmen
const varArray() As Variant = Array("", "ABT", "CAL", "EST")
Code:
usw..
Dim fvarArray As String
varArray = Split(fvarArray , ",") varArray(0) = "" varArray(1) = "ABT" gruss |
AW: Übersetzung in VB-Code
Afaik (und kurze Google-Suche bestätigt das) kann man in VB keine konstanten Arrays deklarieren. Das folgende wäre in ungefähr eine machbare Aproximation:
Code:
Enum TGEDCOMApproximated [ As Integer ]
daExact daAbout daCalculated daEstimated End Enum Const AVALUES = ":ABT:CAL:EST" Public GEDCOMDateApproximatedArray(3) As String Public Sub FillArrayInInitialization() Dim vntTemp As Variant Dim intIndex As Integer vntTemp = Split(AVALUES, ":") For intIndex = 0 To 3 GEDCOMDateApproximatedArray(intIndex) = vntTemp(intIndex) Next End Sub |
AW: Übersetzung in VB-Code
Zitat:
OK dann!
Code:
dein [ as Interger ] kannst dir sparen :)
Enum TGEDCOMApproximated [ As Integer ]
daExact daAbout daCalculated daEstimated End Enum Und Ich die zahlen dahinter die nummerieren sich automatisch von 0 -> endlos und sind Integer auch ohne angaben Ach so wenn du es so genau nimmst. Solltest du auch das Public vor
Code:
in Privat ändern.. denn benutzerdefinierte Arrays sind in öffentlichen Mitgliedern von Objektmodulen nicht zugelassen.
Public GEDCOMDateApproximatedArray(3) As String
Danach sollte es stimmen. gruss |
AW: Übersetzung in VB-Code
Guten Morgen Hans,
wie schon geschrieben, es gibt in VB.Net keine Arrays als Konstanten. Es gibt sicher ein paar mögliche Lösungen für Dein Problem. Leider kenne ich den Hintergrund nicht ganz genau und kann daher nur eine funktionierende Lösung anbieten, welche mutmaßlich auf Deine Frage passen sollte. Da .Net komplett objektorientiert aufgebaut ist, wäre eine mögliche Lösung die folgende - wenn ich Dein Anliegen richtig verstanden habe: Zuerst eine kleine Miniklasse bauen, in etwa so:
Code:
Sieht etwas aufwendig aus, geht sicher auch noch etwas kürzer.
Public Class GEDCOMDateApproximatedColl
Inherits CollectionBase Public Enum eGEDCOMApproximated daExact daAbout daCalculated daEstimated End Enum Public Sub New() Me.Add("") Me.Add("ABT") Me.Add("CAL") Me.Add("EST") End Sub Private Sub Add(ByVal Item As String) Dim o As New GEDCOMApproximated o.Value = Item Me.InnerList.Add(o) End Sub Public Function GEDCOMDateApproximated(ByVal Item As eGEDCOMApproximated) As String Dim o As GEDCOMApproximated = CType(Me.InnerList(Item), GEDCOMApproximated) Return o.Value End Function Protected Class GEDCOMApproximated Public Property Value As String End Class End Class Der Vorteil ist, dass alles in dieser Klasse gekapselt definiert und beliebig erweiterbar ist. Deklaration und Aufruf funktioniert dann in etwa so:
Code:
Mit der Hilfe von Intellisense muss man gar nicht so viel tippen wie es hier ausschaut...
'Deklaration erfolgt an der Stelle wie und wo dies benötigt wird:
Public DateApproximated As New GEDCOMDateApproximatedColl 'Der Aufruf in etwa so: Private Sub Beispiel() Handles Button1.Click MessageBox.Show(Me.DateApproximated.GEDCOMDateApproximated(GEDCOMDateApproximatedColl.eGEDCOMApproximated.daAbout)) End Sub Sicherlich kannst Du diesen Vorschlag noch verbessern, da Du ja das nötige Hintergrundwissen der von Dir benötigten Umsetzung besitzt. Man könnte evtl. noch mit Generics, also einer 'List of T' arbeiten, muss dann aber auch wieder das Enum an anderer Stelle bauen. Deshalb habe ich das hier gleich alles gekapselt. Gruß Carsten PS: Wobei man an den Namen noch etwas 'feilen' sollte... :) Der Code sollte trotzdem nach menschlichem Ermessen lauffähig sein, wenn er denn richtig eingebaut wird. |
AW: Übersetzung in VB-Code
Geht das nicht so: :gruebel:
Code:
Oder redet ihr von einem anderen VB als
..
Dim GEDCOMDateApproximatedArray= {"", "ABT", "CAL", "EST"} .. ![]() |
AW: Übersetzung in VB-Code
Hallo zurück,
ja, natürlich würde Deine Zeile Code auch ausreichen. Ein Array kann man leider nicht als Konstante deklarieren, genau das war aber die Frage. Außerdem muss man immer daran denken, welches Enum nun gerade für dieses Array genommen werden soll. Etc. pp. Also insgesamt funktionsfähig, aber doch sehr wackelig. Mein Codebeispiel dient als Demonstration dieser Funktionalität, gekapselt in einer Klasse. Diese ist problemlos erweiterbar, ergibt einfach lesbaren Code(wenn anständige Namen vergeben wurden ;)) und verhindert falsche Zugriffe(vgl. Wertabfrage außerhalb des Arrays) schon beim programmieren. In größeren Projekten sind solche gekapselten Funktionalitäten ein unschlagbarer Vorteil. Dass es andere Wege gibt, welche anscheinend einfacher sein könnten, das habe ich nicht ausgeschlossen. Wenn man in einer objektorientierten Umgebung arbeitet und bei der Umstellung an ein paar Stellen auf Probleme stößt, warum dann nicht gleich richtig lösen? Außerdem kann man an den zwei Delphi-Codefetzen doch nur erahnen, wann, wo und wie oft dies nun benötigt wird. Je nachdem kann man das nun ausbauen oder nicht... Mal sehen wie sich Hans dazu äußert... Gruß Carsten Edit: Wobei ich mich frage, warum diese Werte nicht in eine separate (Steuerungs-)Tabelle ausgelagert werden und man dann damit arbeitet. Aber das ist eine andere Frage. :) |
AW: Übersetzung in VB-Code
Alles klar.
In C# macht 'man' (also einige Programierer) das z.B. über Attribute. Das sollte so auch in VB gehen. Da wird dann jedem Enum ein Attribut (z.B. 'TextRepresentation') verpasst und das repräsentiert dann eben den Text. Der Vorteil ist der, das der String direkt am Enum 'klebt'. Das finde ehrlich gesagt, noch besser, als eine Liste zu erweitern. PS: Hast Du bei deinem Codeschnippel auch die 'Add', 'Clear', 'Delete' etc Methoden verborgen, sodaß man die Liste nicht selbst erweitern kann? |
AW: Übersetzung in VB-Code
Hhmm, wie schaut das dann in C# genau aus?
Ein Enum ist in VB ein Enum. Du kannst den Wert aber auch als String ausgeben, was aber bei Leerstrings wie hier im Beispiel nicht funktioniert. Zu Deinem PS: Nein, da hast Du recht, habe ich vorhin nicht dran gedacht. Jetzt vollständig gekapselt, von Außen nur noch GetValue und das Enum erreichbar: Habe der Einfachheit halber noch eine Klasse als Hülle drum gelegt...
Code:
Deklaration und Aufruf so:
Public Class Approx
Private o As New GEDCOMDateApproximatedColl Public Enum eGEDCOMApproximated daExact daAbout daCalculated daEstimated End Enum Public Function GetValue(ByVal Item As eGEDCOMApproximated) As String Return o.GEDCOMDateApproximated(Item) End Function Private Class GEDCOMDateApproximatedColl Inherits CollectionBase Friend Sub New() Me.Add("") Me.Add("ABT") Me.Add("CAL") Me.Add("EST") End Sub Friend Function GEDCOMDateApproximated(ByVal Item As eGEDCOMApproximated) As String Dim o As GEDCOMApproximated = CType(Me.InnerList(Item), GEDCOMApproximated) Return o.Value End Function Private Sub Add(ByVal Item As String) Dim o As New GEDCOMApproximated o.Value = Item Me.InnerList.Add(o) End Sub Friend Class GEDCOMApproximated Friend Property Value As String End Class End Class End Class
Code:
'Deklaration wie und wo benötigt:
Public GEDCOMDateApproximated As New Approx 'Aufruf in etwa so: Private Sub Beispiel() Handles Button1.Click MessageBox.Show(Me.GEDCOMDateApproximated.GetValue(Approx.eGEDCOMApproximated.daAbout)) End Sub Gruß Carsten |
AW: Übersetzung in VB-Code
VB.Net ??
Kann nicht ersehen das hier VB.NET gemeint war. Lese hier nur was von VB-Code (VisualBasic) Aber egal. ;) gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:10 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz