vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Erstellen von dynamischen Kontextmen?s - wann immer Sie sie brauchen!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Stringmapping? 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$$
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
  
  
---
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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."
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel