<?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[Probleme mit delete StringGrid]]></title><description><![CDATA[<p>Hallo,<br />
auf einem Form1 mit PageControl erzeuge ich nach Bedarf TabSheets, mit je einer StringGrid. Beim löschen eines beliebigen Blatts (TabSheets) tritt, wenn delete Grd aktiv ist, der in „AktuellesBlattlschen1Click“ beschriebene Fehler auf. Ist delete Grd ausgeschaltet, funktioniert alles einwandfrei.</p>
<pre><code>//---------------------------------------------------------------------------
void __fastcall TForm1::AktuellesBlattlschen1Click(TObject *Sender)
{ 
   if ( ppc-&gt;PageCount &gt; 1 ) 
   {
     int TabNr = StrToInt(ppc-&gt;Pages[ppc-&gt;ActivePageIndex]-&gt;Hint);
     if (Application-&gt;FindComponent(&quot;TGrd&quot;+IntToStr(TabNr)))
     {
         delete Grd;    // hier gibt es Probleme. Folgende Fehlermeldung wird ausgegeben.
//***************************************************************************
     //  Acces violation at address 7C928FEA in module 'ntdll.dll'. Write auf address 00000010.
//***************************************************************************

         Grd=NULL;   
         delete pts[TabNr];

         ppc-&gt;ActivePageIndex = ppc-&gt;PageCount-1;

        int TabNr = StrToInt(ppc-&gt;Pages[ppc-&gt;ActivePageIndex]-&gt;Hint);
        if (Application-&gt;FindComponent(&quot;TGrd&quot;+IntToStr(TabNr)))
       {
          Komponent=Application-&gt;FindComponent(&quot;TGrd&quot;+IntToStr(TabNr));
          Grd=((TStringGrid*)Komponent);
          Grd-&gt;SetFocus();
       }
     }
   }
}
//---------------------------------------------------------------------------
</code></pre>
<p>Meine Frage, wird nicht die auf pts[TabNr] vorhandene Grd ohnehin automatisch freigegeben, wenn delete pts[TabNr] aufgerufen wird? Dann wäre ja delete Grd nicht erforderlich. Selbst bei mehrmaligem hinzufügen und entfernen von Blättern, bei ausgeschaltetem delete Grd, gab es nie Probleme. Sollte jedoch delete Grd erforderlich sein, bitte ich Euch um Rat. Was mache ich da falsch.<br />
Ich wünsche Euch Allen recht frohe und schöne Pfingsten und sage schon jetzt Danke für Antworten und Hinweise.<br />
Gruß Egbert</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/182558/probleme-mit-delete-stringgrid</link><generator>RSS for Node</generator><lastBuildDate>Sat, 15 Aug 2026 21:06:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/182558.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 26 May 2007 15:31:05 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Probleme mit delete StringGrid on Sat, 26 May 2007 15:31:05 GMT]]></title><description><![CDATA[<p>Hallo,<br />
auf einem Form1 mit PageControl erzeuge ich nach Bedarf TabSheets, mit je einer StringGrid. Beim löschen eines beliebigen Blatts (TabSheets) tritt, wenn delete Grd aktiv ist, der in „AktuellesBlattlschen1Click“ beschriebene Fehler auf. Ist delete Grd ausgeschaltet, funktioniert alles einwandfrei.</p>
<pre><code>//---------------------------------------------------------------------------
void __fastcall TForm1::AktuellesBlattlschen1Click(TObject *Sender)
{ 
   if ( ppc-&gt;PageCount &gt; 1 ) 
   {
     int TabNr = StrToInt(ppc-&gt;Pages[ppc-&gt;ActivePageIndex]-&gt;Hint);
     if (Application-&gt;FindComponent(&quot;TGrd&quot;+IntToStr(TabNr)))
     {
         delete Grd;    // hier gibt es Probleme. Folgende Fehlermeldung wird ausgegeben.
//***************************************************************************
     //  Acces violation at address 7C928FEA in module 'ntdll.dll'. Write auf address 00000010.
//***************************************************************************

         Grd=NULL;   
         delete pts[TabNr];

         ppc-&gt;ActivePageIndex = ppc-&gt;PageCount-1;

        int TabNr = StrToInt(ppc-&gt;Pages[ppc-&gt;ActivePageIndex]-&gt;Hint);
        if (Application-&gt;FindComponent(&quot;TGrd&quot;+IntToStr(TabNr)))
       {
          Komponent=Application-&gt;FindComponent(&quot;TGrd&quot;+IntToStr(TabNr));
          Grd=((TStringGrid*)Komponent);
          Grd-&gt;SetFocus();
       }
     }
   }
}
//---------------------------------------------------------------------------
</code></pre>
<p>Meine Frage, wird nicht die auf pts[TabNr] vorhandene Grd ohnehin automatisch freigegeben, wenn delete pts[TabNr] aufgerufen wird? Dann wäre ja delete Grd nicht erforderlich. Selbst bei mehrmaligem hinzufügen und entfernen von Blättern, bei ausgeschaltetem delete Grd, gab es nie Probleme. Sollte jedoch delete Grd erforderlich sein, bitte ich Euch um Rat. Was mache ich da falsch.<br />
Ich wünsche Euch Allen recht frohe und schöne Pfingsten und sage schon jetzt Danke für Antworten und Hinweise.<br />
Gruß Egbert</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1292688</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1292688</guid><dc:creator><![CDATA[Egbert]]></dc:creator><pubDate>Sat, 26 May 2007 15:31:05 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit delete StringGrid on Sat, 26 May 2007 16:57:18 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Da in deinem Quellcode nicht zu sehen ist wie das Grid genau erstellt wird läßt sich dazu nichts absoluten sagen.<br />
Der allgemeine Grundsatz ist : zu jedem new gehört ein delete. Wo kein new da kein delete. Wenn du also das Grid selber nirgendwo mittels new erstellst bist du auch nicht für ein delete verantwortlich.</p>
<p>Bei VCL-Komponenten ergibt sich da noch die Ausnahme : wird der Komponente ein Owner übergeben (meistens mit dem Konstruktor) ist dieser für das Löschen zuständig, auch hier brauchst du dich trotz manuellem new nicht um ein manuelles delete kümmern.<br />
Ich vermute mal anhand des geschilderten Verhaltens das genau das bei dir zutrifft. Denn ein doppeltes delete auf die selbe Instanz (oder besser gesagt Adresse ohne gültige Neubelegung) ist noch schlimmer als gar kein delete.</p>
<p>Nur wenn du wirklich dem Grid gar kein Owner zuweist must du manuell ein delete ausführen. Das ist natürlich zu vermeiden, grad weil ja die VCL dir das alles abnehmen würde.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1292734</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1292734</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Sat, 26 May 2007 16:57:18 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit delete StringGrid on Sat, 26 May 2007 17:13:28 GMT]]></title><description><![CDATA[<p>Hallo Akari,<br />
zunächst vielen Dank für die absolut schnelle Antwort. Hätte doch gleich auch den anderen Code mitgeben sollen, was ich erst auch wollte. Hier nun der restliche Quellcode der Erstellungsroutinen. In jede neu erstellte Grid wird eine entsprechende Datei (Tabelle), (siehe TGrid-&gt;Hint) geladen.</p>
<pre><code>TComponent *Komponent=NULL;  

//---------------------------------------------------------------------------
void __fastcall TForm1::NeuesBlatt(TObject *Sender)
{
  for (int i=0;i&lt;Application-&gt;ComponentCount;i++)
  {
    if ( !Application-&gt;FindComponent(&quot;TGrd&quot;+IntToStr(i)))
    {
       pts[i] = new TTabSheet(this);
       pts[i]-&gt;PageControl = ppc;
       pts[i]-&gt;Name = AnsiString(&quot;pts&quot;)+IntToStr(i);
       pts[i]-&gt;Caption = &quot;Blatt&quot;+IntToStr(i);
       pts[i]-&gt;Hint = IntToStr(i); //
       ppc-&gt;ActivePageIndex = i;   //Cursor auf erzeuge Tab setzen

       CreateGrid(i);

       if (ppc-&gt;ActivePageIndex != ppc-&gt;PageCount-1)
         ppc-&gt;ActivePageIndex = ppc-&gt;PageCount-1;

       break;
    }
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CreateGrid(int i)
{
  TStringGrid *TGrid=new TStringGrid(Application);
  TGrid-&gt;Parent = pts[i];
  TGrid-&gt;Name = AnsiString(&quot;TGrd&quot;) + IntToStr(i);
  TGrid-&gt;Hint = AnsiString(&quot;KeinName.tab&quot;); //speichert den Path eines Tabellenblatts.
  TGrid-&gt;Tag  = 0; // 0=keine Änderung , 1=Änderung in Tabelle

  TGrid-&gt;Options &lt;&lt;goFixedVertLine &lt;&lt;goFixedHorzLine &lt;&lt;goVertLine &lt;&lt;goHorzLine
                 &lt;&lt;goRowSizing &lt;&lt;goColSizing &lt;&lt;goRowMoving &lt;&lt;goColMoving
                 &lt;&lt;goEditing &lt;&lt;goThumbTracking &lt;&lt;goAlwaysShowEditor
                 &lt;&lt;goDrawFocusSelected &lt;&lt;goTabs;

//   &lt;&lt;goRangeSelect

  TGrid-&gt;ShowHint = true; 
  TGrid-&gt;Align = alClient;

  TGrid-&gt;OnMouseUp   = KompMouseUp;
  TGrid-&gt;OnMouseDown = KompMouseDown;

  TGrid-&gt;OnKeyDown   = KompKeyDown;
  TGrid-&gt;OnKeyPress  = KompKeyPress;
  TGrid-&gt;OnKeyUp     = KompKeyUp;
  TGrid-&gt;OnDblClick  = KompDblClick;
  TGrid-&gt;OnClick     = KompClick;

  TGrid-&gt;OnColumnMoved = KompColumnMoved;
  TGrid-&gt;OnSelectCell  = KompSelectCell;
  TGrid-&gt;OnDrawCell    = KompDrawCell;

  Komponent=TGrid;
  Grd=((TStringGrid*)Komponent);
}
//---------------------------------------------------------------------------
</code></pre>
<p>Gruß Egbert</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1292751</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1292751</guid><dc:creator><![CDATA[Egbert]]></dc:creator><pubDate>Sat, 26 May 2007 17:13:28 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit delete StringGrid on Sat, 26 May 2007 17:25:30 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Nun gut du hast doch etwas gemacht das ich mir nicht vorstellen konnte <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>
<p>Application als Owner zu übergeben ist zwar machbar aber auch nicht glücklich. Denn damit werden die Grids zwar ordentlich gelöscht aber erst wenn das Programm selber beendet wird. Selbst wenn es schon lange nicht mehr gebraucht wird. Deshalb solltest du als Owner entweder this (in Membermethoden von Forms zum Beispiel) oder besser noch die direkt übergeordnete Komponente. Das wäre in deinem Fall das TTabSheet. Du bräuchtest für deine CreateGrid-Methode nur um einen entsprechenden Parameter erweitern.</p>
<p>Damit wird sich auch das Suchen des Grids im Application-Objekt erübrigen. Du must es dann im TabSheet suchen.<br />
Allerdings ist auch das nicht viel besser. Schau lieber in die FAQ hier im BCB-Forum in den Abschnitt Komponenten benutzen, dort ist ein Thema zu dynamische Arrays von Komponenten.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1292760</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1292760</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Sat, 26 May 2007 17:25:30 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit delete StringGrid on Sat, 26 May 2007 17:44:17 GMT]]></title><description><![CDATA[<p>Hallo Akari,<br />
Danke für den Hinweis. Werde im FAQ nachschauen und mir die nötigen Infos holen.<br />
Wenn ich nicht weiterkomme, darf ich sicherlich wieder um Rat bitten.<br />
Gruß Egbert</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1292772</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1292772</guid><dc:creator><![CDATA[Egbert]]></dc:creator><pubDate>Sat, 26 May 2007 17:44:17 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit delete StringGrid on Mon, 28 May 2007 12:12:52 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich muss doch nochmal auf mein Problem zurückkommen. Nachdem ich im FAQ nicht das Geeignete für mich gefunden habe oder ich es sicher nicht richtig verstanden habe, habe ich folgende Möglichkeiten versucht.</p>
<pre><code>//1.
 TStringGrid *TGrid=new TstringGrid(((TTabSheet*)Komponent));

//2.
 TStringGrid *TGrid=new TstringGrid(this);
</code></pre>
<p>In beiden Fällen wurde ohne Beanstandung mit Alt u.F9 korrekt compiliert. Jedoch wurde beim Programmstart jeweils die Fehlermeldung ausgegeben, dass die Komponente pts0 bereits existiert.</p>
<p>Wie muss es nun in der CreateGrid-Methode korrekt lauten, und wie muss ich den entsprechenden Parameter erweitern.</p>
<p>Gruß Egbert</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1293696</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1293696</guid><dc:creator><![CDATA[Egbert]]></dc:creator><pubDate>Mon, 28 May 2007 12:12:52 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit delete StringGrid on Tue, 29 May 2007 05:12:22 GMT]]></title><description><![CDATA[<p>die StringGrids werden so oder so richtig erstellt, allerdings mußt du jedem StringGrid einen eindeutigen Namen zuweisen, nachdem du es erstellt hast, da es sonst zu Dopplungen und damit zu der von dir beschriebenen Fehlermeldung kommt.<br />
die IDE erstellt nur zur Entwurfszeit Namen mit vortlaufendem Index, zur Laufzeit mußt du dies selbst übernehmen:</p>
<pre><code class="language-cpp">TStringGrid *TGrid=new TStringGrid(this); 
TGrid-&gt;Name = &quot;Grid&quot; + IntToStr(index);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1294155</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1294155</guid><dc:creator><![CDATA[Linnea]]></dc:creator><pubDate>Tue, 29 May 2007 05:12:22 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit delete StringGrid on Tue, 29 May 2007 07:41:20 GMT]]></title><description><![CDATA[<p>...oder wenn du den Komponentennamen nicht benötigst, einfach einen Leerstring zuweisen:</p>
<pre><code class="language-cpp">[code]
TStringGrid *TGrid=new TStringGrid(this);
TGrid-&gt;Name = &quot;&quot;;
[/code]
</code></pre>
<p><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>
<p>Edit: Aber du brauchst ihn wohl <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1294201</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1294201</guid><dc:creator><![CDATA[Burkhi]]></dc:creator><pubDate>Tue, 29 May 2007 07:41:20 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit delete StringGrid on Tue, 29 May 2007 08:14:28 GMT]]></title><description><![CDATA[<p>Hallo,<br />
Danke für Eure Antwort. Jeder Grid wird selbstverständlich ein eindeutiger Name zugewiesen (siehe CreateGrid). Es dreht sich eigentlich darum, warum lässt sich delete Grd in AktuellesBlattlschen1Click nicht einsetzen und warum lässt sich Owner this, beim erstellen einer neuen Grid nicht verwenden. Mehr oder weniger werden beim beenden der Application ja ohnehin alle Grids freigegeben, aber ich wollte halt bei jedem löschen (freigeben) eines Blatts, sprich TabSheet, die darauf befindliche Grid auch sofort mit freigeben. Und das klappt bekomme ich eben nicht hin.<br />
Gruß Egbert</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1294232</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1294232</guid><dc:creator><![CDATA[Egbert]]></dc:creator><pubDate>Tue, 29 May 2007 08:14:28 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit delete StringGrid on Tue, 29 May 2007 08:51:54 GMT]]></title><description><![CDATA[<p>wenn du statt Application this im Konstruktor des StringGrid verwendest solltest du deine Abfragen auch nicht auf Application sondern auf this anwenden:</p>
<pre><code class="language-cpp">for (int i=0;i&lt;this-&gt;ComponentCount;i++)
  {
    if ( !this-&gt;FindComponent(&quot;TGrd&quot;+IntToStr(i)))
    {
</code></pre>
<p>auch wenn ich nicht weiß, was du mit diesen beiden Abfragen bezweckst, da du auch den PageCount des PageControl verwenden kannst um einen Index zum Hinzufügen eines Blattes samt Grid zu erhalten</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1294265</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1294265</guid><dc:creator><![CDATA[Linnea]]></dc:creator><pubDate>Tue, 29 May 2007 08:51:54 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit delete StringGrid on Tue, 29 May 2007 10:14:36 GMT]]></title><description><![CDATA[<p>leider lässt sich this im Konstruktor des StringGrid nicht verwenden. Es geht halt nur mit Application. Warum, weiß ich nicht.</p>
<p>Aber eigentlich war mein Problem die Freigabe der Grid, wenn ich ein beliebiges Blatt lösche. Nun gut, es ist weiter nicht tragisch, da ohnehin alle Grids beim beenden des Programms freigegeben werden. Ansonsten läuft meine Anwendung absolut einwandfrei und zu meiner Zufriedenheit.</p>
<p>Jedenfalls, vielen Dank für Eure Bemühungen und einen schönen Gruß,<br />
Egbert</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1294329</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1294329</guid><dc:creator><![CDATA[Egbert]]></dc:creator><pubDate>Tue, 29 May 2007 10:14:36 GMT</pubDate></item></channel></rss>