<?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[-&amp;gt;Modified direkt setzen &#x2F; mit Zeiger setzen]]></title><description><![CDATA[<p>Hallo,</p>
<p>das Thema OnChange und Modified hatten wir zwar schon, es ist jedoch eine (IMHO wesentliche) Frage offen geblieben:<br />
Man nehme ein Edit auf ein Form. Ist es zur Laufzeit aktiv und der Benutzer macht eine Eingabe, tritt unter normalen Umständen ein Change-Ereignis ein. Bei entsprechender Benennung und Einbindung der Methoden wird dann eine OnChange-Eventmethode angesprungen, in der das Programm auf die Eingabe reagieren kann.<br />
In dieser OnChange-Eventmethode kann man die Modified-Eigenschaft des Edit abfragen. Damit wird sichergestellt, dass nur auf wirkliche Änderungen des Edit-Text reagiert wird:</p>
<pre><code class="language-cpp">void __fastcall TForm1::Edit1Change(TObject *Sender)
{
    if(Edit1-&gt;Modified)
    {
        //...Verarbeitung der Eingabe etc.
    }
}
</code></pre>
<p>Soweit, so gut... Jetzt nehmen wir folgenden Fall: Man nehme 3 Edits auf einem Form und nutze für alle 3 dieselbe OnChange Eventmethode. (Dieses Beispiel steht stellvertretend für ein Form mit 28 Edits. Wird zur Laufzeit in ein Edit eine Eingabe gemacht, soll diese auf einige andere Edits übertragen werden.) Jedes Edit hat zur Entwurfszeit einen spezifischen Wert in seiner Eigenschaft Tag bekommen, um die Edits zu identifizieren. Nehmen wir an die 3 Edits haben die Tags 1, 2 und 3. Wird etwas in Edit1 eingetragen, soll es auch in Edit2 <strong>und</strong> Edit3 erscheinen. Wird etwas in Edit2 eingetragen, soll es auch in Edit3 erscheinen. Wieder soll die Modified-Eigenschaft zur Sicherheit abgefragt werden:</p>
<pre><code class="language-cpp">void __fastcall TForm1::AllEditChange(TObject *Sender)
{
    TEdit *VirtualEdit= static_cast&lt;TEdit*&gt;(Sender);
    bool bBreak= false;
    unsigned short VETag= VirtualEdit-&gt;Tag;
    AnsiString VEEingabe= VirtualEdit-&gt;Text;

    if(VirtualEdit-&gt;Modified)
    {
        for(k=0; k&lt;ComponentCount; k++)
        {
            if(Components[k]-&gt;ClassNameIs(&quot;TEdit&quot;))
            {
                TEdit *VirtualEditTemp= static_cast&lt;TEdit*&gt;(Components[k]);
                unsigned short VETmpTag= VirtualEditTemp-&gt;Tag;
                // hier steht bei 28 Edits eine lange switch-Anweisung:
                if(((VETag==1) || (VETag==2)) &amp;&amp; (VETmpTag==VETag+1))
                {
                    VirtualEditTemp-&gt;Text= VEEingabe;
                    // ...
                    bBreak= true;
                }
            }
            if(bBreak) break;
        }
    }
}
</code></pre>
<p>So sieht das Ganze dann aus und es funktioniert auch - fast. Das Bespiel lässt vermuten, dass wenn Edit1 einen Eintrag erhält und dieser in Edit2 geschrieben wird, danach auch Edit3 automatisch den Text erhält - Pustekuchen. Die Anweisung <strong>VirtualEditTemp-&gt;Text= VEEingabe;</strong> löst zwar ein Change-Ereignis aus, es wird auch direkt nach dieser Anweisung die AllEditChange-Eventmethode aus sich selbst heraus neu angesprungen, jedoch ist die Modified-Eigenschaft des zweiten veränderten Edits nicht true. Und da sind wir dicht am Problem!<br />
Als logische Konsequenz füge ich jetzt in die innersten if-Bedingung ein Setzen der Modified-Eigenschaft ein. Dadurch sollen bei einer Eingabe in Edit1, die Edits 2 und 3 mit verändert werden:</p>
<pre><code class="language-cpp">// Variante 1:
    if(((VETag==1) || (VETag==2)) &amp;&amp; (VETmpTag==VETag+1))
    {
        VirtualEditTemp-&gt;Modified= true;
        VirtualEditTemp-&gt;Text= VEEingabe;    // &lt;= Change-Event &amp; sofort Sprung zu EditAllChange
    // ...
    bBreak= true;
    }
</code></pre>
<p>Leider ist Modified des gecasteten Sender-Edits dann beim automatischen zweiten Durchlauf der AllEditChange-Methode immer false, was ich nicht verstehe! Liegt es am erneuten casten des Edits nach dem 2. Sprung in AllEditChange?<br />
Folgendes funktioniert geprüftermaßen:</p>
<pre><code class="language-cpp">// Variante 2:
    if((VETag==1) &amp;&amp; (VETmpTag==VETag+1))
    {
        Edit2-&gt;Modified= true;
        Edit2-&gt;Text= VEEingabe;    // &lt;= Change-Event &amp; sofort Sprung zu EditAllChange
    // ...
    bBreak= true;
    }
    if((VETag==2) &amp;&amp; (VETmpTag==VETag+1))
    {
        Edit3-&gt;Modified= true;
        Edit3-&gt;Text= VEEingabe;    // &lt;= Change-Event &amp; sofort Sprung zu EditAllChange
    // ...
    bBreak= true;
    }
</code></pre>
<p>Mit Variante 2 werden nach einer Eingabe in Edit1 auch Edit2 <strong>und</strong> 3 automatisch mit derselben Eingabe versehen. Nach einer Eingabe in Edit2, wird nur Edit3 automatisch mit der Eingabe versehen. Das Problem: Variante 2 ist wesentlich länger (gerade bei 28 Edits) als Variante 1. Warum funktioniert Variante 1 nicht wunschgemäß? Warum wird das Modified über den Zeiger in Variante 1 nicht gesetzt?</p>
<p>Danke schonmal, wer sich bis hierhin durchgekämpft hat! Ich hoffe es kann jemand eine Aussage dazu machen..</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/200670/gt-modified-direkt-setzen-mit-zeiger-setzen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 18 Aug 2026 22:54:57 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/200670.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 18 Dec 2007 10:07:08 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to -&amp;gt;Modified direkt setzen &#x2F; mit Zeiger setzen on Tue, 18 Dec 2007 10:07:08 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>das Thema OnChange und Modified hatten wir zwar schon, es ist jedoch eine (IMHO wesentliche) Frage offen geblieben:<br />
Man nehme ein Edit auf ein Form. Ist es zur Laufzeit aktiv und der Benutzer macht eine Eingabe, tritt unter normalen Umständen ein Change-Ereignis ein. Bei entsprechender Benennung und Einbindung der Methoden wird dann eine OnChange-Eventmethode angesprungen, in der das Programm auf die Eingabe reagieren kann.<br />
In dieser OnChange-Eventmethode kann man die Modified-Eigenschaft des Edit abfragen. Damit wird sichergestellt, dass nur auf wirkliche Änderungen des Edit-Text reagiert wird:</p>
<pre><code class="language-cpp">void __fastcall TForm1::Edit1Change(TObject *Sender)
{
    if(Edit1-&gt;Modified)
    {
        //...Verarbeitung der Eingabe etc.
    }
}
</code></pre>
<p>Soweit, so gut... Jetzt nehmen wir folgenden Fall: Man nehme 3 Edits auf einem Form und nutze für alle 3 dieselbe OnChange Eventmethode. (Dieses Beispiel steht stellvertretend für ein Form mit 28 Edits. Wird zur Laufzeit in ein Edit eine Eingabe gemacht, soll diese auf einige andere Edits übertragen werden.) Jedes Edit hat zur Entwurfszeit einen spezifischen Wert in seiner Eigenschaft Tag bekommen, um die Edits zu identifizieren. Nehmen wir an die 3 Edits haben die Tags 1, 2 und 3. Wird etwas in Edit1 eingetragen, soll es auch in Edit2 <strong>und</strong> Edit3 erscheinen. Wird etwas in Edit2 eingetragen, soll es auch in Edit3 erscheinen. Wieder soll die Modified-Eigenschaft zur Sicherheit abgefragt werden:</p>
<pre><code class="language-cpp">void __fastcall TForm1::AllEditChange(TObject *Sender)
{
    TEdit *VirtualEdit= static_cast&lt;TEdit*&gt;(Sender);
    bool bBreak= false;
    unsigned short VETag= VirtualEdit-&gt;Tag;
    AnsiString VEEingabe= VirtualEdit-&gt;Text;

    if(VirtualEdit-&gt;Modified)
    {
        for(k=0; k&lt;ComponentCount; k++)
        {
            if(Components[k]-&gt;ClassNameIs(&quot;TEdit&quot;))
            {
                TEdit *VirtualEditTemp= static_cast&lt;TEdit*&gt;(Components[k]);
                unsigned short VETmpTag= VirtualEditTemp-&gt;Tag;
                // hier steht bei 28 Edits eine lange switch-Anweisung:
                if(((VETag==1) || (VETag==2)) &amp;&amp; (VETmpTag==VETag+1))
                {
                    VirtualEditTemp-&gt;Text= VEEingabe;
                    // ...
                    bBreak= true;
                }
            }
            if(bBreak) break;
        }
    }
}
</code></pre>
<p>So sieht das Ganze dann aus und es funktioniert auch - fast. Das Bespiel lässt vermuten, dass wenn Edit1 einen Eintrag erhält und dieser in Edit2 geschrieben wird, danach auch Edit3 automatisch den Text erhält - Pustekuchen. Die Anweisung <strong>VirtualEditTemp-&gt;Text= VEEingabe;</strong> löst zwar ein Change-Ereignis aus, es wird auch direkt nach dieser Anweisung die AllEditChange-Eventmethode aus sich selbst heraus neu angesprungen, jedoch ist die Modified-Eigenschaft des zweiten veränderten Edits nicht true. Und da sind wir dicht am Problem!<br />
Als logische Konsequenz füge ich jetzt in die innersten if-Bedingung ein Setzen der Modified-Eigenschaft ein. Dadurch sollen bei einer Eingabe in Edit1, die Edits 2 und 3 mit verändert werden:</p>
<pre><code class="language-cpp">// Variante 1:
    if(((VETag==1) || (VETag==2)) &amp;&amp; (VETmpTag==VETag+1))
    {
        VirtualEditTemp-&gt;Modified= true;
        VirtualEditTemp-&gt;Text= VEEingabe;    // &lt;= Change-Event &amp; sofort Sprung zu EditAllChange
    // ...
    bBreak= true;
    }
</code></pre>
<p>Leider ist Modified des gecasteten Sender-Edits dann beim automatischen zweiten Durchlauf der AllEditChange-Methode immer false, was ich nicht verstehe! Liegt es am erneuten casten des Edits nach dem 2. Sprung in AllEditChange?<br />
Folgendes funktioniert geprüftermaßen:</p>
<pre><code class="language-cpp">// Variante 2:
    if((VETag==1) &amp;&amp; (VETmpTag==VETag+1))
    {
        Edit2-&gt;Modified= true;
        Edit2-&gt;Text= VEEingabe;    // &lt;= Change-Event &amp; sofort Sprung zu EditAllChange
    // ...
    bBreak= true;
    }
    if((VETag==2) &amp;&amp; (VETmpTag==VETag+1))
    {
        Edit3-&gt;Modified= true;
        Edit3-&gt;Text= VEEingabe;    // &lt;= Change-Event &amp; sofort Sprung zu EditAllChange
    // ...
    bBreak= true;
    }
</code></pre>
<p>Mit Variante 2 werden nach einer Eingabe in Edit1 auch Edit2 <strong>und</strong> 3 automatisch mit derselben Eingabe versehen. Nach einer Eingabe in Edit2, wird nur Edit3 automatisch mit der Eingabe versehen. Das Problem: Variante 2 ist wesentlich länger (gerade bei 28 Edits) als Variante 1. Warum funktioniert Variante 1 nicht wunschgemäß? Warum wird das Modified über den Zeiger in Variante 1 nicht gesetzt?</p>
<p>Danke schonmal, wer sich bis hierhin durchgekämpft hat! Ich hoffe es kann jemand eine Aussage dazu machen..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1422455</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1422455</guid><dc:creator><![CDATA[Kolumbus]]></dc:creator><pubDate>Tue, 18 Dec 2007 10:07:08 GMT</pubDate></item><item><title><![CDATA[Reply to -&amp;gt;Modified direkt setzen &#x2F; mit Zeiger setzen on Tue, 18 Dec 2007 10:55:15 GMT]]></title><description><![CDATA[<p>Modified wird durchaus über den Zeiger gesetzt. Aber offenbar wird es auf false gesetzt, wenn man Text von Anwendungsseite setzt. Dadurch ist die Zuweisung nutzlos. Das widerspricht natürlich dem Hinweis in der BCB-Hilfe.</p>
<p>Allerdings ist etwas unverständlich, wieso du überhaupt Modified abfragst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1422482</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1422482</guid><dc:creator><![CDATA[Morris Szyslak]]></dc:creator><pubDate>Tue, 18 Dec 2007 10:55:15 GMT</pubDate></item><item><title><![CDATA[Reply to -&amp;gt;Modified direkt setzen &#x2F; mit Zeiger setzen on Tue, 18 Dec 2007 11:01:27 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Nein das widerspricht nicht der Builder-Hilfe zu TEdit::Modified</p>
<blockquote>
<p>Die Eigenschaft Modified sollte auf true gesetzt werden, falls eine Anwendung die Eigenschaft Text in einem Eingabefeld direkt ändert.</p>
</blockquote>
<p>Sagt doch genau aus : Wenn das Programm (und nicht der User) den Edit-Inhalt selber setzt, wird Modified auf false gesetzt.</p>
<p>Und ich empfehle auch dringend statt dem ständigen Edit-Suchen und -Casten besser gleich alle betreffenden (und nur die) Edits in ein entsprechendes dynamisches Array zu packen. Genaue Beschreibung siehe FAQ.<br />
Und dann würde ich auch mit Schleifen arbeiten anstelle von mehrfachen Events.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1422486</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1422486</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Tue, 18 Dec 2007 11:01:27 GMT</pubDate></item><item><title><![CDATA[Reply to -&amp;gt;Modified direkt setzen &#x2F; mit Zeiger setzen on Tue, 18 Dec 2007 12:06:55 GMT]]></title><description><![CDATA[<p>Morris Szyslak schrieb:</p>
<blockquote>
<p>Modified wird durchaus über den Zeiger gesetzt. Aber offenbar wird es auf false gesetzt, wenn man Text von Anwendungsseite setzt. Dadurch ist die Zuweisung nutzlos. Das widerspricht natürlich dem Hinweis in der BCB-Hilfe.</p>
</blockquote>
<p>akari schrieb:</p>
<blockquote>
<p>Nein das widerspricht nicht der Builder-Hilfe zu TEdit::Modified</p>
<blockquote>
<p>Die Eigenschaft Modified sollte auf true gesetzt werden, falls eine Anwendung die Eigenschaft Text in einem Eingabefeld direkt ändert.</p>
</blockquote>
<p>Sagt doch genau aus : Wenn das Programm (und nicht der User) den Edit-Inhalt selber setzt, <strong>wird Modified auf false gesetzt</strong>.</p>
</blockquote>
<p>Genau das steht da eben nicht explizit geschrieben. Da steht nur: <strong>Modified wird nicht true gesetzt</strong>, wenn das Prog die Eigenschaft Text ändert. Der Rest ist erstmal der freien Interpretation des Programmierers überlassen, bzw. den Göttern des Probierens. Und IMHO wäre die logische Konsequenz, dass Modified nicht verändert wird, wenn die Text-Eigenschaft programmseitig verändert wird. Das Funktionieren von Variante 2 stützt diese These eigentlich unumstößlich. Die Frage ist: Was läuft da anders, wenn Modified über den Zeiger gesetzt wird?</p>
<p>--------------------------------------------------------------------------------</p>
<p>Morris Szyslak schrieb:</p>
<blockquote>
<p>[...] Allerdings ist etwas unverständlich, wieso du überhaupt Modified abfragst.</p>
</blockquote>
<p>Das wurde so empfohlen und wird in Beispielen wird es auch so gemacht. Ich habe nicht den Durchblick und weiß nicht, wann Change noch OnChange erzeugt... aus der Hilfe wird das (für mich) auch nicht wirklich ersichtlich:</p>
<blockquote>
<p>Die Methode Change erzeugt das Ereignis OnChange.</p>
<p>*DYNAMIC void __fastcall Change(void);<br />
*<br />
<strong>Beschreibung</strong></p>
<p>Anwendungen rufen die Methode Change nicht direkt auf. <strong>Sie wird automatisch von Windows-Ereignissen ausgelöst.</strong> Change ist als Methode vom Typ protected deklariert. Damit können abgeleitete Klassen zusätzliche Reaktionen definieren, die über den Aufruf der Ereignisbehandlungsroutine für OnChange hinausgehen. Wenn abgeleitete Klassen, die die Methode Change überschreiben, die geerbte Methode nicht aufrufen, wird die Ereignisbehandlungsroutine OnChange nicht aufgerufen.</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
--------------------------------------------------------------------------------</p>
<p>akari schrieb:</p>
<blockquote>
<p>Und ich empfehle auch dringend statt dem ständigen Edit-Suchen und -Casten besser gleich alle betreffenden (und nur die) Edits in ein entsprechendes dynamisches Array zu packen. Genaue Beschreibung siehe FAQ.<br />
Und dann würde ich auch mit Schleifen arbeiten anstelle von mehrfachen Events.</p>
</blockquote>
<p>Damit werde ich mich befassen (sagte ich ja schonmal). Jetzt möchte ich aber dieses Mysterium lösen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1422513</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1422513</guid><dc:creator><![CDATA[Kolumbus]]></dc:creator><pubDate>Tue, 18 Dec 2007 12:06:55 GMT</pubDate></item><item><title><![CDATA[Reply to -&amp;gt;Modified direkt setzen &#x2F; mit Zeiger setzen on Tue, 18 Dec 2007 12:51:15 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/7971">@akari</a>: ich habe gerade in den VCL-FAQ's &quot;Dynamische Arrays von Komponenten oder Objekten&quot; gelesen. Das ist ja einfach.... Danke für deinen beharrlichen Hinweis! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>Das heißt aber jetzt nicht, das mich das Edit-&gt;Modified-Mysterium nicht mehr interessiert! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1422548</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1422548</guid><dc:creator><![CDATA[Kolumbus]]></dc:creator><pubDate>Tue, 18 Dec 2007 12:51:15 GMT</pubDate></item></channel></rss>