Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge

Power++ - Suchen/Ersetzen

Tweety4 / 4 Antworten / Baumansicht 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 „Power++ - Suchen/Ersetzen“
Optionen

Hi!

Ich denke das wichtigste wird die Methode findtext() sein. Kannst du hierzu mal eine Referenz aus der onlinehilfe posten? Die Standarddefinitionen, die ich gefunden habe (on der MSDN-Library) gehen von drei Parametern aus.

Bisher kann ich noch nicht erkennen, wo und wie in findtext() bei dir die Suchrichtung festgelegt wird. Soll das im zweiten Parameter erfolgen, dass du einmal mit TRUE und einmal mit FALSE belegst?
Ich erwarte auch, dass irgendwo eine event->Attribut für die Suchrichtung abgefragt werden muss.

Ich vermute, dass findtext, die Position der gesuchten zeichenkette zurückgibt. Das Ergebnis dürfte >0 sein, wenn die Zeichenkette gefunden wurde.

Du willst offenbar zuerst reagieren, wenn die Zeichenkette nicht gefunden wurde. Dabei soll der Suchbeginn dann mit dem Anfang des zu durchsuchenden Textes belegt werden.

Ich denke, du verwaltest in der globalen Variablen BeginAT die Position, an der die Suche im Text beginnen soll.

der M;ehfachaufruf von findtext() verwirrt mich etwas. Du suchst zuerst mit allen Parametern und direkt danach nur mit dem ersten. Kann es sein, dass dann Standardvorgaben genutzt werden und dabei dann z.B. die Gross/Kleinschreibung immer ignoriert wird, weil das die Voreinstellung ist, wenn man das Parameter nicht angibt?

Mein Vorschlag ist, dass du zuerst einmal die Grundstruktur vereinfachst:

if (event->findNext)
{
suchtext = Suchen_Ersetzen_Dialog_1->GetFindText();
if (event->searchDown)
{
position = Richtextfeld_1->FindText( suchtext, FALSE, ganzwort, grossklein, beginAt );
if (position > 0)
{
// position braucht hier nicht mehr gelesen zuw erden, da es schon bekannt ist.
text_laenge = suchtext.GetLength();
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 {}
} // end of event->searchDown
//Hier dann auf Rückwärtssuche regaieren (searchUP?)
//if (event->searchUP)
//{
// ...
//}
Richtextfeld_1->SetFocus( );
Richtextfeld_1->SetEditSelection( zeichen_index );
}


Bis dann
Andreas

Hier steht was ueber mein altes Hard- und Softwaregedoens.
bei Antwort benachrichtigen
Tweety4 Andreas42 „Hi! Ich denke das wichtigste wird die Methode findtext sein. Kannst du hierzu...“
Optionen

Hi Andreas,
danke, dass du wieder so schnell geantwortet hast. Unten stehend schicke ich dir den Onlinetext. Leider gibt es da nämlich keine seachUp-Funktion. Deshalb dachte ich mit TRUE (Gegenteil von FALSE) zu arbeiten. Aber schau dir erstmal die Hilfe zu FindNext an. Vielleicht ergibt sich daraus ja die Lösung, die ich mal wieder nicht sehe.

Hilfe:
When you display a find dialog box with PromptForFind, the function simply displays the dialog box and returns; it does not wait for the user to enter information into the dialog box. The program does not take action on a user’s search request until the user clicks Find Next in the find dialog box. Similarly, when you display a replace dialog box with PromptForReplace, the function returns immediately and the program does not take action until the user clicks an appropriate button in the dialog box.

When the user clicks a Find or Replace button in a find or replace dialog, it generates a FindReplace event on the dialog box. You can create a FindReplace event handler for the dialog box in the usual way: use the right mouse button to click on the dialog box, click Events, then click FindReplace.
When the FindReplace event handler is invoked, the event argument refers to a WFindReplaceEventData object. This type is derived from the WEventData type. WFindReplaceEventData includes all the data members of WEventData, as well as the following public data members:

WBool findNext;
TRUE if the user clicked the Find Next button in the dialog box. Otherwise, it is FALSE (implying a Replace or ReplaceAll operation).
WBool searchDown;
TRUE if the search should proceed down toward the end of the document and FALSE if the search should proceed up toward the beginning of the document.
WBool matchCase;
TRUE if the search should match the case of letters and FALSE if the search should ignore the case of letters.

WBool wholeWord;
TRUE if the search should match whole words, and FALSE if the search may match strings that are part of larger words.
WBool replaceAll;
TRUE if the user clicked the ReplaceAll button and FALSE otherwise.
WBool replace;
TRUE if the user clicked the Replace button and FALSE otherwise.

You can examine these values to determine what kind of search the user wants. Furthermore, you can examine the dialog object to find out the user’s specified search and/or replacement string.

Bis dann.
Martina

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
Tweety4 Andreas42 „Hi! Ah, SearchDown ist TRUE, wenn eine normale Suche stattfindet 8also von Oben...“
Optionen

Hallo Andreas,

zuerst mal wünsche ich dir frohe Weihnachten. Habe ja schon ewig nichts mehr von mir hören lassen. Sorry. Aber wenn ich abends nach Hause komme fehlt mir mitunter die Power, mein Gehirn noch auf die Programmierung zu konzentrieren.
Also, habe deinen Vorschlag fast erfolgreich umgesetzt. Allerdings bleibt er am ersten gefundenen Wort hängen. Er markiert es und das wars.
Wie bringe ich dem Programm jetzt noch bei, rückwärts zu suchen?

Bis dann
Martina

bei Antwort benachrichtigen