<?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[Suche Algo um einen Tree auszulesen]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich habe einen Tree, bei dem jedes Item als eine Art Ordner fungieren kann. Das heißt, jeder Ordner kann einen oder mehr Unterordner besitzen und jeder Unterordner wiederum weitere Unterordner und so weiter. In jedem Ordner können Items enthalten sein, die dann Informationen enthalten.</p>
<p>Jetzt möchte ich einen Algo entwickeln, mit dem ich alle Items, die keine Children haben, auslesen kann, quasi alle Items mit Informationen. Wenn das Root-Item ausgewählt ist müssen also ALLE Items geladen werden und wenn einer der Unterordner ausgewählt ist müssen alle im Unterordner befindlichen Items geladen werden.</p>
<p>Ich bin bis jetzt so weit, dass immer der zuerst gefundene Ordner/Unterordner betreten wird und die Items des am tiefsten verschachtelten Ordners ausgelesen werden können. Ich brauche allerdings ALLE untergebenen Items.</p>
<p>Kann mir jemand dabei helfen, den richtigen Algo zu finden, der genau das alles kann?</p>
<p>Hier mein Entwurf:</p>
<pre><code class="language-cpp">HTREEITEM h = tree.GetSelectedItem();
   int iAmount= tree.GetItemCount();
   CString cszId, cszUnit;
   cszId.Format(&quot;%i&quot;,iAmount+1);

   if(h)
   {
      int iCount = tree.GetSelectedCount();
      POSITION pos = m_ctTree.GetFirstSelectedItemPosition(); //wegen multiselection
      int iPos = tree.GetNextSelectedItem(pos);

      for (int i=0;i&lt;iCount;i++) //für jedes selektierte Item (multiple selection)
      {
         h = tree.GetItemFromIndex(iPos);

         int iItemAmount = tree.GetChildrenCount(); //anzahl der children

         if(tree.ItemHasChildren(h)) //wenn children vorhanden
         {            
            HTREEITEM htiChild = tree.GetNextItem(h, TVGN_CHILD);            
            for (int i=0; i&lt;iItemAmount; i++)
            {
               while (tree.ItemHasChildren(htiChild)) //durch bis zum untergebensten ordner
               {
                  iItemAmount = tree.GetChildrenCount();
                  htiChild = tree.GetNextItem(htiChild, TVGN_CHILD);
               }

               auslesendesitems(); //das tatsächliche auslesen des items
            }
         }
         else //wenn keine children vorhanden
         {

            int iDropImage;
            tree.GetItemImage(h,iDropImage,iDropImage);

            if (iDropImage!=0) //iDrobImage = 0 bedeutet, dass es ein Ordner ist
            {
               auslesendesitems();
            }
            else AfxMessageBox(_T(&quot;Ordner ist leer!&quot;),MB_OK|MB_ICONSTOP);
         }

         iPos = m_ctTree.GetNextSelectedItem(pos);
      }
   }
}
</code></pre>
<p>Wie gesagt, damit funktioniert es nicht. Ausserdem habe ich den Code etwas gekürzt und vereinfacht, also kann es sein, dass es manche Methoden in Wirklichkeit nicht gibt.</p>
<p>Ich würde mich sehr freuen, wenn mir jemand &quot;in Worten&quot; erklären kann, wie der Ablauf (der Algo) lauten müsste. Programmieren kann ich das Ganze dann selbst.</p>
<p>Vielen Dank schon mal für Eure Mühe. Ich komme leider absolut nicht weiter (sonst müsste ich auch nicht fragen).</p>
<p>Viele Grüße<br />
Daniel</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/162292/suche-algo-um-einen-tree-auszulesen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 12 Sep 2026 06:17:24 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/162292.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 17 Oct 2006 10:45:49 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Suche Algo um einen Tree auszulesen on Tue, 17 Oct 2006 10:46:24 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich habe einen Tree, bei dem jedes Item als eine Art Ordner fungieren kann. Das heißt, jeder Ordner kann einen oder mehr Unterordner besitzen und jeder Unterordner wiederum weitere Unterordner und so weiter. In jedem Ordner können Items enthalten sein, die dann Informationen enthalten.</p>
<p>Jetzt möchte ich einen Algo entwickeln, mit dem ich alle Items, die keine Children haben, auslesen kann, quasi alle Items mit Informationen. Wenn das Root-Item ausgewählt ist müssen also ALLE Items geladen werden und wenn einer der Unterordner ausgewählt ist müssen alle im Unterordner befindlichen Items geladen werden.</p>
<p>Ich bin bis jetzt so weit, dass immer der zuerst gefundene Ordner/Unterordner betreten wird und die Items des am tiefsten verschachtelten Ordners ausgelesen werden können. Ich brauche allerdings ALLE untergebenen Items.</p>
<p>Kann mir jemand dabei helfen, den richtigen Algo zu finden, der genau das alles kann?</p>
<p>Hier mein Entwurf:</p>
<pre><code class="language-cpp">HTREEITEM h = tree.GetSelectedItem();
   int iAmount= tree.GetItemCount();
   CString cszId, cszUnit;
   cszId.Format(&quot;%i&quot;,iAmount+1);

   if(h)
   {
      int iCount = tree.GetSelectedCount();
      POSITION pos = m_ctTree.GetFirstSelectedItemPosition(); //wegen multiselection
      int iPos = tree.GetNextSelectedItem(pos);

      for (int i=0;i&lt;iCount;i++) //für jedes selektierte Item (multiple selection)
      {
         h = tree.GetItemFromIndex(iPos);

         int iItemAmount = tree.GetChildrenCount(); //anzahl der children

         if(tree.ItemHasChildren(h)) //wenn children vorhanden
         {            
            HTREEITEM htiChild = tree.GetNextItem(h, TVGN_CHILD);            
            for (int i=0; i&lt;iItemAmount; i++)
            {
               while (tree.ItemHasChildren(htiChild)) //durch bis zum untergebensten ordner
               {
                  iItemAmount = tree.GetChildrenCount();
                  htiChild = tree.GetNextItem(htiChild, TVGN_CHILD);
               }

               auslesendesitems(); //das tatsächliche auslesen des items
            }
         }
         else //wenn keine children vorhanden
         {

            int iDropImage;
            tree.GetItemImage(h,iDropImage,iDropImage);

            if (iDropImage!=0) //iDrobImage = 0 bedeutet, dass es ein Ordner ist
            {
               auslesendesitems();
            }
            else AfxMessageBox(_T(&quot;Ordner ist leer!&quot;),MB_OK|MB_ICONSTOP);
         }

         iPos = m_ctTree.GetNextSelectedItem(pos);
      }
   }
}
</code></pre>
<p>Wie gesagt, damit funktioniert es nicht. Ausserdem habe ich den Code etwas gekürzt und vereinfacht, also kann es sein, dass es manche Methoden in Wirklichkeit nicht gibt.</p>
<p>Ich würde mich sehr freuen, wenn mir jemand &quot;in Worten&quot; erklären kann, wie der Ablauf (der Algo) lauten müsste. Programmieren kann ich das Ganze dann selbst.</p>
<p>Vielen Dank schon mal für Eure Mühe. Ich komme leider absolut nicht weiter (sonst müsste ich auch nicht fragen).</p>
<p>Viele Grüße<br />
Daniel</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1156179</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1156179</guid><dc:creator><![CDATA[DanielusITF]]></dc:creator><pubDate>Tue, 17 Oct 2006 10:46:24 GMT</pubDate></item><item><title><![CDATA[Reply to Suche Algo um einen Tree auszulesen on Tue, 17 Oct 2006 10:53:21 GMT]]></title><description><![CDATA[<p>Ich würde da etwas aus Rekursion und Schleife zusammenbauen (<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/26a0.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--warning"
      title=":warning:"
      alt="⚠"
    /> Pseudocode):</p>
<pre><code class="language-cpp">void getItems(Ordner root, vector&lt;Item&gt;&amp; items)
{
  for(i=0;i&lt;root.ItemCount();++i)
    if(isOrdner(root.Item(i)))
      getItems(root.Item(i),items);
    else
      items.push_back(root.Item(i));
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1156186</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1156186</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 17 Oct 2006 10:53:21 GMT</pubDate></item><item><title><![CDATA[Reply to Suche Algo um einen Tree auszulesen on Tue, 17 Oct 2006 11:00:34 GMT]]></title><description><![CDATA[<p>DanielusITF schrieb:</p>
<blockquote>
<p>Kann mir jemand dabei helfen, den richtigen Algo zu finden, der genau das alles kann?</p>
</blockquote>
<p><a href="https://www.google.de/search?&amp;q=%22breadth%20first%22" rel="nofollow">Google: &quot;breadth first&quot;</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1156189</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1156189</guid><dc:creator><![CDATA[finix]]></dc:creator><pubDate>Tue, 17 Oct 2006 11:00:34 GMT</pubDate></item><item><title><![CDATA[Reply to Suche Algo um einen Tree auszulesen on Tue, 17 Oct 2006 11:27:41 GMT]]></title><description><![CDATA[<p>Vielen Dank für Eure Antwort.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10318">@CStoll</a><br />
An Rekursion habe ich auch gedacht, aber wo ist in Deinem (Pseudo-)Code denn eine? <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="😃"
    /> So in etwa habe ich es ja auch. Aber ich weiß nicht wie ich selbige Prozedur auch für alle Siblings, also die Geschwister laufen lassen kann. Ich glaube ich denke im Moment einfach zu kompliziert.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/4239">@finix</a><br />
das sieht in der Theorie ganz gut aus, aber ich habe ehrlich gesagt keine Ahnung, wie ich hier Items in eine Queue stellen kann, bzw. wie eine Queue implementiert werden müsste.</p>
<p>Viele Grüße<br />
Daniel</p>
<p>PS: Ich programmiere erst seit einem Monat C++, zeigt etwas erbarmen <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/1156212</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1156212</guid><dc:creator><![CDATA[DanielusITF]]></dc:creator><pubDate>Tue, 17 Oct 2006 11:27:41 GMT</pubDate></item><item><title><![CDATA[Reply to Suche Algo um einen Tree auszulesen on Tue, 17 Oct 2006 11:35:15 GMT]]></title><description><![CDATA[<p>DanielusITF schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10318">@CStoll</a><br />
An Rekursion habe ich auch gedacht, aber wo ist in Deinem (Pseudo-)Code denn eine? <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>
</blockquote>
<p>Schau mal genau hin - getItems() ruft sich rekursiv selber auf.</p>
<blockquote>
<p>Aber ich weiß nicht wie ich selbige Prozedur auch für alle Siblings, also die Geschwister laufen lassen kann. Ich glaube ich denke im Moment einfach zu kompliziert.</p>
</blockquote>
<p>Ja, du mußt eine Ebene höher denken - der Vater (Wurzelknoten) ruft die Prozedur für alle seine Kinder auf und die gehen immer tiefer in die Verzeichnisstruktur. Daß die Prozedur auch für deine Geschwister aufgerufen wird, kümmert dich jetzt nicht - da macht wiederum dein Vater.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1156225</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1156225</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 17 Oct 2006 11:35:15 GMT</pubDate></item><item><title><![CDATA[Reply to Suche Algo um einen Tree auszulesen on Tue, 17 Oct 2006 13:58:44 GMT]]></title><description><![CDATA[<p>habs geschafft. Vielen Dank!</p>
<p>gruß<br />
Daniel</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1156371</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1156371</guid><dc:creator><![CDATA[DanielusITF]]></dc:creator><pubDate>Tue, 17 Oct 2006 13:58:44 GMT</pubDate></item></channel></rss>