Autor Beitrag
Chiyoko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 298
Erhaltene Danke: 8

Win 98, Win Xp, Win 10
C# / C (VS 2019)
BeitragVerfasst: Do 05.05.11 20:48 
Huhu,

Bisher habe ich alle textboxen einzeln ausgelesen und den Text über
ausblenden C#-Quelltext
1:
2:
txtbox.Select(8,9)
txtbox.Forecolor = Color.Red;


Nun ist man als Programmierer verleitet, nicht tausend Wörter einzeln
zu selektieren...

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
if(panel.Controls.GetType() == typeOf(RichTextBox))
{
   foreach(RichTextBox c in panel.Controls)
   {
      if(c.TextLength > 0)
      {
         int findtext = c.Find("....", <optionen..>);
         c.Selectedtext = "xx"

      }
   }
}


meine Ansaetze funktionieren nicht, ...oder ich hab sie falsch angewendet,
aber auf einen Nenner kann ich lange warten, weiss jemand Rat bitte?
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4807
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 06.05.11 09:14 
Hallo Chivoko,

an deinem unterem Code stimmt so einiges nicht:
- die erste Abfrage wird schon immer 'false' zurückgeben, denn 'panel.Controls' ist ja eine ControlCollection und keine einzelne RichTextBox
- die foreach-Schleife würde nur dann ohne Exception sauber durchlaufen werden, wenn nur RichTextBoxen dadrin vorhanden sind
- die Find()-Methode und 'SelectedText' stehen in keinem Zusammenhang

Richtig wäre die Benutzung von
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
panel.Controls.TypeOf<RichTextBox>(); // TypeOf ist eine Extension-Methode (ab C# 3.0)
// oder
foreach(Control c in panel.Controls)
{
  RichTextBox rtb = c as RichTextBox;
  if(rtb != null)
  {
    // benutze 'rtb'
  }
}

sowie
ausblenden C#-Quelltext
1:
2:
3:
int findtext = c.Find("....", <optionen..>);
c.Select(findtext, findtext+length); // length ist die Länge deines Suchwortes!
c.ForeColor = Color.Red;

(wie du es ja schon in deinem ersten Code geschrieben hast).
Chiyoko Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 298
Erhaltene Danke: 8

Win 98, Win Xp, Win 10
C# / C (VS 2019)
BeitragVerfasst: Fr 06.05.11 18:02 
Wieder was gelernt, danke für die ausführlichen und informativen Ratschläge.
Wobei ich mich aber auch frage, ob das nicht einfach mit GetType ginge?
->Hat sich erledigt, steht ja in der ersten Codezeile:)

Aber immerhin hab ich mein naechstes Problem loesen koennen:
Dabei soll das ganze panel nach Bildboxen durchsucht werden,
da diese ja auch erst zur Laufzeit auftauchen.

Bei Klick auf die Bildbox soll das Bild in die 2te PictureBox
geladen, die sich auf einer Extra Form befindet.
Das ist zwar gegen die regeln des objectorientierten aber
nach dem, was ich so las, nicht anders möglich.
Die Methode des Forms ist public.
Oder gibt es dabei auch noch Möglichkeiten, die ich nicht kenne?

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
void pic_box_event(object sender, EventArgs e)
{
    Form_for_pic pic_box_form = new Form_for_pic();
    foreach(Control c in panel.Controls)
    {
        if(c.Name = "pic_box_name_xx")
           pic_box_form.ShowPicture(global::.....zugriff auf Resources Bilder);
    }
}


EDIT:
Ok, geht doch nicht, er sdurchlaeuft ja staendig alle Controls als PictureBox.
ich brauch allerdings immer nur eine.

EDIT2:
Geht, ich hab einfach return gesetzt, so oeffnet er mir nicht dauernd das
Formular neu.
Chiyoko Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 298
Erhaltene Danke: 8

Win 98, Win Xp, Win 10
C# / C (VS 2019)
BeitragVerfasst: Sa 07.05.11 21:22 
Huhu nochmal, das mit der Textbox klappt vorn und hinten nicht.

Die ganzen Controls werden erkannt,...und auch ausgelesen bzw als Test habe ich die Zeichen gezählt.

Allerdings findet er die Wörter nicht, obwohl vorhanden.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
        private void Text_auslesen_de()
        {
            foreach (Control c in this.pan_3dgstut.Controls)
            {
                RichTextBox rtb = c as RichTextBox;
                if (c != null)
                {
                    if (rtb.Text.Length == 0return;

                    Color color_red = Color.Red;
                    Color color_blue = Color.Blue;
                    Color color_blueViolet = Color.BlueViolet;

                    int startPos = 0;
                    do
                    {
                        startPos = rtb.Find("Werkzeuge", startPos + 9, RichTextBoxFinds.Reverse);
                        rtb.SelectionColor = color_red;

                    } while (startPos != -1);
                }
            }
        }


Ich hab das mal über die erstellung von textboxen im Editor geprueft, da gehts...
(?),...komisch


EDIT: hehe solangsam kommt licht in die Sache, es wird scheinbar immer nur 1 Wort
selectiert....also gehts.Aber Reserve func. nicht.


---

Immer diese kleinen Schusselfehler.Reserve muss weg, dann gehts, aber er
erkennt das erste Wort der ersten textbox nicht, so sah es immer aus, als wenn
er nix findet.
Danke.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4807
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 08.05.11 10:11 
Hallo,

laß mal das "+ 9" bei der Find-Methode weg.
Und addiere diese Zahl nachher nur dann wenn 'startPos != -1' ist.

Selektiert denn die Find-Methode schon selbständig den gefundenen Text (ich selber habe es nicht ausprobiert, daher habe ich gedacht, man muß explizit dann immer noch Select(start, end) aufrufen)?
Chiyoko Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 298
Erhaltene Danke: 8

Win 98, Win Xp, Win 10
C# / C (VS 2019)
BeitragVerfasst: Mo 09.05.11 18:49 
Ja, laut Toolbox selektiert sie angeblich selber, tut es aber nicht.

Egal, aber ein problem bleibt, ich kann startPos nicht auf 0 setzen.
Hast du eine Idee, wie ich jetzt mehrere Wörter suche?
Ich will jetzt nicht ueber 100 Variablen anlegen.
Ein Array waere auch sinnfrei.

ausblenden C#-Quelltext
1:
2:
// Ein Integer wert wird zurueck geliefert, neue Vars setzen`??
startPos = rtb.Find(String[x], startPos + X, RichTextBoxFinds....);
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4807
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 09.05.11 19:40 
Hallo Chiyoko,

warum kannst du startPos nicht auf 0 setzen?

Und was spricht gegen das Array (bzw. eine dynamische List<>)?
Chiyoko Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 298
Erhaltene Danke: 8

Win 98, Win Xp, Win 10
C# / C (VS 2019)
BeitragVerfasst: Mo 09.05.11 19:53 
Mhm, meinste nicht, das es nicht einfacher geht?
Am liebsten waer mir ja eine Methode, die alle Strings auf einmal annimmt:D
Ich kann startPos danach nicht auf 0 setzen, weil er ja weiter sucht(schleife).

Also eine Idee waere noch, die indexof Methode zu verwenden.
Dann abfragen, welcher Index getroffen wurde.

Ansonsten gehts auch mit einer eigenen Methode für Find methode.
Das waer aber alle zu umstaendlich.Ich kann mir nicht vorstellen,
dass ich da 100 Methoden fuer ein par Strings definieren sollte.
Chiyoko Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 298
Erhaltene Danke: 8

Win 98, Win Xp, Win 10
C# / C (VS 2019)
BeitragVerfasst: Do 12.05.11 16:55 
Ok, hab es raus hehe.
Ich packe den String einfach in einer foreach schleife und geh sie
nacheinander durch,...der einzige Nachteil daran:
kommen Wörter mehrfach vor, muesste man das Wort 2 mal in das
String array packen,...das ist nicht unbedingt ein Nachteil aber hast du
dazu vielleicht noch eine Idee?(Oder sonst jemand..?)

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
 private void Text_auslesen_de()
        {
            foreach (Control c in this.panel.Controls)
            {
                RichTextBox rtb = c as RichTextBox;
                if (c != null)
                {
                    if (rtb.Text.Length == 0return;

                    string[] keywords =
                    { "Werk""Werkzeuge"};

                    Color color_red = Color.Red;
                    Color color_blue = Color.Blue;
                    Color color_blueViolet = Color.BlueViolet;

                    int startPos = 0;
                    foreach(string keys in keywords)
                    {
                        // startPos +1, sonst gibt es einen Error 
                       startPos = rtb.Find(keys , startPos + 1, RichTextBoxFinds.WholeWord);
                        if(startPos != -1)
                            rtb.SelectionColor = color_red;
                        else
                            continue;

                    } 
                }
            }
        }
Dr. Hallo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 110
Erhaltene Danke: 13

XP
C/C++/C#
BeitragVerfasst: Fr 13.05.11 00:35 
so vielleicht...

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
foreach(string keys in keywords)
{
    startPos = rtb.Find(keys , 0, RichTextBoxFinds.WholeWord);
    while(startPos > -1)
    {
        rtb.SelectionColor = color_red;
        startPos = rtb.Find(keys , startPos + 1, RichTextBoxFinds.WholeWord);
    }
}
Chiyoko Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 298
Erhaltene Danke: 8

Win 98, Win Xp, Win 10
C# / C (VS 2019)
BeitragVerfasst: Fr 13.05.11 15:29 
Ja, guter Ansatz aber.....

1) mit einer if abfrage ob != -1 ergibt immer eine selektierung
2) mit einer kopfgesteuerten While-schleife laden die Steuerelemente nicht
3) mit einer fussgesteuerten While-schleife weis der nicht, was er selektieren soll.D.h. einige rot gefärbte Woerter sind dann blau(er sprngt sozusagen durch die 3 for ech schleifen)

4) Packe ich alle in eine einzelne Methode, passiert das selbe
5) Eine Farbe reicht mir nicht und eine Namensabfrage wäre sinnlos
6...nun faellt mir nichts mehr ein:D, aber danke fuer die Anregung.
Chiyoko Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 298
Erhaltene Danke: 8

Win 98, Win Xp, Win 10
C# / C (VS 2019)
BeitragVerfasst: So 15.05.11 17:54 
Irgendwie verschliesst sich mir da jegliche Logik.
Normalerweise und laut Debugger findet eine strikte Abarbeitung des Codes statt.

Es sieht so aus, als wenn 2 Textarrays vertauscht werden.
Oder die Farbe zufaellig gesetzt wird.Gewisse Wörter die rot sein sollten, sind dann blau und umgekehrt.

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
 
  private void Text_auslesen_de()
        {
            foreach (Control c in this.pan_3dgstut.Controls)
            {
                RichTextBox rtb = c as RichTextBox;
                if (rtb != null)
                {
                    if (rtb.Text.Length == 0return;

                    #region Key text

                    // Rote Farbe
                    string[] keywords1 = new string[] 
                    {
                         "Werkzeuge:","Video erstellen:","Sortierfehler:","Arbeitsschritte:","Schritt:""Schritt a:","Schritt b:",
                         "Schritt c:""Schritt d:","Wert:""Werte:"
                    };

                    // Blaue Farbe
                    string[] codewords = new string[] 
                    {
                        "d3d_triplebuffer","d3d_antialias","d3d_anisotropy","mouse_mode","d3d_lightres","d3d_entsort""tex_cycles"
                    };

                    // BlueViolet Farbe
                    string[] keywords2 = new string[] 
                    {
                        "Bittiefe:""DDS:","BMP:","PCX:""TGA:""JPG:","WAD:""Dateiname:","Quality:","Videocodec:","Audiocodec:"
                    };

                    #endregion

                    int startPos = 0;
                    do
                    {
                        foreach (string keys1 in keywords2)
                        {
                            startPos = rtb.Find(keys1, startPos + 1, RichTextBoxFinds.WholeWord);
                            rtb.SelectionColor = Color.BlueViolet;
                        }
                        foreach (string keys2 in keywords1)
                        {
                            startPos = rtb.Find(keys2, startPos + 1, RichTextBoxFinds.WholeWord);
                            rtb.SelectionColor = Color.Red;
                            rtb.SelectionFont = new Font("Arial"12, FontStyle.Bold);
                        }
                        foreach (string keys3 in codewords)
                        {
                            startPos = rtb.Find(keys3, startPos + 1, RichTextBoxFinds.WholeWord);
                            rtb.SelectionColor = Color.Blue;
                        }
                    }
                    while (startPos != -1);
                }
            }
        }


EDIT:
So, in einem anderem Forum, das ich auch intensiv als Suche nutze, hab ich erfahren,
dass es doch daran liegt, den selektierten Text richtig abzufangen.
Ich teste weiter.

So,...habs raus, ich muss selektioncolor in eine if abfrage packen, dann geht es.
thread kann geclosed werden.Danke.
Chiyoko Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 298
Erhaltene Danke: 8

Win 98, Win Xp, Win 10
C# / C (VS 2019)
BeitragVerfasst: Mo 16.05.11 16:37 
Nein, geht immernoch nicht,...das ist zum verzweifeln, wie man es
dreht und wendet, es geht nicht.

Weiterhin durchsucht er auch nicht mehrfach, trotz continue in der Schleife,
hab wohl einen Denkfehler im Code.
Zum testen nahm ich nochmal einzelne Textboxen.

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
private void Text_auslesen_de()
        {
            foreach (Control c in this.Controls)
            {
                RichTextBox rtb = c as RichTextBox;
                if (rtb != null)
                {
                    if (rtb.Text.Length == 0return;

                    string[] red = new string[] {
                        "Werkzeuge","Tools:","Weiter"
                    };
                    int startPos = 0;

                    while (startPos != -1)
                    {
                        foreach (string key1 in red)
                        {
                            if (startPos >= 0)
                            {
                                startPos = rtb.Find(key1, startPos, RichTextBoxFinds.None);
                                rtb.SelectionColor = Color.Red;
                                MessageBox.Show("Wort: " + key1 + "\nStartwert: " + startPos.ToString());
                            }
                            else
                                continue;
                        }
                    }
                }
            } 
        }
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4807
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 16.05.11 18:42 
Hallo Chiyoko,

du sollst auch nicht einfach irgendwie den Quellcode ändern, bis es mal zufälligerweise läuft (sondern nachdenken ;-) )...

Du hast deine beiden Schleifen falschherum verschachtelt!

In der äußeren Schleife mußt du dein Wort-Array durchlaufen und in der inneren Schleife suchst du solange nach dem aktuellen Wort, bis Find einen negativen Wert (-1) zurückgibt:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
foreach (string key1 in red)
{
   int startPos = 0;

   while (startPos >= 0)
   {
      startPos = rtb.Find(key1, startPos, RichTextBoxFinds.None);
      if (startPos >= 0)
      {
          rtb.SelectionColor = Color.Red;
          startPos += key1.Length;
      }
   }
}

(ich habe diesen Code aber nur hier im Forum so runtergeschrieben, ohne ihn konkret getestet zu haben ;-))

Für diesen Beitrag haben gedankt: Chiyoko
Chiyoko Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 298
Erhaltene Danke: 8

Win 98, Win Xp, Win 10
C# / C (VS 2019)
BeitragVerfasst: Mo 16.05.11 19:17 
Nunja, fuer dich ist bzw mag das gleich alles logisch sein, wenn ich aber anfange zu
überlegen, brauch ich zu lange oder verlier mich in Gedanken.
Ich bin der visuelle Typ und muss ausprobieren sonst erreich ich nichts in absehbarerer
Zeit, wenn auch mir die Bedeutung und vorgehensweise aller controls bekannt ist.

Aber man lernt ja dazu^^...

Und danke, funktioniert.

Jetzt nur noch das Farben problem,...mehr farben zu nutzen, ich muss irgendwie
den text deselektieren und die Farbe wieder auf default stellen.
Dr. Hallo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 110
Erhaltene Danke: 13

XP
C/C++/C#
BeitragVerfasst: Di 17.05.11 00:19 
Pack doch den obigen Code in eine Funktion und übergib das string-array und die farbe z.B so irgenwie...

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
void highlight(string[] keys, Color color)
{
    foreach (string key in keys)
    {
        int pos = 0;
     
        while (pos >= 0)
        {
            pos = rtb.Find(key, pos, RichTextBoxFinds.None);
            if (pos >= 0)
            {
                rtb.SelectionColor = color;
                pos += key.Length;
            }
        }
    }
}


UND dann in deiner Controls schleife 3xAufrufen...
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
...
highlight(keywords1 , Color.Red);
highlight(codewords, Color.Blue);
highlight(keywords2 , Color.Green);
...
Dr. Hallo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 110
Erhaltene Danke: 13

XP
C/C++/C#
BeitragVerfasst: Di 17.05.11 00:23 
hoppla, ich seh grad das rtb musst du dann auch noch an die Funktion übergeben.

ausblenden C#-Quelltext
1:
void highlight(string[] keys, Color color, RichTextBox rtb)					


naja..
Chiyoko Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 298
Erhaltene Danke: 8

Win 98, Win Xp, Win 10
C# / C (VS 2019)
BeitragVerfasst: Di 17.05.11 15:14 
Danke, das reduziert meinen Code auf ein minimum aber das Problem wird trotzdem nicht geloest.
Es wird jeweils nur ein Wert aus dem String array selektiert, aber durchgehend alle in der Textbox.

D.h. Werkzeuge x 5 >alle rot.Das nächste Wort gibt -1 zurueck.
Beim nächsten einfärben wird nur ein Wort selektiert und rot eingefärbt.

Ich denke mal, die Schleife müsste danach nochmal durchsucht werden...
bzw das String array.


EDIT: Nein es ist ganz und gar nicht geloest, wieso schreibst du sowas Th69???
Zumal ich da genauso unterwegs bin wie auch hier...
Dr. Hallo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 110
Erhaltene Danke: 13

XP
C/C++/C#
BeitragVerfasst: Mi 18.05.11 00:56 
Ich hab mir den spass gemacht und das etwas optimiert. Bei mir funktioniert das so jetzt...

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
Color[] colors = new Color[] { Color.Red, Color.Blue, Color.Green };
string[][] words = 
{
    new string[]{"Werkzeuge:","Video erstellen:","Sortierfehler:","Arbeitsschritte:","Schritt:""Schritt a:","Schritt b:""Schritt c:""Schritt d:","Wert:""Werte:"},
    new string[]{"d3d_triplebuffer","d3d_antialias","d3d_anisotropy","mouse_mode","d3d_lightres","d3d_entsort""tex_cycles"},
    new string[]{"Bittiefe:""DDS:","BMP:","PCX:""TGA:""JPG:","WAD:""Dateiname:","Quality:","Videocodec:","Audiocodec:"}
};

private void Text_auslesen_de()
{
    foreach (Control c in this.Controls)
    {
        RichTextBox rtb = c as RichTextBox;
        if (rtb != null && rtb.Text.Length != 0)
        {
            for (int i = 0; i < words.GetLength(0); i++)
            {
                int pos = 0;
                foreach (string keys in words[i])
                {
                    pos = rtb.Find(keys, 0, RichTextBoxFinds.WholeWord);
                    while (pos > -1)
                    {
                        rtb.SelectionColor = colors[i];
                        pos = rtb.Find(keys, pos + 1, RichTextBoxFinds.WholeWord);
                    }
                }
            }
        }
    }
}

Für diesen Beitrag haben gedankt: Chiyoko
Chiyoko Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 298
Erhaltene Danke: 8

Win 98, Win Xp, Win 10
C# / C (VS 2019)
BeitragVerfasst: Mi 18.05.11 09:36 
Herzlichen Dank, es funktioniert:)