| |
VB.NET - Ein- und UmsteigerStringmapping? Suche Lösung. | | | Autor: Lupus52 | Datum: 19.12.16 13:41 |
| Hallo,
vielleicht kennt noch jemand aus dem alten Powerbasic die Möglichkeit von Stringmapping.
Das würde ich so oder ähnlich gerne auch in VB realisieren.
D.h. ich bekomme einen String, der aus diversen einzelnen Infoblöcken zusammengesetzt ist. Und ich möchte dann automatisch die gemappten Teilstrings belegt haben.
Ebenso umgekehrt. Eine Änderung eines der Teilstrings soll automatisch den gemappten Gesamstring anpassen.
Also ohne irgendwelche Zerlege, oder Zusammensetzschleifen.
Es wird wohl irgendwie auf Arrays rauslaufen? Nur finde ich keine verwertbaren Beispiele.
Danke schon mal vorab.
Bsp. aus altem Programm
map answer0$$ * 11, from 1 to 1 as kenn$$,_
from 2 to 2 as version1$$,_
from 3 to 3 as version2$$,_
from 4 to 4 as verdatum1$$,_
from 5 to 5 as verdatum2$$,_
from 6 to 7 as verdatum3$$,_
from 8 to 8 as option1$$,_
from 9 to 9 as option2$$,_
from 10 to 10 as option3$$,_
from 11 to 11 as option4$$ | |
Re: Stringmapping? Suche Lösung. | | | Autor: effeff | Datum: 19.12.16 14:57 |
| Wenn Du Strings aus einem Array zusammenfügen willst, kannst Du die String.Concat-Methode benutzen:
Dim arr() as String="hallo,juhu,moin,grüzi,hi".Split(",")
Dim Gesamt as String=String.Concat(arr)
Messagebox.Show(Gesamt) EALA FREYA FRESENA | |
Re: Stringmapping? Suche Lösung. | | | Autor: Lupus52 | Datum: 19.12.16 15:49 |
| Hallo,
danke - aber das ist leider nicht die Lösung. Split und Concat müssen jedesmal explizit benutzt werden um eine Änderung am Array zu erreichen.
Ich möchte aber, dass sich ein Teilbereich des Arrays gezielt manipulieren lässt und es sich auf den ganzen Bereich auswirkt. Ich weiss nicht wie ich es am besten erklären kann. Wer Powerbasic kennt, der kennt auch MAP
Nach
arr(0) = "AA"
arr(1) = "BB"
arr(2) = "CC"
soll ergebnis automatisch den Inhalt "AABBCC" haben
Wenn nun die Anweisung
arr(1) = "XX" kommt
muss ergebnis sofort und ohne weitere Programmschritte den Inhalt "AAXXCC" haben
Umgekehrt. Wenn ich dann sage ergebnis = "AAZZCC" muss in arr(1)= der Inhalt "ZZ" sein.
Anwendungsfall: Ein Messgerät liefert zyklisch einen String aus 12 Bytes. Das wird einem gemappten Gesamtstring zugewiesen. Mich interessieren aber nur z.B. 2 Bytes an Pos 5 und 6 die automatisch(!) in einem gemappten Teilsting landen sollen. Oder umgekehrt es soll ein Steuerstring gesendet werden der einmal zusammengesetzt wurde und dessen Byte 5 und 6 sich ändern wenn sich in dem dazu gemappten String was ändert.
Rest siehe meine Frage. | |
Re: Stringmapping? Suche Lösung. | | | Autor: HenryV | Datum: 19.12.16 16:46 |
| Quick 'n Dirty mit einen Property
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) _
Handles Button1.Click
Teil(0) = "AA"
Teil(1) = "BB"
Teil(2) = "CC"
Teil(3) = "DD"
MessageBox.Show(Ergebnis)
Teil(1) = "XX"
MessageBox.Show(Ergebnis)
ergebnis = "AAZZCCDD"
MessageBox.Show(Teil(1))
End Sub
Private Teil(3) As String
Property Ergebnis() As String
Get
Return String.Join("", Teil)
End Get
Set(ByVal value As String)
Teil(0) = value.Substring(0, 2)
Teil(1) = value.Substring(2, 2)
Teil(2) = value.Substring(4, 2)
Teil(3) = value.Substring(6, 2)
End Set
End Property | |
Re: Stringmapping? Suche Lösung. | | | Autor: minimalist | Datum: 19.12.16 16:56 |
| Also wenn du im array elemente veränderst dann ist ja der ganze array geändert. den kannst du ja dann direkt weiter verwenden indem du die elemente zusammen fasst:
Debug.print(arr(0) & arr(1) & arr(3))
Umgekehrt wenn du den string bekommst dann benutze die substring methode:
Dim myData As String = "AAZZCC"
arr(0)==myData.substring(0,2)
arr(1)=myData.substring(3,2)
arr(2)=myData.substring(5,2)
3 ist die start position, 2 wieviele element du willst. | |
Re: Stringmapping? Suche Lösung. | | | Autor: Lupus52 | Datum: 19.12.16 17:26 |
| Hallo und Danke
dieser Standardweg ist mir bekannt. Das setzt aber bei jeder Änderung eines Teilelemnts voraus, dass alle Elemente neu zusammengesetzt werden müssen oder gezielt ein Element auskopiert wird. Auch wenn das über eine Funktion erleichtert werden kann.
PowerBasic hatte die extrem schnelle und praktische Möglichkeit mit dem Mapping wie ich es beschrieben hatte. Aber das hat VB offensichtlich nicht. Bleibt also nur der Weg wie du ihn beschrieben hast.
Ich hätte mir halt gerne eine Menge Code erspart, wenn ich meine bestehenden Programme diesbezüglich hätte anpassen können. Und so muss ich halt ganze Blöcke quasi neu schreiben. Und das in mehreren Programmen, da ich eben das Mapping immer gerne verwendet hatte. | |
Re: Stringmapping? Suche Lösung. | | | Autor: Manfred X | Datum: 19.12.16 19:29 |
| Hallo!
Strings in VB.Net sind unveränderlich !!!
Jede Modifikation des Inhalts einer Stringvariable erstellt
einen neuen Inhalt z.B. einfügen oder löschen von Teilstrings.
Für Operationen, wie Du sie durchführen willst, wäre statt dessen
eine Instanz der Stringbuilder-Klasse in einer eigens erstellten
Mapping-Klasse zu kapseln. | |
Re: Stringmapping? Suche Lösung. | | | Autor: Lupus52 | Datum: 19.12.16 20:04 |
| Danke - nur Bahnhof - ich löse das jetzt einfach mit Stringaneinanderhängen oder Substrings. Wie im vorigen Tip genannt. Sonst wird das zu wissenschaftlich.
Meine Güte - dieses VB macht echt keinen Spaß! Wozu ich früher mit Powerbasic 1 Stunde gebraucht habe brauche ich heute 1 Tag oder mehr. Genau genommen bastle ich jetzt eine Woche dran rum und habe noch keinen Steuer- und Messdatenstring mit dem Messgerät hin- und her bekommen.
Bin ich froh, dass ich noch meinen alten XP-Rechner mit DOS und PB habe. Da kann ich mit den meisten Sachen ausweichen. Bevor ich stundenlanges Recherchieren wegen VB mache.
Danke dir trotzdem. | |
Re: Stringmapping? Suche Lösung. | | | Autor: Manfred X | Datum: 19.12.16 21:03 |
| Ein Beispiel (ohne Stringvariable und Array;
solche Sachen braucht man in VB.Net für diesen Zweck nicht)
Public Class StringParts
Dim _stb As New System.Text.StringBuilder
Dim _upperbounds() As Integer
Dim _lowerbounds() As Integer
Dim _lengths() As Integer
Public Sub New(ParamArray lengths() As Integer)
Array.Resize(_lowerbounds, lengths.Length)
Array.Resize(_lengths, lengths.Length)
Array.Resize(_upperbounds, lengths.Length)
_lowerbounds(0) = 0
_upperbounds(0) = lengths(0) - 1
_lengths(0) = lengths(0)
For i As Integer = 1 To lengths.Length - 1
If lengths(i) < 1 Or lengths(i - 1) < 1 Then
Throw New ArgumentException
End If
_lowerbounds(i) = _upperbounds(i - 1) + 1
_upperbounds(i) = _upperbounds(i - 1) + lengths(i)
_lengths(i) = lengths(i)
Next i
_stb = New System.Text.StringBuilder _
(New String(" "c, _upperbounds _
(_upperbounds.GetUpperBound(0)) + 1))
End Sub
Default Public Property Part(ByVal index As Integer) As String
Get
Return _stb.ToString(_lowerbounds(index), _lengths(index))
End Get
Set(value As String)
Dim sb As New System.Text.StringBuilder(value)
sb.Length = _lengths(index)
_stb.Remove(_lowerbounds(index), _lengths(index))
_stb.Insert(_lowerbounds(index), sb)
End Set
End Property
Public ReadOnly Property Total() As String
Get
Return _stb.ToString
End Get
End Property
End Class Anwendung der Klasse:
'Im Konstruktor
'Zahl der Elemente und Länge der Elemente angeben
Dim stp As New StringParts(2, 3, 4)
'Elemente belegen (automatische Längenanpassung)
stp(0) = "AA"
stp(1) = "BBB"
stp(2) = "CCCC"
Dim str As String = stp.Total 'AABBBCCCC
stp(1) = "XXXXX" 'Überlänge wird abgeschnitten!
str = stp(1) 'XXX
str = stp(2) 'CCCC
str = stp.Total 'AAXXXCCCC | |
Re: Stringmapping? Suche Lösung. | | | Autor: Lupus52 | Datum: 19.12.16 22:01 |
| Danke - bitte nicht noch mehr in dieser Richtung. Ihr müsst euch nicht damit überbieten wer die komplizierteste Lösoung hat. <g>
Mapping, wie ich es kenne, ist eine extreme Vereinfachung gegenüber Concat und Split etc.
Was ich bis jetzt als Beispiele hier sah, ist eine extreme Verkomplizierung der einfachen Aufgabe.
Bitte nicht in dieser Richtung weitermachen.
Ich mache das wohl besser weiter mit 2 einfachen Funktionen. Eine,die mir aus eine String die entsprechenden Variablen rausschneidet und eine, die es umgekehrt zusammensetzt. Das sind pro Variable 1 bis 2 Zeilen. So ähnlich, wie in dem einen Beispiel vorhin.
Lasst es gut sein. "Mapping", wie ich es mir vorstellte, gibt es nicht als Vereinfachung. Und komplizierter muss es wirklich nicht sein. | |
Re: Stringmapping? Suche Lösung. | | | Autor: Manfred X | Datum: 19.12.16 22:15 |
| Wenn Du das Anwendungsbeispiel genau angeschaut hättest,
wäre Dir klar, daß es sich bei dieser Klasse um eine starke
Vereinfachung der Lösung (im Vergleich zum Mapping) handelt. | |
Re: Stringmapping? Suche Lösung. | | | Autor: Lupus52 | Datum: 19.12.16 23:20 |
| Ich habe mir das Beispiel sehr lange angeschaut und verzweifelt versucht das auch nur annähernd zu verstehen. Tut mir leid - ich habe das nicht kapiert.
Es ist rein codemäßig die 5 bis gar 10 fache Menge meiner alten bekannten Mappinglösung. Und für mich so was von undurchsichtig, dass es mir echt zu viel ist.
Ich bleibe dabei meine Variablen bei Bedarf in einer Funktion zu einem String zusammen zusetzen bzw. umgekeht zu zerlegen. Das ist ein Bruchteil des Aufwandes.
Ich danle dir für die Mühe. Lassen wir es hiermit gut sein. | |
Re: Stringmapping? Suche Lösung. | | | Autor: eierlein | Datum: 20.12.16 12:35 |
| Eine Möglichkeit ist eine Structure zu verwenden.
Beispiel:
Module Module1
Structure x
Dim a As String
Dim b As String
Dim c As String
End Structure
Dim t As x
Sub Main()
t.a = "AA"
t.b = "BB"
t.c = "CC"
Console.WriteLine("t.a = " & t.a)
Console.WriteLine("tmp = " & tmp())
t.b = "xx"
Console.WriteLine("tmp = " & tmp())
t.a = "00"
Console.WriteLine("tmp = " & tmp())
Console.Read()
End Sub
Function tmp() As String
tmp = t.a & t.b & t.c
End Function Oder du verwendest PowerBASIC. Da gibt's FIELD-Strings als Ersatz für die Flexstrings
Übrigens: PowerBASIC PB/Win 9 und PB/CC 5 gibt's seit kurzem kostenlos.
https://shop.powerbasic.com/pages/powerbasic-product-catalog
--- | |
Lösung: Byte-Array | | | Autor: VB3-Guru | Datum: 26.12.16 19:40 |
| Was mit Powerbasic geht, geht auch mit VB6. Meist kriegt man das, was mit VB6 geht, dann auch in .net hin. Du solltest m.E. für den String aus dem Messgerät einfach ein Byte- oder Int32-Array verwenden. Dann geht das genauso, wie du dir das vorstellst. Die 12 Byte sollten ja einfach genug zu handeln sein.
lg, Vb3-Guru | |
Re: Lösung: Byte-Array | | | Autor: Lupus52 | Datum: 27.12.16 00:16 |
| VB3-Guru schrieb:
Zitat: | | Was mit Powerbasic geht, geht auch mit VB6. Meist kriegt man
das, was mit VB6 geht, dann auch in .net hin. Du solltest
m.E. für den String aus dem Messgerät einfach ein Byte- oder
Int32-Array verwenden. Dann geht das genauso, wie du dir das
vorstellst. Die 12 Byte sollten ja einfach genug zu handeln
sein.
lg, Vb3-Guru | |
Danke - habe das per Byte-Array gelöst. Mit 50 Elementen erzeugt und wenn fertig belegt passend runter "geredimmt." | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
sevZIP40 Pro DLL
Zippen und Unzippen wie die Profis!
Mit nur wenigen Zeilen Code statten Sie Ihre Anwendungen ab sofort mit schnellen Zip- und Unzip-Funktionen aus. Hierbei lassen sich entweder einzelnen Dateien oder auch gesamte Ordner zippen bzw. entpacken. Weitere InfosTipp des Monats TOP Entwickler-Paket
TOP-Preis!!
Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR...
Jetzt nur 599,00 EURWeitere Infos
|