I was stuck the whole afternoon in debugging... finally i found something interesting... Every time Delphi's Dynamic Array , (setLength fun) is extended, the original array cells' addresses may be changed... Because I use TTreeView to link its Data (Pointer) to a particular cell of a dynamic array. e.g. TreeView.Data:=@dynamic_array[i]; and unfortunately, the program adds one cell to dynamic_array somewhere... setLength(dynamic_array,length(dynamic_array)+1); the original cells' address are totally different, which is really confusing.... anyway, i solved this by taking the alternative... TreeView.Data:=Pointer(i); when i use it, i go for something like this.. dynamic_array[integer(TreeView.Data)]; Haha, everything works out finally.