ok, i'd do this way for collision with slide:
When 2 sphere collide, you find how much they compenetrate, that is

compenetration := distance - (size1+size2);

now, you must pull them "apart" by that value.
You can choose how to distribute it between the two object. If one of them is fixed, just add all compenetration value to the other, elseway you can distribute it half way (so it will be possible to push something).

The problem is that compenetration value is a scalar, so you need to obtain a vector of that dimension.
Now the vector happends to be the subtraction between the positions (that must be normalized and scaled):

[pascal]
var
comp,d:TFloat;
v:TVector;
// find compenetration value
comp := distance(a.position, b.position)-(size1+size2);
if d<0 then // if collide
begin
// find vector distance (it will have length=distance, no good, must be normalized)
v:=sub(a.position,b.position);
// normalize the vector, now direction is ok, and length is 1
normalize(v);
// make length equal to compenetration value
scale(v,d);
// ok, now vector points from a to b, length d. We subtract from position
// so it will be pulled away
a.position:=sub(a.position,v);
end;
[/pascal]

That's it. If you want to distribute "sliding" between the two object, you can change it to:

[pascal]
// make length equal to half compenetration value
scale(v,d/2);
// pull them apart
a.position:=sub(a.position,v);
b.position:=add(b.position,v); // this is added becous v already points away from it
[/pascal]

Ok, this should work. IHTH