Programmieren - alles kontrollieren 4.939 Themen, 20.671 Beiträge

Power++ - Suchen/Ersetzen

Tweety4 / 4 Antworten / Flachansicht Nickles

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;
}

bei Antwort benachrichtigen
Andreas42 Tweety4 „Hi Andreas, danke, dass du wieder so schnell geantwortet hast. Unten stehend...“
Optionen

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

Hier steht was ueber mein altes Hard- und Softwaregedoens.
bei Antwort benachrichtigen