Wie benutzt man die Methode FindText?
-
hiho
also bei mir sieht das so aus
http://www.file-upload.net/download-375967/help.bmp.html
bei dir auch?
mfg allison
-
Nein, bei siehts so aus:
http://img404.imageshack.us/my.php?image=help2ay5.gif
-
Hallo
Um es kurz zu machen, hier die entsprechenden Hilfeauszüge
Mit Hilfe von FindText kann in einem Textbereich eines RichText-Steuerelements nach dem im Parameter SearchStr angegebenen String gesucht werden. Nur der Text in dem Bereich, der mit StartPos beginnt und dessen Länge im Parameter Length festgelegt ist, wird durchsucht. Mit Options kann festgelegt werden, ob nur nach ganzen Wörtern gesucht oder die Groß-/Kleinschreibung berücksichtigt werden soll. FindText liefert die Position des Such-Strings, wobei 0 die Position des ersten Zeichens im RichText-Steuerelement (im Gegensatz zur ersten Position im Suchbereich) angibt. Wenn der Such-String im angegebenen Bereich nicht vorhanden ist, gibt FindText -1 zurück.
Verwenden Sie FindText anstatt mit Programmanweisungen den Text des Steuerelements zu durchsuchen, da Sie auf diese Weise verhindern, daß die Operation durch codierte RichText-Attribute fehlschlägt.
Und noch das Beispiel
//Für dieses Beispiel werden drei Objekte benötigt: TRichEdit, TButton und //TFindDialog. //Nach einem Klick auf die Schaltfläche wird rechts vom Eingabefeld ein //Dialogfeld Suchen angezeigt. Wenn nun ein Suchtext eingegeben und die Suche //gestartet wird, erhält der erste passende String nach der aktuellen //Cursorposition im RTF-Eingabefeld eine Markierung. void __fastcall TForm1::Button1Click(TObject *Sender) { FindDialog1->Position = Point(RichEdit1->Left + RichEdit1->Width, RichEdit1->Top); FindDialog1->Execute(); } void __fastcall TForm1::FindDialog1Find(TObject *Sender) { int FoundAt, StartPos, ToEnd; // Suche hinter aktueller Markierung beginnen (falls vorhanden). // Andernfalls am Textanfang starten. if (RichEdit1->SelLength) StartPos = RichEdit1->SelStart + RichEdit1->SelLength; else StartPos = 0; // ToEnd ist die Länge von StartPos // bis zum Textende in Steuerelement. ToEnd = RichEdit1->Text.Length() - StartPos; FoundAt = RichEdit1->FindText(FindDialog1->FindText, StartPos, ToEnd, TSearchTypes()<< stMatchCase); if (FoundAt != -1) { RichEdit1->SetFocus(); RichEdit1->SelStart = FoundAt; RichEdit1->SelLength = FindDialog1->FindText.Length(); } }Damit sollte der Einsatz der Funktion klar sein.
bis bald
akari
-
Hallo,
ich glaub es wäre besser mal weiter auf das Problem einzugehen, als Bilder eurer Hilfen hin und her zu schieben :P!
Die BCB6-Hilfe sagt folgendes:
enum TSearchType { stWholeWord, stMatchCase };
typedef Set<TSearchType, stWholeWord, stMatchCase> TSearchTypes;
int __fastcall FindText(const AnsiString SearchStr, int StartPos, int Length, TSearchTypes Options);
Das Beispiel dazu:
int FoundAt, StartPos, ToEnd; StartPos = 0; // ToEnd is the length from StartPos // to the end of the text in the rich edit control ToEnd = RichEdit1->Text.Length() - StartPos; FoundAt = RichEdit1->FindText("Der Text nachdem gesucht werden soll", StartPos, ToEnd, TSearchTypes()<< stMatchCase);mfg, Micha!
Edit: hmmpf zu langsam

-
Ok das funktioniert soweit Danke!
Edit: Doch nicht!
Hier der Gesamte Codevoid __fastcall TForm2::FormCreate(TObject *Sender) { Sicher = false; vorhanden = false; RichEdit2->Lines->LoadFromFile (pfad_rezeptedb); } //----------------------------------------------------- void __fastcall TForm2::Button1Click(TObject *Sender) { int StartPos = 0; int ToEnd = RichEdit2->Text.Length() - StartPos; vorhanden = RichEdit2->FindText(Edit1->Text), StartPos, ToEnd, TSearchTypes()<<stWholeWord <<stMatchCase); if (vorhanden) { Application->MessageBox("Rezeptname bereits vorhanden!","Achtung",0); } if ((Edit1->Text == "") && (ComboBox1->Text != "Rubrik wählen") && (!vorhanden)) { RichEdit2->Lines->Add(Edit1->Text); RichEdit2->Lines->SaveToFile (pfad_rezeptedb); RichEdit1->Lines->SaveToFile (pfad_rezepte + Edit1->Text + ".txt"); Sicher = true; } if ((!Sicher) && (!vorhanden)) { Application->MessageBox (Bitte Alles ausfüllen!","Achtung",0); } }So, in der rezeptedb ist bereits enthalten "Test" und "o"
(Ich weiß keine guten Testbegriffe, aber so ist es halt)
Wenn ich jetzt noch mal "o" eingebe, sagt er "Bereits vorhanden" ->gut so!
Wenn ich jetzt noch mal "Test" eingebe, fügt er es trotzdem hinzu ->nicht gut!
auch wenn ich einen neuen Titel eingebe z.B "Test2", sagt er "Bereits vorhanden" -> nicht gut!Erkennt jemand das Problem?
-
selbst wenn ich die rezepteliste komplett entleere, sagt er "Bereits vorhanden!"
-
Hallo
vorhanden = RichEdit2->FindText(Edit1->Text), StartPos, ToEnd, TSearchTypes()<<stWholeWord <<stMatchCase); // was macht die Klammer hinter Edit1->Text???FindText liefert die Position des Such-Strings, wobei 0 die Position des ersten Zeichens im RichText-Steuerelement (im Gegensatz zur ersten Position im Suchbereich) angibt. Wenn der Such-String im angegebenen Bereich nicht vorhanden ist, gibt FindText -1 zurück.
vorhanden ist in deinem Fall ein bool. Alles was vorhanden != 0 ist, ist wahr (also true)
... vielleicht findest du den Fehler jetzt selber ...
mfg, Micha
Edit: keine leichte Sache mit der Rechtschreibung
-
Ja Problem erkannt, aber das will immer noch nicht!
ich hab jetzt:
int zahl=0; zahl = RichEdit2->FindText(Edit1->Text, StartPos, ToEnd, TSearchTypes()<<stWohleWord<<stMatchCase); if (zahl !=0) vorhanden = true; if (vorhanden) Label1->Caption = "vorhanden"; if (!vorhanden) Label1->Caption = "nicht vorhanden";
-
lordblacksheep schrieb:
Ja Problem erkannt
Anscheinend nicht

Wenn der Such-String im angegebenen Bereich nicht vorhanden ist, gibt FindText -1 zurück.
mfg, Micha!
-
Also hab ich geändert->
if (zahl != -1) vorhanden = true;
genauso müsste auch
if (zahl == -1) vorhanden = false;
gehen oder?
(nur mit ja oder nein antworten)
-
Hallo
Ja... oder einfacher
int zahl=0; zahl = RichEdit2->FindText(Edit1->Text, StartPos, ToEnd, TSearchTypes()<<stWohleWord<<stMatchCase); if (zahl != -1) { Label1->Caption = "vorhanden"; } else { Label1->Caption = "nicht vorhanden";}bis bald
akari
-
ja
-
genau das hab ich erwartet. Ich hab den Code genau so drin. Doch es geht nicht!
denn in der rtf-Datei stehen 2 Einträge:
Test1
Test2Wenn ich jetzt Test1 als Suchbegriff einsetzte -> "vorhanden" -> gut so!
Wenn ich jetzt Test2 als Suchbegriff einsetzte -> "vorhanden" -> gut so!
Wenn ich jetzt Test3 als Suchbegriff einsetzte -> "vorhanden" -> NICHT GUT!
Wenn ich jetzt xxxxx als Suchbegriff einsetzte -> "vorhanden" -> NICHT GUT!noch mal der Code wie er orginal da steht!
RichEdit2->Lines->LoadFromFile (pfad_rezeptedb); int StartPos = 0; int ToEnd = RichEdit2->FindText(Edit1->Text, usw, usw) if (zahl != -1) vorhanden = true; if (vorhanden) Label1->Caption "vorhanden"; if (!vorhanden) Label1->Caption "nicht vorhanden";
-
Noch ein Zusatz, der Interessant ist!
Zuerst etwas nicht vorhandenes eingebe, sagt er nicht vorhanden
aber wenn ich einmal was vorhandenes habe, ist alles danach auch vorhanden, egal was ich eingebe!Wenn ich jetzt Test9 als Suchbegriff einsetzte -> "nicht vorhanden" -> gut so!
Wenn ich jetzt Test1 als Suchbegriff einsetzte -> "vorhanden" -> gut so!
Wenn ich jetzt Test9 als Suchbegriff einsetzte -> "vorhanden" -> NICHT GUT!
Wenn ich jetzt xxxxx als Suchbegriff einsetzte -> "vorhanden" -> NICHT GUT!
-
hiho
das ist klar
vorhanden kann gar nicht false werden(ausser beim ersten mal, da bin ihc mir abernoch nicht sicher, poste mal alles worin vorhanden vorkommt)RichEdit2->Lines->LoadFromFile (pfad_rezeptedb); int StartPos = 0; int ToEnd = RichEdit2->FindText(Edit1->Text, usw, usw) if (zahl != -1) vorhanden = true;//und wenn zahl == -1????? if (vorhanden) Label1->Caption "vorhanden"; if (!vorhanden) Label1->Caption "nicht vorhanden";überleg mal selber(die Lösung mein ich)
mfg allison
-
Hallo,
RichEdit1->Text = "Hallo Welt, das ist ein Test\n\nWie gehts?"; int zahl=0; int StartPos = 0; int ToEnd = RichEdit1->Text.Length(); zahl = RichEdit1->FindText(Edit1->Text, StartPos, ToEnd, TSearchTypes() << stWholeWord << stMatchCase); if (zahl != -1) { Label1->Caption = "vorhanden"; } else { Label1->Caption = "nicht vorhanden";} // Eingabe: Welt = vorhanden // Eingabe: welt = nicht vorhanden (stMatchCase (Groß-und Kleinschreibung)) // ...Hab's getestet, das geht :p
mfg, Micha
-
hiho
oder nimm akari's code, der stimmt(wie immer)
mfg allison
-
stimmt! Ich überleg doch immer, probier immer aus, während ihr antwortet. sry wenn ich nerve. Aber mit jedem Thread lern ich sehr viel dazu!
-
hiho
klar, war ja nicht böse gemeint
aber: "learning by doing"^^
mfg allison