I've finally resolved the problem.. I had to use a middle step with a matrix.. That could eventually optimized..

Here's the procedure:
[pascal]

function matrixLookAt(const dir, up:TVector3D):TMatrix3;
var xAxis, normUp, normDir:TVector3d;
begin
// calculate the x axis, and normalize it
xAxis := UnitVector(Mul(up,dir));
// Recalculate up so that it is perpendicular to dir (and normalize it)
normup := UnitVector(Mul(dir,xAxis));
// normalize dir
normdir := UnitVector(dir);

result[0, 0] := xAxis.x;
result[1, 0] := xAxis.y;
result[2, 0] := xAxis.z;

result[0, 1] := normup.x;
result[1, 1] := normup.y;
result[2, 1] := normup.z;

result[0, 2] := normdir.x;
result[1, 2] := normdir.y;
result[2, 2] := normdir.z;
end;

function Q_LookAt(const dir, up:TVector3D):TQuaternion;
var m:TMatrix3;
begin
m:=matrixLookAt(dir, up);
transpose(m);
result:=M2Q(m);
end;

[/pascal]

Now i really need some rest..