Hallo
brauche schon wieder Hilfe. Habe mit nachfolgendem Programmteil ein Problem. Es läuft nicht so wie es soll. Beim Suchen mit der Option "Groß-/Kleinschreibung beachten" reagiert es nicht und beim Aktivieren von "nach oben" soll es von einer beliebigen Textposition aus nach oben suchen. Beim Erreichen soll es wieder von hinten anfangen zu suchen.
Was muss noch rein, damit das Programm dies alles bewerkstelligt?
Kann mir hier jemand helfen?
WBool Form1::Suchen_Ersetzen_Dialog_1_FindReplace(
WObject * source,
WFindReplaceEventData * event )
{
WLong position;
WString suchtext;
WRange zeichen_index;
WLong text_laenge;
WBool ganzwort, grossklein;
ganzwort = event->wholeWord;
grossklein = event->matchCase;
if (event->findNext)
{
suchtext = Suchen_Ersetzen_Dialog_1->GetFindText();
if (event->searchDown)
{
position = Richtextfeld_1->FindText( suchtext, FALSE, ganzwort, grossklein, beginAt );
if (position {
position = Richtextfeld_1->FindText(suchtext);
}
text_laenge = suchtext.GetLength();
zeichen_index.start = position;
zeichen_index.end = position + text_laenge;
beginAt = zeichen_index.end;
Richtextfeld_1->SetFocus( );
Richtextfeld_1->SetEditSelection( zeichen_index );
}
else
{}
if (event->searchDown)
{
position = Richtextfeld_1->FindText (suchtext, TRUE, ganzwort, grossklein, position);
if (position > 0)
{
position = Richtextfeld_1->FindText (suchtext);
}
text_laenge = suchtext.GetLength();
zeichen_index.start = position;
zeichen_index.end = position - text_laenge;
beginAt = zeichen_index.end;
Richtextfeld_1->SetFocus( );
Richtextfeld_1->SetEditSelection( zeichen_index );
}
else
{}
}
return FALSE;
}
Programmieren - alles kontrollieren 4.939 Themen, 20.671 Beiträge
Hi!
Ah, SearchDown ist TRUE, wenn eine normale Suche stattfindet 8also von Oben nahc Unten) und FALSE, wenn die Suche umgekehrt stattfindet (also von Unten nach Oben).
Damit wäre ein (event->searchdown == FALSE) die Bedingung für ein "searchUP".
Trotzdem ist das nur die Referenz der Attribute die zum WEventData Typ hinzugekommen sind. damit kann man dann im Nachhinein auswerten, was der User im Finden/Ersetzen-Dialog ausgewählt hat.
Mir fehlt noch die Erklärung der hier möglichen Parameter (und ihre Bedeutung): FindText( suchtext, FALSE, ganzwort, grossklein, beginAt )
Klar, man kann es zum Teil erraten:
- suchtext: ist der String der durchsucht werden soll
- FALSE: da suche ich die Bedeutung
- ganzwort: Offenbar TRUE, wenn nach ganzen Wörtern gesucht wird
- grossklein: offenbar die Steuerung ob Gross/Kleinschreibung berücksichtigt wird
- beginAt: offenbar die Startposition in suchtext, ab der gesucht wird
Denkbar, dass das zweite Parameter die Suchrichtung festlegt. Also wäre FALSE die UP-Suche und TRUE dann DOWN.
OK, neue Version: ;-)
if (event->findNext)
{
suchtext = Suchen_Ersetzen_Dialog_1->GetFindText();
if (event->searchDown)
{
position = Richtextfeld_1->FindText( suchtext, TRUE, ganzwort, grossklein, beginAt ); //2. Parameter geändert in TRUE
if (position > 0)
{
// position braucht hier nicht mehr gelesen zu werden, da es schon bekannt ist.
text_laenge = suchtext.GetLength();
// Den Bereich festlegen, der markiert werden soll:
zeichen_index.start = position;
zeichen_index.end = position + text_laenge;
//Hier fehlt noch die Prüfung, ob das Ende des Textes überschritten wurde!
beginAt = zeichen_index.end;
{
else // postion {
// Hier kann der Wrap, also der Umlauf erfolgen.
}
} // end of event->searchDown
if (event->searchDown==FALSE) //um es deutlich zu machen: die andere Richtung ist dran ;-)
{
position = Richtextfeld_1->FindText( suchtext, FALSE, ganzwort, grossklein, beginAt );
if (position > 0)
{
// position braucht hier nicht mehr gelesen zu werden, da es schon bekannt ist.
text_laenge = suchtext.GetLength();
// Den Bereich festlegen, der markiert werden soll:
zeichen_index.start = position;
zeichen_index.end = position + text_laenge;
//Hier fehlt noch die Prüfung, ob das Anfang des Textes überschritten wurde!
beginAt = position - 1; // Hier muss geprüft werden, dass beginAt immer >0 ist; ich tippe sonst gibt's Probleme...
{
else // postion {
//Hier kann der "Wrap", also der Umlauf erfolgen.
}
} // end of (event->searchDown==FALSE)
Richtextfeld_1->SetFocus( );
Richtextfeld_1->SetEditSelection( zeichen_index );
}
Das Ausprobieren und Debuggen/Tippfehlerkorrigieren überlasse ich wieder dir - nett wie ich bin. ;-)
Bis dann
Andreas