Глюк с Virtual Treeview (версия 4.8.5, делфи 7, ос ХР): После перерисовки дерева (возможно из-за вложенности) последняя строка дублируется при наведении курсора на неё или свободную область. Чтобы было понятнее снял видео. Подскажите как лечится, очень надо. Вот код рисования дерева и перетаскивания на всякий случай, возможно ошибка в них: Код | procedure TFrmSprPopUp.DrawFWDTree; var iPos : Integer; Data : PFWDData; NewNode, ParentNode : PVirtualNode; s : String; begin with VTFWD do begin BeginUpdate; Clear; s := AnsiUpperCase(RV.GetCurrentItemText); with O_FRAMEWORK_DICTIONARY do begin First; while not Eof do begin if FieldByName('PARENT_FWD').IsNull then ParentNode := nil else begin while Assigned(NewNode) and (FieldByName('PARENT_FWD').AsInteger <> PFWDData(VTFWD.GetNodeData(NewNode)).ID_FWD) do NewNode := NewNode.Parent; ParentNode := NewNode; end;
NewNode := AddChild(ParentNode); Data := VTFWD.GetNodeData(NewNode); with Data^ do begin ID_FWD := FieldByName('ID_FWD').AsInteger; NAME := FieldByName('NAME').AsString; HINT_FWD := FieldByName('HINT_FWD').AsString; end; NewNode.CheckType := ctCheckBox;
iPos := Pos(AnsiUpperCase(Data^.NAME), s);
if iPos > 0 then begin NewNode.CheckState := csCheckedNormal;
ParentNode := NewNode.Parent; while Assigned(ParentNode) and (ParentNode <> RootNode) and Assigned(GetNodeData(ParentNode)) do begin ParentNode.States := ParentNode.States + [vsExpanded]; ParentNode := ParentNode.Parent; end; ParentNode := nil; System.Delete(s, iPos, Length(Data^.NAME) + 1); end; Next; end; end; EndUpdate; end; Application.ProcessMessages; end;
procedure TFrmSprPopUp.VTFWDDragDrop(Sender: TBaseVirtualTree; Source: TObject; DataObject: IDataObject; Formats: TFormatArray; Shift: TShiftState; Pt: TPoint; var Effect: Integer; Mode: TDropMode); procedure DetermineEffect; begin if Shift = [] then begin if Source = Sender then Effect := DROPEFFECT_MOVE else Effect := DROPEFFECT_COPY; end else begin if Shift = [ssCtrl] then Effect := DROPEFFECT_COPY else Effect := DROPEFFECT_MOVE; end; end; var RePaintTree : Boolean; i : Integer; Attachmode : TVTNodeAttachMode; Nodes : TNodeArray; begin Nodes := nil; // Translate the drop position into an node attach mode. case Mode of dmAbove: AttachMode := amInsertBefore; dmOnNode: AttachMode := amAddChildLast; dmBelow: AttachMode := amInsertAfter; else AttachMode := amNowhere; end;
if DataObject = nil then // else begin if Source is TBaseVirtualTree then DetermineEffect else if Boolean(Effect and DROPEFFECT_COPY) then Effect := DROPEFFECT_COPY else Effect := DROPEFFECT_MOVE;
InsertData(Sender as TVirtualStringTree, DataObject, Formats, Effect, AttachMode); end;
RePaintTree := False; Nodes := (Sender as TVirtualStringTree).GetSortedSelection(True); if Length(Nodes) > 0 then for i := 0 to Length(Nodes) - 1 do with O_FRAMEWORK_DICTIONARY do if Locate('ID_FWD', PFWDData(Sender.GetNodeData(Nodes[i])).ID_FWD, []) then begin Edit; if Sender.DropTargetNode = nil then begin RePaintTree := True; FieldByName('PARENT_FWD').Clear; end else FieldByName('PARENT_FWD').AsInteger := PFWDData(Sender.GetNodeData(Sender.DropTargetNode)).ID_FWD; Post; end; if RePaintTree then DrawFWDTree; end;
|
Это сообщение отредактировал(а) sinys - 12.8.2009, 10:40
Присоединённый файл ( Кол-во скачиваний: 25 )
ErrorVirtualTreeView.rar 462,09 Kb
|