Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [C#] TreeView im Thread ändern? (https://www.delphipraxis.net/139144-%5Bc-%5D-treeview-im-thread-aendern.html)

xZise 24. Aug 2009 16:45


[C#] TreeView im Thread ändern?
 
Hallo ihr,
ich will in einem Thread ein Verzeichnis und dessen Unterverzeichnisse durchsuchen. Ich frage mich nun wie man das am besten erledigt:
Code:
private void BWThread_DoWork(object sender, DoWorkEventArgs e)
{
    TVTree.BeginUpdate();
    try
    {
        TVTree.Nodes.Clear();
        SearchPath(SelPath + "\\", "", TVTree.Nodes);
    }
    finally
    {
        TVTree.EndUpdate();
    }
}
Er erlaubt mir nämlich nicht auf TVTree zuzugreifen. Aber leider brauche ich den Tree, beziehungsweise den Rootnode, damit ich die Nodes füllen kann.

SearchPath sieht übrigens so aus:
Code:
private int SearchPath(string BasePath, string SubPath, TreeNodeCollection Root)
{
    DirectoryInfo dir = new DirectoryInfo(BasePath + SubPath);
    int FileCnt = 0;
 
    foreach (DirectoryInfo SubDir in dir.GetDirectories())
    {
        TreeNode tn = new TreeNode(SubDir.Name);
        tn.Checked = true;
        if (SearchPath(BasePath, SubPath + SubDir.Name + "\\", tn.Nodes) > 0)
            Root.Add(tn);                    
    }
    foreach (FileInfo DfmFile in dir.GetFiles("*.dfm"))
    {
        TreeNodePlus tn = new TreeNodePlus(DfmFile.Name);
        tn.Checked = true;
        DfmEntry entry = new DfmEntry(DfmFile.FullName);
        tn.Entry = entry;
        Root.Add(tn);
        FileCnt++;
    }
    return FileCnt;
}
MfG
xZise

Khabarakh 24. Aug 2009 17:58

Re: [C#] TreeView im Thread ändern?
 
Brauchst du einen inkrementellen Aufbau des TreeViews? Wenn nein: Hänge die Root-Nodes einfach erst am Schluss im Hauptthread (WorkCompleted-Event) in den TreeView ein. Wenn ja, wirst du jeden Add-Aufruf in Control.BeginInvoke wrappen müssen.

PS: Parameter und lokale Variablen bitte klein schreiben. Und sieht nicht so aus, als ob du wirklich zwischen BasePath und SubPath trennen müsstest ;) . Bzw. wenn du schon mit DirectoryInfo arbeitest (würde auch mit den statischen Directory-Methoden gehen), übergebe die doch rekursiv.

xZise 24. Aug 2009 19:37

Re: [C#] TreeView im Thread ändern?
 
Ich drücke es mal so aus ;) Aufgrund des "Delphi oder C#" Threads bin ich wieder zu C# gestoßen (ich hatte mich KURZZEITIG) damit beschäftigt :D Deshalb verzeihe mir die etwas "krude" Groß/Kleinschreibung :)

Auch die Trennung zwischen Sub/Basepath ist inzwischen auch hinfällig. Und was meinst du damit, die DirectoryInfo zu übergeben?
[edit]So jetzt habe ich mal SearchPath "verbessert" (ich hoffe es):
Code:
private int SearchPath(DirectoryInfo workingDir, TreeNodeCollection root)
{
    int fileCnt = 0;

    foreach (DirectoryInfo subDir in workingDir.GetDirectories())
    {
        TreeNode tn = new TreeNode(subDir.Name);
        tn.Checked = true;
        if (SearchPath(subDir, tn.Nodes) > 0)
        {
            root.Add(tn);
            fileCnt++;
        }
    }
    foreach (FileInfo DfmFile in workingDir.GetFiles("*.dfm"))
    {
        TreeNodePlus tn = new TreeNodePlus(DfmFile.Name);
        tn.Checked = true;
        tn.Entry = new DfmEntry(DfmFile.FullName);
        root.Add(tn);
        fileCnt++;
    }
    return fileCnt;
}
  • Parameter & Variablen klein (okay DfmFile nicht fällt mir gerade auf)
  • Ein Bug behoben, dass Dateien in "tieferen" Ordnern, übersprungen wurden
  • Kein Pfad sondern ein DirectoryInfo Objekt (das ändert auch den Aufruf unten: SearchPath(new DirectoryInfo(SelPath + "\\"), Root.Nodes);)
[/edit]

Zum Eigentlichen Thema. Also ich habe das jetzt so (wahrscheinlich nicht gerade hübsch ^^ aber es geht erstmal) gelöst:
Code:
private void BWThread_DoWork(object sender, DoWorkEventArgs e)
{
    TreeNode Root = new TreeNode();
    SearchPath(SelPath + "\\", "", Root.Nodes);
    e.Result = Root;
}

private void BWThread_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    // Thread ist fertig: Ladebalken raus, Einträge eintragen :P
    TVTree.BeginUpdate();
    try
    {
        TreeNode ThreadRoot = (TreeNode)e.Result;
        TVTree.Nodes.Clear();
        foreach (TreeNode node in ThreadRoot.Nodes)
        {
            TVTree.Nodes.Add(node);
        }
        TVTree.Enabled = true;
    }
    finally
    {
        PLoading.Hide();
        TVTree.EndUpdate();
    }
}
MfG
xZise

himitsu 24. Aug 2009 19:48

Re: [C#] TreeView im Thread ändern?
 
nja, du wie schon erwähnt, solltest du die Zugriffe vom Thread aus trheadsicher absichern, :nerd:
also wärend des Zugriffs den Hauptthread "sperren".

ich mach es bei meinem SSF so, daß ich erstmal das ganze Verteichnis temporär einlese (und noch Einiges mehr),
eine interne Liste erstelle und dann zum Schluß

kurz die Threads sperre (aka Control.BeginInvoke)
und alles zusammen (je ein ganzes Verzeichnis) in den Baum einfüge
und dann wieder entsperre

eine Auflistung via FindFirstFile/FindFirst dauert bei großen Verzeichnissen ja leider etwas
und die Threads für jede Datei einzeln zu blocken fand ich etwas unökonomisch :stupid:

xZise 24. Aug 2009 19:58

Re: [C#] TreeView im Thread ändern?
 
Also mit dem Begin/EndUpdate ein Begin/EndInvoke ausführen? Aber was will er da als Parameter haben?

MfG
xZise

Khabarakh 24. Aug 2009 22:16

Re: [C#] TreeView im Thread ändern?
 
Zitat:

Zitat von xZise
wahrscheinlich nicht gerade hübsch ^^

Doch, genau so habe ich es gemeint.

@himitsu: Exakt das macht sein Code ;) . Die Synchronisierung übernimmt der BackgroundWorker.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:10 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz