florengray
Goto Top

Farbe von String ändern

Hallo,
beschäftige mich gerade damit VB Express zu erlernen.
Problem:
Ich habe Daten in einem String, die ich auf Fehler überprüfe.
Wenn ich per If dann zu so einem Fehler gekommen bin, soll das Zeichen, dann durch ein "#" ersetzt wird und dass soll dann auch Rot erscheinen.
Das heißt, ich will eine sonst schwarze Zeichenkette mit roten "#" spicken, wenn dort Fehler drin sind.
Die Variable die noch andere Zeichen enthält wird immer durch += erweitert.

Zuletzt wird dass dann in einer RTB angezeigt.
Ist das Möglich?
Ach ja, ich will nicht die Farbe in einer TextBox oder so ändern!
Die Fehelrroutine befindet sich in einem Public Modul welches ich von einer Form aus aufrufe.


Hoffe ihr könnt mir helfen.

(Ist ein Programm für Genetik)

Content-ID: 86878

Url: https://administrator.de/contentid/86878

Ausgedruckt am: 25.11.2024 um 08:11 Uhr

miniversum
miniversum 03.05.2008 um 10:08:21 Uhr
Goto Top
Verstehe ich das richtig das du einen Text in einer Variabeln vom Typ String einfärben willst? Das geh so nicht. Du könntest entweder eindeutige Markierungen an den stellen setzen. Wenn das # z.B. nicht sonst in dem Text vorkommt dan kans tdu das ja einsetzen. Diese Variable kanst du ja weiterhin mit + dann erweitern wie du möchtest. Bei der ausgabe must du dan einen Filer drüber laufen lassen der dier die ganzten # dann halt rot einfärbt.
florengray
florengray 03.05.2008 um 13:34:15 Uhr
Goto Top
Hallo,
ja so hast du das richtig verstanden.
Mal ein Beispiel:
DNA Sequenz mit Fehlern: TACGACGT?TACA?ACTA??G
So, die ? können nicht übersetzt werden. Sind durch Mutationen hervorgerufen worden.
Die will ich jetzt aber in meiner Überstzung speziell einfärben lassen.
Übersetzung dazu: AUGCUGCA#AUGU#UGAU##C
Dabei soll jedes # den Fehler anzeigen und rot erscheinen.
Das wollte ich gleich in dem Modul machen lassen, aber das scheint ja so nicht zu gehen.
Das mit dem Filter kannte ich noch nicht.
Wie geht das?
Könnte man das dann so machen, dass der Filter den Ausgabe String (Übersetzung) durchscannt und alle # rot färbt? Das wäre super!
Es wäre aber auch möglich, wenn der Filter mir dann die RTB scannen würde.
(Wäre für mich aber noch ein wenig umständlicher)

Schönen Tag noch!

florengray
miniversum
miniversum 03.05.2008 um 14:09:47 Uhr
Goto Top
Den Filter müßtest du halt selbst schreiben.
Wenn du den String in die RTB schreibst mußt du danach einfach den Text nochmal durchlaufen, und die # markieren (geht über RTB.SelectedRtf). Danach kannst du dieses Zeichen einfärben mit
RTB.SelectionColor = Color.Red
Genaueres zum .SelectedRtf must du in der Hilfe nachschauen weil ichd as auch nur einmal gebraucht habe bisher und ich hier grade nicht nachschauen kann.
Im Prinzip halt die Teile des Textes in der RTB markieren und dann die Farbe wie beschrieben ändern.
florengray
florengray 03.05.2008 um 16:55:51 Uhr
Goto Top
Hallo,
wenn das geht wäre das echt super.
Werd ich mal ausprobieren.
Vielen Dank!

:edit
Habe ich ausprobiert.

RichTextBox1.Text = F_Output_DNA
RichTextBox1.Find("#")
RichTextBox1.SelectionColor = Color.Red

Damit wird aber nur das erste Zeichen rot gefärbt und die anderen vernachlässigt.
Hab schon gesucht, aber ich weiss jetzt nicht, was ich machen soll, damit der mir alle Fehler markiert.
miniversum
miniversum 03.05.2008 um 18:29:29 Uhr
Goto Top
So sollte es gehen:
RichTextBox1.Text = F_Output_DNA
pos = 0
Do
    pos = RichTextBox1.Find("#", pos + 1, RichTextBoxFinds.MatchCase)  
    RichTextBox1.SelectionColor = Color.Red
    MsgBox(pos)
Loop While pos > 0
Er geht den ganzen String durch, sucht nach den "#", färbt dieses Zeichen ein und sucht dann weiter. Solange bis der String einmal durchsucht wurde.
florengray
florengray 03.05.2008 um 18:59:51 Uhr
Goto Top
Hallo,
es funktioniert wirklich!
Dankeschön!

Hab nur das pos=0 in Dim pos = 0 umgewandelt.
Wäre noch super, wenn ich den Code auch verstehen würde.

Also:
Eine Do While Schleife
Tue solange pos > 0 ist folgendes:
pos ist = die Position von dem jetziges Zeichen was gescannt wird
Und suche in RTB1 nach "#", wobei die var pos pro Durchlauf um 1 erhöht wird und ???

Das mit dem Match Case habe ich nicht verstanden.
Könntest du mir noch sagen, was das ist?

Ansonsten vielen Dank dafür.
miniversum
miniversum 03.05.2008 um 19:23:58 Uhr
Goto Top
Das ganze war als Teil des Codes gedacht. Drum fehlt das dim pos.

Das ganze funktioniert nicht ganz so. Es wird nicht jedes einzelne Zeichen durchgegangen und verglichen, sondern:
pos = RichTextBox1.Find("#", pos + 1, RichTextBoxFinds.MatchCase)
Es wird die erste Position, nach pos+1, gesucht ander ein # steht. Diese Position wird wieder in pos gespeichert. Außerdem gilt dieses Zeichen dann als Selection.
Danach wird eben für dieses zeichen die Farbe verändert.
Danach wird ab dieser Position weiter gesucht wo das nächste mal ein # steht. Das ganze läuft so lange bis eben einmal der Ganze String in der RichTextBox1 durchsucht wurde. Dann liefert das find als position eine -1 zurück und die Schleife bricht ab.
Das MsgBox kannst du natürlich rausnehmen. Das war nur zur Anschauung drin. Es sollte dir die Position anzeigen ander sich jeweils die # befinden.
Das MatchCase brauchst du eigentlich garnicht umbedingt. Dieser Parameter ist optional. Allerdings gibt es mehrere Überladungen von Fin und daher kanns sein das die Falsche ausgewählt wird ohne diesen Parameter.
florengray
florengray 03.05.2008 um 19:50:03 Uhr
Goto Top
Danke für die Erklärung!

Habe aber jetzt noch ein Problem.
Ich habe die versch. Strings, nach denen gesucht werden soll in Arrays gespeichert.
z.B. xyz(0) = ACT xyz(1) = TTG
Das wird in einem anderen Form von einem Benutzer eingegeben und dann halt eben in diesen Arrays gespeichert.
Wenn ich dann in diesem Form eine For laufen lassen zeigt die mir in einer MsgBox alle Inhalte an, die ich vorher in den Arrays speichern lies. (Das ist nur zum Fehler suchen)
In einem anderen Modul habe ich dieses xyz() as Public und als String deklariert, damit andere Funktionen darauf noch zugreifen können.
Wenn ich jetzt z.B. deinen Code dazu verwende, um nach den Strings zu suchen, lasse ich wieder eine For laufen und habe statt des "#" die xyz(a) stehen wobei das a in der For mit einer Zahl gefüllt wird. Dann müsste ja z.B. ACT bei xyz(1) wieder erscheinen.
Der gibt mir aber Fehlermeldungen zurück.
Ich habe soweit rausgefunden, das ich zwar in dem anderen Modul wo die Arrays festgelegt werden, die Arrays auch anzeigen lassen kann aber sobald ich das Modul verlasse und mir die Inhalte wann anders anzeigen lassen möchte sind die Arrays alle Leer???????
Und das gibt den Fehler.
Frage: Warum sind die Arrays alle leer? Habe sie doch als Public deklariert?
Public xyz() As String

:edit

ReDim Preserve Erw_Bear_Opt_find_mark(tmp_4)

Das ist auch eine Zeile aus dem Form, wo der Benutzer seine Suchstrings eingibt.
Da steht aber ein Re-DIM-Preserve drin !!
Das wird wohl der Fehler sein.Aber wie krieg ich das behoben?
miniversum
miniversum 03.05.2008 um 20:04:37 Uhr
Goto Top
Ich denke es wäre gut wen du dafür ein extra posting aufmachen würdest weil es mit der eigentlichen Frage ja nichts mehr zu tun hat.

Und ich verstehs ncith ganz. Du hast in einem Modul das array als public deklariert udn willst in in einem andern nutzen oder wie?
florengray
florengray 03.05.2008 um 20:14:45 Uhr
Goto Top
Ok neuer Post: Arrays an andere Form übergeben