FindDialogFind - leider nicht als Wortbestandteil
-
"est" wird gefunden, aber nicht als Bestandteil von T"est"wort. Die Commandozeile:
RichEdit->Txt->FindText(FindDialog->FindText, StartPos, ToEnd , TSearchTypes()<< 0);
Die 0-Zuweisung an TSearchTypes könnte falsch sein. Aber ich will ja keins der beiden Flags setzen. Nur durch die Auswahl im Dialog soll die Suche eingeschränkt werden. Wie müßte ich richtig schreiben?
-
versuch's mal so:
TSearchTypes() >> stWholeWord >> stMatchCase
-
Jau, der Weg, damit alles geht, wär schon mal der wichtigste.
Gemein ist nur, jetzt hat das Anhaken der Optionen "Als Wort", "Groß-und Kleinschreibung" keine Wirkung. Es sollte doch einen Weg geben, daß alles machbar ist. Erst mal rein ins Suchvernügen mit allen Möglichkeiten. Bei Bedarf kann man dann einschränken. Diese Flagsetzung find ich einfach nicht. Ich kann doch den Code nicht austauschen, während das Teilchen benutzt wird.
-
Sieh FAQ, "Umgang mit Set".
Wenn du von den Eigenschaften des Dialogs ausgehen willst musst du auch diese als Grundlage benutzen und nicht das abstrakte TSearchTypes() benutzen.
-
Dank dir @Jansen, da wär ich nicht drauf gekommen. Hab aber jetzt durch Spielen rausgefunden, die Options sind ja bool. Also kann ich die aktuell gewählten Optionen abfragen. Vielleicht nicht elegant, aber hier eine der 4 möglichen Zeilen:
if (FindDialog->Options.Contains(frWholeWord)==false && FindDialog->Options.Contains(frMatchCase)) FoundAt = Txt->FindText(FindDialog->FindText, StartPos, ToEnd , TSearchTypes()>> stWholeWord << stMatchCase);
Immerhin, das Prob wär *eeendlich* nach vielem immer wieder Probieren gelöst.
Bleibt nur noch die Rückwärts-Suche. Sollte irgendwie mit SelStart-- (erst mal über den Suchstring hinweg) oder so ähnlich realisierbar sein. Muß mal mit Ruhe Tüfteln.
-
Wozu denn die if-Abfragen? Benutz' einfach FindDialog->Options selbst als entsprechendes Argument für FindText().
Und die Rückwärtssuche kannst du bequem per ">> frDown" bzw. über den entsprechenden RadioButton im FindDialog einstellen.
-
*Uff*, ich versteh, was du meinst, aber ich bring die Syntax nicht zusammen. Auf die TSearchTypes() schein ich nicht verzichten zu können. Hier seh ich den Weg nicht.
Zur Rückwärtssuche kann ich ihn gar nicht bewegen, wenn der RadioButton gewechselt wird. Eine Kostprobe zum Schmunzeln (eine echte Verzweiflungstat, die nur beschreibt, was der User tut):
if (FindDialog->Options.Contains(!frDown)) FindDialog->Options.Contains(frDown)==false; else FindDialog->Options.Contains(frDown)==true;
-
FoundAt = Txt->FindText(FindDialog->FindText, StartPos, ToEnd, FindDialog->Options);
Für die Rückwärtssuche musst du vor dem Aufruf der obigen Zeile entweder den entsprechenden RadioButton gesetzt oder die Option per Code umgeschaltet haben:
FindDialog->Option = FindDialog->Options >> frDown;
Alles ungetestet, habe grad nichts BCB-artiges zur Hand.
-
So sollte die logische Schreibweise sein. Die Options werden ja zur Laufzeit gesetzt. Leider bekomm ich nur die Fehlermeldung:
[C++Fehler] NoteChild.cpp(211): Cannot convert 'System::SetDialogs::TFindOption,0,12' to 'System::SetComctrls::TSearchType,0,1'.
[C++Fehler] NoteChild.cpp(211): Type mismatch in parameter 'Options' in call to '_fastcall Comctrls::TCustomRichEdit::FindTextA(const System::AnsiString,int,int,System::SetComctrls::TSearchType,0,1 )'.FindDialog->Options = FindDialog->Options >> frDown;
ist der Default. Ich kann es auch nicht ändern. In der Schreibweise gelingt kein bool (Fehlermeldung). ...Options >> !frDown; bleibt ohne Wirkung.
if (FindDialog->Options.Contains(frDown)==false) ShowMessage("ist false");
bringt die Message, wenn ich den Up-Button auswähl. Trotzdem bleibt die Suchrichtung ToEnd.
Auch wenn ich alle Options im Objektinspector auf false setz, ist die Suchrichtung in jedem Fall abwärts, egal, was ich wähl. Obwohl nun der Up-Button per default gecheckt ist.
-
Beim BCB ist auch ein Beispiel dabei.
Unter BCB\Examples\Apps\FindRep findest du es.
-
Oh *ich goofy*
. Die Help-Beispiele sind so umfangreich, daß ich bei den Examples gar nicht geschaut hab. Schwerer Fehler, denn da ist die Aufgabe richtig gelöst. Total elegant.
Aufwärts saust die Suche aber ohne Ergebnis bis zum Textanfang durch. Hab expirimentiert, das dürfte in der Komponente implementiert sein. (Wordpad drückt sich ganz davor *grins*). Ich kann also die Suche noch mal von vorn beginnen lassen oder die Option Hide setzen. Das muß OK sein, da ich noch nicht so weit bin, Komponenten zu entwickeln. Kommt noch. :p
Ich dank euch sehr, wieder eine kleine Odyssee bis zu den Galliern durchgeboxt. :p