hallo,
auf die gefahr hin dass ich keine antworten bekomme frage ich trotzdem nach.
ich verwende folgende komponente um dateien und ordner in einer TShellTreeView mit CheckBoxen anzeigen zu lassen:
http://delphi.about.com/od/vclwritee...ocheck-stv.htm
vorher wurden keine dateien sondern nur ordner anzeigt. folgendes habe ich geändert und nun funktionierts:
Delphi-Quellcode:
procedure TGtroCustomCheckShellTreeView.AddFolder(Sender: TObject; AFolder: TShellFolder; var CanAdd: Boolean);
// Handler for the OnAddFolder event of TShellTreeView
// var
// FileExt: string;
begin
// FileExt := ExtractFileExt(AFolder.DisplayName);
// CanAdd := AFolder.IsFolder and (CompareText('.zip', FileExt) <> 0) and (CompareText('.cab', FileExt) <> 0)
CanAdd := True;
end;
CanAdd ist jetzt immer True. vorher war es bei dateien egal welchem typs immer false (AFolder.isFolder and..).
Delphi-Quellcode:
function TGtroCustomCheckShellTreeView.GetNodePath(Node: TTreeNode): string;
// return the path of the folder associated with a node
// Called by CheckIt() and EnumFiles()
begin
Result := TShellFolder(Node.Data).PathName;
end;
procedure TGtroCustomCheckShellTreeView.CheckIt(const Node: TTreeNode; IncludeSubs: Boolean; State: Boolean);
// called by WMLButtonDown() and LoadFromFile()
var
Pattern: string;
ANode: TTreeNode;
Level: Integer;
begin
Items.BeginUpdate;
try
SetNodeChecked(Node, State); // Check/uncheck the node
EnumFiles(Node, State, FList);
// Pattern := GetNodePath(Node) + '\'; // Get the path of the node (pattern)
// if IncludeSubs then
// begin
// FPatterns.Add(Pattern + '/s'); // Load the pattern in the FPatterns list
// Level := Node.Level;
//
// Node.Expand(True); // absolutely necessary as GetNext sees only visible nodes
// try
// ANode := Node.getFirstChild;
// while (ANode <> nil) and (Level < ANode.Level) do
// begin
// if State <> IsNodeChecked(ANode) then
// begin
// SetNodeChecked(ANode, State);
// EnumFiles(ANode, State, FList);
// end;
// ANode := ANode.GetNext;
// end;
// finally
// Node.Collapse(True);
// end;
// end
// else
// FPatterns.Add(Pattern); // Load the pattern in the FPatterns list
finally
Items.EndUpdate;
end; // try...finally
if Assigned(FOnCheckChanged) then
FOnCheckChanged(Self, Node, State, FList);
end;
procedure TGtroCustomCheckShellTreeView.EnumFiles(ANode: TTreeNode; State: Boolean; var List: TStringList);
// Called by CheckIt()
// var
// Path: string;
// Data: TSearchRec;
// ds: longint;
begin
if State then
List.Add(GetNodePath(ANode))
else
List.Delete(List.IndexOf(GetNodePath(ANode)));
// Path := GetNodePath(ANode);
// ds := FindFirst(Path + '\*.*', faAnyFile, Data); // Fetch the first file
// while ds = 0 do // continue as long as the result is successfull
// begin
// if (Data.Attr and faDirectory <> faDirectory) then // don't bother with directories
// if State then
// List.Add(Path + '\' + Data.Name) // add to the list
// else
// List.Delete(List.IndexOf(Path + '\' + Data.Name)); // delete from the list
// ds := FindNext(Data);
// end;
// FindClose(Data);
end;
beim ankreuzen eines ParentNodes (ist das der erste knotenpunkt eines ordners?) wurden alle unterordner/dateien mitangekreutzt. durch auskommentieren von dem code aus CheckIt() passiert das jetzt nicht mehr.
bei EnumFiles() habe ich alles auskommentiert weil wenn ich einen ordner ankreuze der VIEL inhalt hat das laden minuten dauert.
alles andere ist original.
meine frage bezieht sich jetzt auf die methode LoadFromFile(). eine datei mit zeilenweise enthaltenen pfaden zu dateien und ordnern wird korrekt eingelesen. aber hier krachts: IsNodeChecked()
Delphi-Quellcode:
function TGtroCustomCheckShellTreeView.IsNodeChecked(Node: TTreeNode): Boolean;
// Verifies if the node is checked
// Called by CheckIt(), UncheckAll(), WMLButtonDown() and LoadFromFile()
const
TVIS_CHECKED = $2000;
var
TvItem: TTVItem;
begin
TvItem.Mask := TVIF_STATE;
TvItem.hItem := Node.ItemId;
TreeView_GetItem(Node.TreeView.Handle, TvItem);
Result := (TvItem.State
and TVIS_CHECKED) = TVIS_CHECKED;
end;
// . . .
// ein teil der LoadFromFile()-Procedure
if ANode <>
nil then // Node has been found
begin
if not IncludeSubs
then
ANode.Collapse(False);
OldState := IsNodeChecked(ANode);
{ GENAU hier kracht es mit einer AV } // Check status of node
// Produce the list of files
CheckIt(ANode, IncludeSubs,
not OldState);
end;
ANode ist ja so wie es aussieht ungleich nil und trotzdem kracht es beim prüfen ob die CheckBox des Knotenpunkt checked oder nicht checked ist.
ich entschuldige mich noch einmal ausdrücklich für meine dumme aufmüpfige art und weise. aber wenn etwas nicht klappt werde ich blöderweise schnell ungeduldig. ich werde es ändern!