<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Suchen Dialog über ActionList &#x2F; FindDialog]]></title><description><![CDATA[<p>Moin!</p>
<p>ich habe wohl mal wieder ein Problem, dass einfach ist aber für mich dennoch zu hoch...</p>
<p>Ich möchte in meinem Projekt einen Dialog zum suchen und ersetzen einfügen, der dies in einem RichEdit tuen soll.<br />
IN BCB gibt es dafür ja die Möglichkeiten über den ActionList zu gehen oder mit dem FinDDialog zu arbeiten.</p>
<p>Beides fruchtet nicht so recht.<br />
Die wie ich fand sauberste Methode über die ActionList gibt mir Rätsel auf. Zwar springt der Suchdialog an, wenn ich ein RichEdit klicke und ihn über das Menü starte und er sucht auch, aber das gefundene Wort wird erst markiert, wenn ich das Dialogfeld zum suchen schließe oder in das RichEdit klicke. Allerdings wird nur das erste Vorkommen des Wortes ab der Cursorposition gesucht und gefunden, egal ob ich &quot;nach oben&quot; oder &quot;nach unten&quot; dann im Dialog anklicke.</p>
<p>In die ActionList habe ich dafür ein SearchFind1 + SearchFindNext1 eingefügt. Letzteres habe ich über sein Ereignis SerachFind mit meinem SearchFind1 verbunden. In den Eigenschaftes des SerachFind1 unter Dialog/Options sind frDown und frNext auf true gesetzt.<br />
In meinen Menü ist der Punkt Suchen dann über sein Ereignis Action mit dem SerachFind1 verbunden.</p>
<p>Für den FindDialog habe ich aus der BCB Hilfe das Beispiel &quot;Position, Execute, FindText, OnFind, SelStart, SelLength (Beispiel)&quot; entnommen. Aus den Dialogen habe ich dafür den FindDialog gezogen. Mein Code sieht dann folgendermaßewn aus:</p>
<pre><code class="language-cpp">void __fastcall TFormMain::Suchen1Click(TObject *Sender)
{
  FindDialog1-&gt;Position = Point(dynamic_cast&lt;TRichEdit*&gt;(PageControl1-&gt;
ActivePage-&gt;Components[6])-&gt;Left + dynamic_cast&lt;TRichEdit*&gt;(PageControl1-&gt;
ActivePage-&gt;Components[6])-&gt;Width, dynamic_cast&lt;TRichEdit*&gt;(PageControl1-&gt;
ActivePage-&gt;Components[6])-&gt;Top);
  FindDialog1-&gt;Execute();
}
//---------------------------------------------------------------------------

void __fastcall TFormMain::FindDialog1Find(TObject *Sender)
{
  int FoundAt, StartPos, ToEnd;
  // Suchbeginn nach der aktuellen Markierung 
  // (falls vorhanden), 
  // andernfalls am Textanfang starten
  if (dynamic_cast&lt;TRichEdit*&gt;(PageControl1-&gt;ActivePage-&gt;Components[6])-&gt;SelLength)
    StartPos = dynamic_cast&lt;TRichEdit*&gt;(PageControl1-&gt;ActivePage-&gt;Components[6])
-&gt;SelStart + dynamic_cast&lt;TRichEdit*&gt;(PageControl1-&gt;ActivePage-&gt;Components[6])-&gt;SelLength;
  else
    StartPos = 0;

  // ToEnd ist die Länge von StartPos 
  // bis zum Ende des Textes im RTF-Eingabefeld

  ToEnd = dynamic_cast&lt;TRichEdit*&gt;(PageControl1-&gt;ActivePage-&gt;Components[6])-&gt;Text.Length() - StartPos;

  FoundAt = dynamic_cast&lt;TRichEdit*&gt;(PageControl1-&gt;ActivePage-&gt;Components[6])-&gt;
FindText(FindDialog1-&gt;FindText, StartPos, ToEnd, TSearchTypes()&lt;&lt; stMatchCase);
  if (FoundAt != -1)
  {
    dynamic_cast&lt;TRichEdit*&gt;(PageControl1-&gt;ActivePage-&gt;Components[6])-&gt;SetFocus();
    dynamic_cast&lt;TRichEdit*&gt;(PageControl1-&gt;ActivePage-&gt;Components[6])-&gt;SelStart = FoundAt;
    dynamic_cast&lt;TRichEdit*&gt;(PageControl1-&gt;ActivePage-&gt;Components[6])-&gt;SelLength = FindDialog1-&gt;FindText.Length();
  }
}
</code></pre>
<p>Wie zu sehen ist, arbeite ich mit mehreren RichEdits auf die ich per dynamic cast zugreife wärend der Laufzeit. Mein spezielles RichEdit zum durchsuchen soll halt die Komponente 6 auf einem TabSheet einer PageControl sein.<br />
Selbst wenn es funktionieren würde wäre es noch nicht anganz sauber, da ich eigentlich zwei RichEdits druchsuchen muss. Aber mir würde es schon reichen, wenn es überhaupt läuft...</p>
<p>Danke für eure Hilfe im Voraus.</p>
<p>MfG Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/113049/suchen-dialog-über-actionlist-finddialog</link><generator>RSS for Node</generator><lastBuildDate>Wed, 22 Jul 2026 09:30:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/113049.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 19 Jun 2005 09:03:27 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Suchen Dialog über ActionList &#x2F; FindDialog on Sun, 19 Jun 2005 09:05:07 GMT]]></title><description><![CDATA[<p>Moin!</p>
<p>ich habe wohl mal wieder ein Problem, dass einfach ist aber für mich dennoch zu hoch...</p>
<p>Ich möchte in meinem Projekt einen Dialog zum suchen und ersetzen einfügen, der dies in einem RichEdit tuen soll.<br />
IN BCB gibt es dafür ja die Möglichkeiten über den ActionList zu gehen oder mit dem FinDDialog zu arbeiten.</p>
<p>Beides fruchtet nicht so recht.<br />
Die wie ich fand sauberste Methode über die ActionList gibt mir Rätsel auf. Zwar springt der Suchdialog an, wenn ich ein RichEdit klicke und ihn über das Menü starte und er sucht auch, aber das gefundene Wort wird erst markiert, wenn ich das Dialogfeld zum suchen schließe oder in das RichEdit klicke. Allerdings wird nur das erste Vorkommen des Wortes ab der Cursorposition gesucht und gefunden, egal ob ich &quot;nach oben&quot; oder &quot;nach unten&quot; dann im Dialog anklicke.</p>
<p>In die ActionList habe ich dafür ein SearchFind1 + SearchFindNext1 eingefügt. Letzteres habe ich über sein Ereignis SerachFind mit meinem SearchFind1 verbunden. In den Eigenschaftes des SerachFind1 unter Dialog/Options sind frDown und frNext auf true gesetzt.<br />
In meinen Menü ist der Punkt Suchen dann über sein Ereignis Action mit dem SerachFind1 verbunden.</p>
<p>Für den FindDialog habe ich aus der BCB Hilfe das Beispiel &quot;Position, Execute, FindText, OnFind, SelStart, SelLength (Beispiel)&quot; entnommen. Aus den Dialogen habe ich dafür den FindDialog gezogen. Mein Code sieht dann folgendermaßewn aus:</p>
<pre><code class="language-cpp">void __fastcall TFormMain::Suchen1Click(TObject *Sender)
{
  FindDialog1-&gt;Position = Point(dynamic_cast&lt;TRichEdit*&gt;(PageControl1-&gt;
ActivePage-&gt;Components[6])-&gt;Left + dynamic_cast&lt;TRichEdit*&gt;(PageControl1-&gt;
ActivePage-&gt;Components[6])-&gt;Width, dynamic_cast&lt;TRichEdit*&gt;(PageControl1-&gt;
ActivePage-&gt;Components[6])-&gt;Top);
  FindDialog1-&gt;Execute();
}
//---------------------------------------------------------------------------

void __fastcall TFormMain::FindDialog1Find(TObject *Sender)
{
  int FoundAt, StartPos, ToEnd;
  // Suchbeginn nach der aktuellen Markierung 
  // (falls vorhanden), 
  // andernfalls am Textanfang starten
  if (dynamic_cast&lt;TRichEdit*&gt;(PageControl1-&gt;ActivePage-&gt;Components[6])-&gt;SelLength)
    StartPos = dynamic_cast&lt;TRichEdit*&gt;(PageControl1-&gt;ActivePage-&gt;Components[6])
-&gt;SelStart + dynamic_cast&lt;TRichEdit*&gt;(PageControl1-&gt;ActivePage-&gt;Components[6])-&gt;SelLength;
  else
    StartPos = 0;

  // ToEnd ist die Länge von StartPos 
  // bis zum Ende des Textes im RTF-Eingabefeld

  ToEnd = dynamic_cast&lt;TRichEdit*&gt;(PageControl1-&gt;ActivePage-&gt;Components[6])-&gt;Text.Length() - StartPos;

  FoundAt = dynamic_cast&lt;TRichEdit*&gt;(PageControl1-&gt;ActivePage-&gt;Components[6])-&gt;
FindText(FindDialog1-&gt;FindText, StartPos, ToEnd, TSearchTypes()&lt;&lt; stMatchCase);
  if (FoundAt != -1)
  {
    dynamic_cast&lt;TRichEdit*&gt;(PageControl1-&gt;ActivePage-&gt;Components[6])-&gt;SetFocus();
    dynamic_cast&lt;TRichEdit*&gt;(PageControl1-&gt;ActivePage-&gt;Components[6])-&gt;SelStart = FoundAt;
    dynamic_cast&lt;TRichEdit*&gt;(PageControl1-&gt;ActivePage-&gt;Components[6])-&gt;SelLength = FindDialog1-&gt;FindText.Length();
  }
}
</code></pre>
<p>Wie zu sehen ist, arbeite ich mit mehreren RichEdits auf die ich per dynamic cast zugreife wärend der Laufzeit. Mein spezielles RichEdit zum durchsuchen soll halt die Komponente 6 auf einem TabSheet einer PageControl sein.<br />
Selbst wenn es funktionieren würde wäre es noch nicht anganz sauber, da ich eigentlich zwei RichEdits druchsuchen muss. Aber mir würde es schon reichen, wenn es überhaupt läuft...</p>
<p>Danke für eure Hilfe im Voraus.</p>
<p>MfG Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/812249</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/812249</guid><dc:creator><![CDATA[macsmac]]></dc:creator><pubDate>Sun, 19 Jun 2005 09:05:07 GMT</pubDate></item><item><title><![CDATA[Reply to Suchen Dialog über ActionList &#x2F; FindDialog on Sun, 19 Jun 2005 10:24:08 GMT]]></title><description><![CDATA[<p>macsmac schrieb:</p>
<blockquote>
<p>das gefundene Wort wird erst markiert, wenn ich das Dialogfeld zum suchen schließe oder in das RichEdit klicke</p>
</blockquote>
<p>HideSelection des RichEdit auf <em>false</em> setzen.</p>
<blockquote>
<p>Allerdings wird nur das erste Vorkommen des Wortes ab der Cursorposition gesucht und gefunden, egal ob ich &quot;nach oben&quot; oder &quot;nach unten&quot; dann im Dialog anklicke.</p>
</blockquote>
<p>Im OnFind des SearchFind1 den FindDialog-Beispielcode einfügen, dabei das <em>FindDialog1</em> durch <em>SearchFind1-&gt;Dialog</em> ersetzen.</p>
<p>Tip am Rande: sieh zu, dass du die dynamic_cast-Häufungen los wirst. Erstell dir eine temporäre Instanz der Zielklasse und arbeite dann mit der weiter.</p>
<pre><code class="language-cpp">TRichEdit *RE = dynamic_cast&lt;TRichEdit *&gt;(PageControl1-&gt;ActivePage-&gt;Components[6]);
if (RE)
  SearchFind1-&gt;Dialog-&gt;Position = Point(RE-&gt;Left + RE-&gt;Width, RE-&gt;Top);
// usw.
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/812315</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/812315</guid><dc:creator><![CDATA[Jansen]]></dc:creator><pubDate>Sun, 19 Jun 2005 10:24:08 GMT</pubDate></item><item><title><![CDATA[Reply to Suchen Dialog über ActionList &#x2F; FindDialog on Sun, 19 Jun 2005 10:29:29 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>du hast das mit dem TReplaceDialog falsch verstanden...<br />
statt dem OnFind-Event must du auch den OnReplace-Event nehmen.<br />
Außerdem würde ich dir empfehlen, die casts auf einen zu reduzieren, so hier :</p>
<pre><code class="language-cpp">void __fastcall TFormMain::Suchen1Click(TObject *Sender)
{
  TRichEdit *CurrEdit = static_cast&lt;TRichEdit*&gt;(PageControl1-&gt;
ActivePage-&gt;Components[6]); // Ein fester Cast, das du ja genau weist, das ein RichEdit vorhanden ist
  FindDialog1-&gt;Position = Point(CurrEdit-&gt;Left + CurrEdit-&gt;Width, CurrEdit-&gt;Top);
  FindDialog1-&gt;Execute();
}
</code></pre>
<p>/Edit : zu spät</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/812318</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/812318</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Sun, 19 Jun 2005 10:29:29 GMT</pubDate></item><item><title><![CDATA[Reply to Suchen Dialog über ActionList &#x2F; FindDialog on Sun, 19 Jun 2005 10:41:29 GMT]]></title><description><![CDATA[<p>akari schrieb:</p>
<blockquote>
<pre><code class="language-cpp">TRichEdit *CurrEdit = static_cast&lt;TRichEdit*&gt;(PageControl1-&gt;
ActivePage-&gt;Components[6]); // Ein fester Cast, das du ja genau weist, das ein RichEdit vorhanden ist
</code></pre>
</blockquote>
<p>Also gerade beim Zugriff auf das Components-Array ist ein dynamic_cast IMO unverzichtbar. Wie schnell hat man im Formdesigner mal ein paar Komponenten entfernt und/oder (wieder) hinzugefügt, und schon geht der static_cast in's Auge.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/812331</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/812331</guid><dc:creator><![CDATA[Jansen]]></dc:creator><pubDate>Sun, 19 Jun 2005 10:41:29 GMT</pubDate></item><item><title><![CDATA[Reply to Suchen Dialog über ActionList &#x2F; FindDialog on Sun, 19 Jun 2005 10:54:39 GMT]]></title><description><![CDATA[<p>Und noch ein Nachtrag zum eigentlichen Thema:<br />
Im OnFind des SearchFind1 einfach SearchFindNext1-&gt;Execute aufrufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/812340</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/812340</guid><dc:creator><![CDATA[Jansen]]></dc:creator><pubDate>Sun, 19 Jun 2005 10:54:39 GMT</pubDate></item><item><title><![CDATA[Reply to Suchen Dialog über ActionList &#x2F; FindDialog on Thu, 23 Jun 2005 20:32:58 GMT]]></title><description><![CDATA[<p>Danke, ihr habt mir sehr geholfen.</p>
<p>Jansen schrieb:</p>
<blockquote>
<p>Und noch ein Nachtrag zum eigentlichen Thema:<br />
Im OnFind des SearchFind1 einfach SearchFindNext1-&gt;Execute aufrufen.</p>
</blockquote>
<p>Genau damit läuft's wunderbar <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Allerdings macht mir der Ersetzendialog noch Probleme, da er nur alles nach der Cursorposition ersetzt, aber nicht darüber. Ich habe dafür das SearchReplace in der ActionList eingesetzt.<br />
Die Position zu setzen hilt auch nicht</p>
<pre><code class="language-cpp">TRichEdit *RE = dynamic_cast&lt;TRichEdit *&gt;(PageControl1-&gt;ActivePage-&gt;Components[6]);
if (RE)
  SearchReplace1-&gt;Dialog-&gt;Position = Point(RE-&gt;Left + RE-&gt;Width, RE-&gt;Top);
SearchReplace1-&gt;Dialog-&gt;Execute();
</code></pre>
<p>Den Aufruf habe ich unter dem Menüpunkt Ersetzen und dessem Ereignis OnClick vermacht.</p>
<p>Gruß M</p>
]]></description><link>https://www.c-plusplus.net/forum/post/816039</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/816039</guid><dc:creator><![CDATA[macsmac]]></dc:creator><pubDate>Thu, 23 Jun 2005 20:32:58 GMT</pubDate></item></channel></rss>