From: Olivier S. <ob...@us...> - 2005-11-26 12:43:44
|
Update of /cvsroot/jvcl/dev/JVCL3/run In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv31209/dev/JVCL3/run Modified Files: JvDBTreeView.pas Log Message: Mantis 3256: Better code to recreate the tree after docking/undocking. Index: JvDBTreeView.pas =================================================================== RCS file: /cvsroot/jvcl/dev/JVCL3/run/JvDBTreeView.pas,v retrieving revision 1.39 retrieving revision 1.40 diff -C2 -d -r1.39 -r1.40 *** JvDBTreeView.pas 22 Nov 2005 12:05:03 -0000 1.39 --- JvDBTreeView.pas 26 Nov 2005 12:43:35 -0000 1.40 *************** *** 102,107 **** procedure TimerDnDTimer(Sender: TObject); protected ! FSavedActive: Boolean; ! procedure DragOver(Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); override; --- 102,108 ---- procedure TimerDnDTimer(Sender: TObject); protected ! //FSavedActive: Boolean; ! FMastersStream:TStream; ! procedure DragOver(Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); override; *************** *** 421,424 **** --- 422,426 ---- FStartMasterValue := Null; FSelectedIndex := 1; + FMastersStream := nil; end; *************** *** 428,431 **** --- 430,434 ---- FDataLink := nil; TimerDnD.Free; + FMastersStream.Free; inherited Destroy; end; *************** *** 1388,1405 **** end; procedure TJvCustomDBTreeView.CreateWnd; begin inherited CreateWnd; ! if Assigned(FDataLink) and Assigned(FDataLink.DataSet) then ! FDataLink.DataSet.Active := FSavedActive; end; procedure TJvCustomDBTreeView.DestroyWnd; begin ! if Assigned(FDataLink) and Assigned(FDataLink.DataSet) then begin ! FSavedActive := FDataLink.DataSet.Active; ! FDataLink.DataSet.Active := False; end; inherited DestroyWnd; end; --- 1391,1448 ---- end; + // Note about the code in CreateWnd/DestroyWnd: When docking/undocking a form + // containing a DBTreeView, or even when showing/hiding such a form, the tree + // is emptied then refilled. But this makes it lose all it's master values + // The initial solution was to close then reopen the dataset, but this is + // ungraceful and was replaced by the code below, proposed in issue 3256. procedure TJvCustomDBTreeView.CreateWnd; + var + Node: TTreeNode; + temp: string; + strLength: integer; begin inherited CreateWnd; ! ! // tree is restored. Now we must restore information about Master Values ! if assigned(FMastersStream) and (Items.Count > 0) ! then begin ! Node := Items.GetFirstNode; ! FMastersStream.Position := 0; ! while Assigned(Node) do ! begin ! FMastersStream.Read(strLength, SizeOf(strLength)); ! SetLength(temp, strLength); ! FMastersStream.Read(temp[1], strLength); ! TJvDBTreeNode(Node).SetMasterValue(temp); ! Node := Node.GetNext; ! end; ! // nil is required, for the destructor not to try to destroy an already ! // destroyed object; ! FreeAndNil(FMastersStream); ! end; end; procedure TJvCustomDBTreeView.DestroyWnd; + var + Node: TTreeNode; + temp: string; + strLength: integer; begin ! if Items.Count > 0 then begin ! // save master values into stream ! FMastersStream := TMemoryStream.Create; ! Node := Items.GetFirstNode; ! while Assigned(Node) do ! begin ! // save MasterValue as string ! temp := VarToStr(TJvDBTreeNode(Node).MasterValue); ! strLength := length(temp); ! FMastersStream.Write(strLength, SizeOf(strLength)); ! FMastersStream.Write(temp[1], strLength); ! Node := Node.GetNext; ! end; end; + inherited DestroyWnd; end; |