ich habe noch einmal durchdebuggt.
Delphi-Quellcode:
var
TvItem: TTVItem;
begin
TvItem.Mask := TVIF_STATE;
das hier ist fehlerfrei und wird sehr oft problemlos ausgeführt.
bei folgender zeile ist ANode nicht nil aber hat auch keinen wert:
if ANode <> nil then // Node has been found
das ist das seltsame.
ich glaube die procedure LoadFromFile() ist fehlerhaft.
das wäre nicht der erste fehler den ich bei dieser komponente gefunden hätte.
wenn ich Oldstate := IsNodeChecked() aber auskommentiere tritt der fehler woanders auf:
Delphi-Quellcode:
procedure TGtroCustomCheckShellTreeView.SetNodeChecked(Node: TTreeNode; Checked: Boolean);
// Toggle the status of a node
// Called by CheckIt() and UncheckAll(),
const
TVIS_CHECKED = $2000;
var
TvItem: TTVItem;
begin
FillChar(TvItem, SizeOf(TvItem), 0);
with TvItem
do
begin
hItem := Node.ItemId;
Mask := TVIF_STATE;
StateMask := TVIS_STATEIMAGEMASK;
if Checked
then
TvItem.State := TVIS_CHECKED
else
TvItem.State := TVIS_CHECKED
shr 1;
TreeView_SetItem(Node.TreeView.Handle, TvItem);
// HIER tritt der fehler dann mit einer AV auf
end;
end;
das ist ja glaube ich auch logisch da ANode einfach keinen inhalt hat und das verstehe ich nicht.
das wäre also ein folgefehler aufgrund dessen dass ANode = '' ist.
folgende procedure ist dafür verantwortlich dass ANode eigentlich einen inhalt haben sollte.
Delphi-Quellcode:
function TGtroCustomCheckShellTreeView.GetNodeFromPath(const Path: string): TTreeNode;
// called by LoadFromFile()
var
FoundNode: TTreeNode;
function AppendSlash(ANode: TTreeNode): string;
begin
Result := TShellFolder(ANode.Data).PathName;
if IsDirectory(Result) then
if '\' <> Copy(Result, Length(Result), 1) then
Result := Result + '\';
end;
procedure ScanNodes(Path: string; Segment: string; ANode: TTreeNode);
var
P: Integer;
Slash: string;
begin
P := Pos('\', Path);
if P > 0 then
begin
// Split the path into segments (segments are separated by "\")
Segment := Segment + Copy(Path, 0, P); // First segment of the path
Path := Copy(Path, P + 1, Length(Path)); // Remaining segments of the path
ANode.Expand(False); // Expand the node
ANode := ANode.getFirstChild; // Move to the first child node
Slash := AppendSlash(ANode); // Append "\" if not already there
while Segment <> Slash do // Iterate on each child nodes
begin
ANode := ANode.getNextSibling;
if ANode <> nil then
Slash := AppendSlash(ANode)
else // Iterated beyond last child node
Break; // No correspondence => out!
end;
if Path <> '' then // Path is not exhausted
begin
if ANode <> nil then
begin
ANode.Expand(False);
ScanNodes(Path, Segment, ANode); // called recursively
end;
end
else // Path is exhausted
FoundNode := ANode; // Node found
end;
end;
begin
ScanNodes(Path, '', Items[0]);
Result := FoundNode; // Reference to the node if found; nil otherwise
end;
ich vermute den fehler sehr wahrscheinlich hier. beim durchdebuggen habe ich aber keinen gefunden.
gibt es keine andere möglichkeit bestimmte CheckBoxen bei einem Node Checked zu bekommen?
die oben liegenden Nodex bekomme ich alle Checked. aber wenn ich die Nodex mit
for i := 0 to meinTreeView.Items.Count - 1
durchgehe werden nur wie gesagt die ersten Nodes bearbeitet und nicht die SubNodes. alle nodes auf verdacht expandieren kann ich auch nicht.