<?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[Ausserordentliches Ereignis?]]></title><description><![CDATA[<p>Hallo!</p>
<p>Vorneweg: Sorry, ein besserer Titel ist mir einfach nicht eingefallen. <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>Ich habe auf einem Formular mehrere TControls mit &quot;OnMouseDown&quot; Ereignissen.<br />
Nun möchte ich so eine Art &quot;kontextsensitive Hilfe&quot; einbauen. Klickt man also auf ein Control, soll speziell zu diesem Control die Hilfe angezeigt werden.<br />
Ich könnte nun im Hilfe-Button irgend eine globale Property auf &quot;true&quot; setzen und in OnMouseDown dann prüfen, ob dieses true ist - wenn ja soll die Hilfe angezeigt werden, ansonsten soll die Standardaktion ausgeführt werden.</p>
<p>Gibts da auch eine einfachere Lösungsmöglichkeit??</p>
<p>Ich könnte zwar - wenn ich auf dem Hilfebutton draufklicke etwas in dieser Art machen:</p>
<pre><code class="language-cpp">for (int i = 0; i &lt; Formxx-&gt;ControlCount; i++)
{
  Formxx-&gt;Controls[i]-&gt;OnMouseDown = Hilfeklick;
}
</code></pre>
<p>Dann habe ich jedoch das Problem, dass ich hinterher die Ereignisse nicht mehr zuordnen kann, wenn die Hilfe wieder ausgeschaltet wird.</p>
<p>Wie realisiert man denn sowas am schönsten? Die Lösung mit dem if(helpactive) kann ja wohl nicht die schönste sein, wenn ich damit rechne, dass ich in meinem Projekt 90 Formulare - und damit entsprechend viele TControls habe.</p>
<p>tschüss<br />
Robert</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/76138/ausserordentliches-ereignis</link><generator>RSS for Node</generator><lastBuildDate>Sun, 28 Jun 2026 19:55:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/76138.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 08 Jun 2004 09:20:13 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Ausserordentliches Ereignis? on Tue, 08 Jun 2004 09:20:13 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Vorneweg: Sorry, ein besserer Titel ist mir einfach nicht eingefallen. <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>Ich habe auf einem Formular mehrere TControls mit &quot;OnMouseDown&quot; Ereignissen.<br />
Nun möchte ich so eine Art &quot;kontextsensitive Hilfe&quot; einbauen. Klickt man also auf ein Control, soll speziell zu diesem Control die Hilfe angezeigt werden.<br />
Ich könnte nun im Hilfe-Button irgend eine globale Property auf &quot;true&quot; setzen und in OnMouseDown dann prüfen, ob dieses true ist - wenn ja soll die Hilfe angezeigt werden, ansonsten soll die Standardaktion ausgeführt werden.</p>
<p>Gibts da auch eine einfachere Lösungsmöglichkeit??</p>
<p>Ich könnte zwar - wenn ich auf dem Hilfebutton draufklicke etwas in dieser Art machen:</p>
<pre><code class="language-cpp">for (int i = 0; i &lt; Formxx-&gt;ControlCount; i++)
{
  Formxx-&gt;Controls[i]-&gt;OnMouseDown = Hilfeklick;
}
</code></pre>
<p>Dann habe ich jedoch das Problem, dass ich hinterher die Ereignisse nicht mehr zuordnen kann, wenn die Hilfe wieder ausgeschaltet wird.</p>
<p>Wie realisiert man denn sowas am schönsten? Die Lösung mit dem if(helpactive) kann ja wohl nicht die schönste sein, wenn ich damit rechne, dass ich in meinem Projekt 90 Formulare - und damit entsprechend viele TControls habe.</p>
<p>tschüss<br />
Robert</p>
]]></description><link>https://www.c-plusplus.net/forum/post/535822</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/535822</guid><dc:creator><![CDATA[rowisoft]]></dc:creator><pubDate>Tue, 08 Jun 2004 09:20:13 GMT</pubDate></item><item><title><![CDATA[Reply to Ausserordentliches Ereignis? on Tue, 08 Jun 2004 09:49:55 GMT]]></title><description><![CDATA[<p>Schau doch mal in der Hilfe zu TControl. Da gibt es Eigenschaften, deren Namen mit &quot;Help&quot;<br />
beginnen. Vielleicht ist es das, was Du suchst.</p>
<p>Gruß,</p>
<p>Alexander</p>
]]></description><link>https://www.c-plusplus.net/forum/post/535849</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/535849</guid><dc:creator><![CDATA[Alexander Kempf]]></dc:creator><pubDate>Tue, 08 Jun 2004 09:49:55 GMT</pubDate></item><item><title><![CDATA[Reply to Ausserordentliches Ereignis? on Tue, 08 Jun 2004 11:10:09 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Hilft mir leider nicht weiter, diese Eigenschaften kenne ich schon!</p>
<p>Damit wird aber das &quot;OnMouseDown&quot; nicht hinfällig, der einzige Vorteil den ich daran erkennen kann, ist dass ich nicht für jedes Control ein eigenes OnMouseDown brauche, bzw. im OnMouseDown - Ereignis nicht mehr prüfen muss, um welches Objekt es sich eigentlich handelt...</p>
<p>Mein Hilfesystem ist ausserdem komplizierter. (ist eigentlich gar kein Hilfesystem, das ganze hier aber zu erklären ist zu kompliziert und ich denke dann kann sich eh niemand was drunter vorstellen.)<br />
Im OnMouseDown - Ereignis brauche ich nämlich zudem die X und Y - Angaben, wo in dem Objekt hingeklickt wurde... Ausserdem brauche ich auch einen Zeiger auf das Control selbst, damit ich weiß, welches Control das Parent davon ist...</p>
<p>Weiß jemand Rat, wie man sowas löst?</p>
<p>tschüss<br />
Robert</p>
]]></description><link>https://www.c-plusplus.net/forum/post/535914</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/535914</guid><dc:creator><![CDATA[rowisoft]]></dc:creator><pubDate>Tue, 08 Jun 2004 11:10:09 GMT</pubDate></item><item><title><![CDATA[Reply to Ausserordentliches Ereignis? on Tue, 08 Jun 2004 11:16:50 GMT]]></title><description><![CDATA[<p>Die x/y Angaben hast du doch schon (Parameter von OnMouseDown) und den Pointer auf den Client auch (Sender). Wo ist denn jetzt dein Problem.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/535923</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/535923</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Tue, 08 Jun 2004 11:16:50 GMT</pubDate></item><item><title><![CDATA[Reply to Ausserordentliches Ereignis? on Tue, 08 Jun 2004 13:25:27 GMT]]></title><description><![CDATA[<p>Also, wenn ich Dich richtig verstehe, dann ist der Ablauf folgender:<br />
1. Ein Benutzer wählt (z.B. im Menü), daß er Hilfe braucht.<br />
2. Ein Klick auf einen Button oder sonstiges TControl bewirkt jetzt vorübergehend nicht,<br />
daß die Aktion ausgeführt wird, die dem OnClick-Ereignis zugeordnet ist, sondern eine<br />
spezielle &quot;Hilfe-OnClick&quot;-Routine.<br />
3. Nach der Hilfe soll wieder die Standard-OnClick-Routine zugeordnet sein.</p>
<p>Wenn das so stimmt, ist die Lösung doch relativ einfach.<br />
1. Gehe alle aktiven Formulare Deiner Anwendung durch und biege für alle OnClick-Ereignisse die<br />
Ereignisbehandlungsmethode auf die für die Hilfe um. Merke Dir aber vorher die ursprünglichen<br />
Adressen.<br />
2. In Deiner &quot;globalen&quot; Hilfe-OnClick-Funktion identifiziere das Control über die Sender-Eigenschaft<br />
- wie von Braunstein vorgeschlagen. Die X/Y-Koordinaten bekommst Du auf ähnliche Weise über das<br />
MouseMove-Ereignis o.ä. raus. Vielleicht (Wahrscheinlich) gibt es auch einen Weg über die Win-API<br />
- dazu kannst Du sicherlich WebFritzi fragen.<br />
3. Setze die vorher gemerkten Ereignis-Methoden wieder auf die ursprünglichen Werte zurück.</p>
<p>Das ganze funktioniert wahrscheinlich auch über Windows-Hooks, zu denen auch ein FAQ-Eintrag ex-<br />
istiert.</p>
<p>Gruß,</p>
<p>Alexander</p>
]]></description><link>https://www.c-plusplus.net/forum/post/535976</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/535976</guid><dc:creator><![CDATA[Alexander Kempf]]></dc:creator><pubDate>Tue, 08 Jun 2004 13:25:27 GMT</pubDate></item><item><title><![CDATA[Reply to Ausserordentliches Ereignis? on Tue, 08 Jun 2004 15:28:20 GMT]]></title><description><![CDATA[<p>Hallo Alexander!</p>
<p>Erstmal vielen Dank für deine Antwort! Genau so, wie du das beschreibst sollte die Funktionsweise sein.</p>
<p>Nur verstehe ich eines nicht so ganz: Ich gehe also alle Controls durch und setzt die Ereignisbehandlungsroutine auf was anderes, das dann meine Hilfefunktion wird.<br />
Nur, wie kann ich vorher die Events &quot;zwischenspeichern&quot;, damit ich diese später wieder zuordnen kann. Damit komme ich nicht so ganz klar.</p>
<p>Naja... während ich hier schreibe, kommt mir eigentlich ne Idee:<br />
2 TList Objekte, darin kann ich ja Zeiger zwischenspeichern.<br />
In die 1. Liste packe ich mir alle meine geänderten Controls und in die 2. Liste auf gleicher Höhe packe ich mir den Zeiger zum Event.<br />
Bei Beenden der Hilfe kann ich ja wieder alle meine Controls durchgehen, schaun ob das vielleicht in meiner 1. Liste drin ist - und wenn ja, das Ereignis der 2. Liste wieder zuweisen.</p>
<p>Müsste doch so funktionieren?!? <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>Ob das ne schöne Lösung gibt? Aber funktionieren müsste es...</p>
<p>Danke dir für deinen Denkanstoss!</p>
<p>tschüss<br />
Robert</p>
]]></description><link>https://www.c-plusplus.net/forum/post/536123</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/536123</guid><dc:creator><![CDATA[rowisoft]]></dc:creator><pubDate>Tue, 08 Jun 2004 15:28:20 GMT</pubDate></item><item><title><![CDATA[Reply to Ausserordentliches Ereignis? on Tue, 08 Jun 2004 15:43:47 GMT]]></title><description><![CDATA[<p>rowisoft schrieb:</p>
<blockquote>
<p>2 TList Objekte, darin kann ich ja Zeiger zwischenspeichern.</p>
</blockquote>
<p>Das würde wohl gehen, besser würde ich aber finden, nur eine Liste zu verwenden (muß ja nicht TList<br />
sein), um die beiden (die ja zusammengehören) gemeinsam zu speichern. Also sowas wie Key/Value-<br />
Paare zu speichern. Möglich wäre es z.B. den Namen des Controls in eine TStringList zu speichern<br />
und die zugehörige Ereignis-Methode als Objekt (AddObject). Über FindComponent kann man dieses<br />
Control später wieder finden...<br />
Willst Du mehrere Methoden-Zeiger ablegen, würde ich Dir empfehlen, eine kleine Klasse oder Struct<br />
zu schreiben.</p>
<p>Gruß,</p>
<p>Alexander</p>
]]></description><link>https://www.c-plusplus.net/forum/post/536145</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/536145</guid><dc:creator><![CDATA[Alexander Kempf]]></dc:creator><pubDate>Tue, 08 Jun 2004 15:43:47 GMT</pubDate></item><item><title><![CDATA[Reply to Ausserordentliches Ereignis? on Tue, 08 Jun 2004 16:18:30 GMT]]></title><description><![CDATA[<p>Wenn es nur bei der einen Hilfsfunktion bleibt, könnte man bei klicken auf den Hilfebutton (oder Menupunkt etc.) ein Flag setzen welches dann in jeder implementierten OnMouseDown-Funktion (welche eine Hilfe hat) abgefragt wird. Dann entsprechend Flag eine zentrale Hilfsfunktion bzw. die Orginalroutine aufrufen. Dann Flag zurücksetzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/536173</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/536173</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Tue, 08 Jun 2004 16:18:30 GMT</pubDate></item><item><title><![CDATA[Reply to Ausserordentliches Ereignis? on Tue, 08 Jun 2004 16:24:52 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<blockquote>
<p>Wenn es nur bei der einen Hilfsfunktion bleibt, könnte man bei klicken auf den Hilfebutton (oder Menupunkt etc.) ein Flag setzen welches dann in jeder implementierten OnMouseDown-Funktion (welche eine Hilfe hat) abgefragt wird. Dann entsprechend Flag eine zentrale Hilfsfunktion bzw. die Orginalroutine aufrufen. Dann Flag zurücksetzen.</p>
</blockquote>
<p>Eben genau das wollte ich verhindern. Bei 90 Formularen - und dementsprechend viele TControls ist hier der Ärger vorprogrammiert. Und wenn dann neue Controls hinzugefügt werden (weil eine Software ja nie fertig ist) - wie oft wird da dann wohl vergessen, dieses Flag abzufangen?</p>
<p>tschüss<br />
Robert</p>
]]></description><link>https://www.c-plusplus.net/forum/post/536180</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/536180</guid><dc:creator><![CDATA[rowisoft]]></dc:creator><pubDate>Tue, 08 Jun 2004 16:24:52 GMT</pubDate></item><item><title><![CDATA[Reply to Ausserordentliches Ereignis? on Tue, 08 Jun 2004 20:23:04 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Irgendwie raff ich das nicht.</p>
<p>Wenn ich sozusagen den Hilfe-Button drücke, habe ich den folgenden Code eingebaut:</p>
<pre><code class="language-cpp">MaskenDesignerList = new TList();
      MaskenDesignerEvents = new TList();
      for ( int i = 0; i &lt; Form1-&gt;ActiveMDIChild-&gt;ComponentCount; i++)
      {
        if (dynamic_cast&lt;TControl*&gt;(Form1-&gt;ActiveMDIChild-&gt;Components[i]))
        {
          TControl *Element = dynamic_cast&lt;TControl*&gt;(Form1-&gt;ActiveMDIChild-&gt;Components[i]);
          MaskenDesignerList-&gt;Add(Element);
          TMouseEvent event = (((TButton*)Element)-&gt;OnMouseDown);
          MaskenDesignerEvents-&gt;Add(*(((TButton*)Element)-&gt;OnMouseDown));
          ((TButton*)Element)-&gt;OnMouseDown = MaskenDesignerElementMouseDown;
        }
      }
</code></pre>
<p>Irgendwas (ich weiß aber nicht was) muss daran aber falsch sein. Wenn ich nachher sozusagen beim Ausschalten der Hilfefunktion diesen Code reinmache:</p>
<pre><code class="language-cpp">for ( int i = 0; i &lt; Form1-&gt;ActiveMDIChild-&gt;ComponentCount; i++)
      {
        if (dynamic_cast&lt;TControl*&gt;(Form1-&gt;ActiveMDIChild-&gt;Components[i]))
        {
          TControl *Element = dynamic_cast&lt;TControl*&gt;(Form1-&gt;ActiveMDIChild-&gt;Components[i]);
          for (int x = 0; x &lt; MaskenDesignerList-&gt;Count; x++)
          {
            if (MaskenDesignerList-&gt;Items[x] == Element)
            {
              ((TButton*)Element)-&gt;OnMouseDown = *((TMouseEvent*)(MaskenDesignerEvents-&gt;Items[x]));
              break;
            }
          }
        }
      }
</code></pre>
<p>Bleibt das OnMouseDown - Event immer noch auf auf die &quot;Hilfefunktion&quot;. Der Debugger sagt mir auch, dass jedes Element von &quot;MaskenDesignerEvents&quot; meine Hilfefunktion ist.<br />
Daher gehe ich davon aus, dass ich beim Setzen schon was falsch mache, ich weiß aber nicht was...</p>
<p>BTW: Wie kann ich denn auf TControl::OnMouseDown zugreifen, ohne jeweils auf irgendein spezielles Control (Button) casten zu müssen? Oder wie kann ich auf den jeweils richtigen Typ casten, das mit (TButton*) funktioniert zwar, kann aber doch auch nicht die optimale Lösung sein??!</p>
<p>Vielleicht kann mir ja nochmal jemand helfen...</p>
<p>Danke &amp; tschüss<br />
Robert</p>
]]></description><link>https://www.c-plusplus.net/forum/post/536352</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/536352</guid><dc:creator><![CDATA[rowisoft]]></dc:creator><pubDate>Tue, 08 Jun 2004 20:23:04 GMT</pubDate></item><item><title><![CDATA[Reply to Ausserordentliches Ereignis? on Wed, 09 Jun 2004 05:57:40 GMT]]></title><description><![CDATA[<p>Hast Du es schon mal mit MethodName() und MethodAdress() versucht? Diese scheinen mir besser für Dein vorhaben geeignet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/536455</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/536455</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 09 Jun 2004 05:57:40 GMT</pubDate></item><item><title><![CDATA[Reply to Ausserordentliches Ereignis? on Wed, 09 Jun 2004 06:20:28 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Danke für deine Antwort.<br />
Mit MethodName komme ich nicht so ganz zurecht. Wenn ich z.B. mache<br />
ShowMessage(Button1.MethodName(&amp;(Button1-&gt;OnMouseDown)));<br />
erhalte ich immer einen leeren String...</p>
<p>Aber egal - das Problem ist gelöst. Habe mir in meiner Klasse einen Zeiger TMouseEvents deklariert und beim Starten der Hilfefunktion habe ich dann = new TMouseEvents[AnzahlDerControls] gemacht und diese einzeln gefüllt.<br />
Und diese konnte ich nachher dann auch wieder zurückgeben.<br />
Da war meine Idee mit TList wohl nicht so optimal, obwohl mich immer noch wundert, warum das nicht funktioniert hat. Aber egal, die neue Lösung gefällt mir eh besser...</p>
<p>Danke trotzdem euch allen!</p>
<p>tschüss<br />
Robert</p>
]]></description><link>https://www.c-plusplus.net/forum/post/536463</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/536463</guid><dc:creator><![CDATA[rowisoft]]></dc:creator><pubDate>Wed, 09 Jun 2004 06:20:28 GMT</pubDate></item><item><title><![CDATA[Reply to Ausserordentliches Ereignis? on Wed, 09 Jun 2004 07:34:16 GMT]]></title><description><![CDATA[<p>rowisoft schrieb:</p>
<blockquote>
<p>Wie kann ich denn auf TControl::OnMouseDown zugreifen, ohne jeweils auf irgendein spezielles Control (Button) casten zu müssen?</p>
</blockquote>
<p>Ja, das fand ich auch toll, als ich damals damit rumexperimentiert hatte. Joe_M. hat die Richtung schon angedeutet.<br />
Man kann das auch dynamisch machen. Das sieht dann ungefähr so aus:</p>
<pre><code class="language-cpp">for (int i=0; i&lt;form-&gt;ComponentCount; ++i)
{
   TMethod method;
   method.Data = this;
   method.Code = this-&gt;MethodAddress(&quot;FormMouseMove&quot;);
   PPropInfo PropInfo = GetPropInfo((PTypeInfo)form-&gt;Components[i]-&gt;ClassInfo(), &quot;OnMouseMove&quot;);
   if (PropInfo &amp;&amp; (*PropInfo-&gt;PropType)-&gt;Kind == tkMethod &amp;&amp; 
       (AnsiString)(*PropInfo-&gt;PropType)-&gt;Name == String(&quot;TMouseMoveEvent&quot;))
      SetMethodProp(static_cast&lt;TObject *&gt;(form-&gt;Components[i]), PropInfo, method);
}
</code></pre>
<p>Dabei ist FormMouseMove die Ereignisbehandlungsmethode, die Du neu zuweisen willst. In Deinem Fall also Deine &quot;Hilfe&quot;-<br />
Methode. OnMouseMove ist die Ereignis-Eigenschaft des Controls, der Du Deine Methode zuweisen willst. Vorher solltest Du<br />
aber noch prüfen, ob form-&gt;Components[i] auch vom Typ TControl ist.</p>
<p>Gruß,</p>
<p>Alexander</p>
]]></description><link>https://www.c-plusplus.net/forum/post/536497</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/536497</guid><dc:creator><![CDATA[Alexander Kempf]]></dc:creator><pubDate>Wed, 09 Jun 2004 07:34:16 GMT</pubDate></item></channel></rss>