Thanks. I did the corrections.

But it's still the same. I even tried changing a little the rendering code:
[code=delphi]
{ .: MatrixLookAt :. }
function MatrixLookAt(const From, At, Up: TVector): TMatrix;
var
xAxis, yAxis, zAxis: TVector;
begin
zAxis := VectorSubtract(From, At);
zAxis := VectorNormalize(zAxis);
xAxis := VectorCrossProduct(Up, zAxis);
xAxis := VectorNormalize(xAxis);
yAxis := VectorCrossProduct(zAxis, xAxis);

with Result do
begin
_11 := xAxis.X;
_12 := yAxis.X;
_13 := zAxis.X;
_14 := 0.0;

_21 := xAxis.Y;
_22 := yAxis.Y;
_23 := zAxis.Y;
_24 := 0.0;

_31 := xAxis.Z;
_32 := yAxis.Z;
_33 := zAxis.Z;
_34 := 0.0;

_41 := VectorDotProduct(VectorScale(xAxis, -1.0), At);
_42 := VectorDotProduct(VectorScale(yAxis, -1.0), At);
_43 := VectorDotProduct(VectorScale(zAxis, -1.0), At);
_44 := 1.0;
end;
end;

{ .: TMainForm.Render :. }
procedure TMainForm.Render;
var
ProjMat, Cam, ModelView, Model: TMatrix;
begin
glViewport(0, 0, ClientWidth, ClientHeight);
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

// Projection update
if (ClientHeight <= 0) then
ClientHeight := 1;
ProjMat := MatrixProjection(40.0, ClientWidth / ClientHeight, 0.1, 1000.0);

// Camera transformations
Cam := MatrixLookAt(VectorNegate(Camera.Pos), VectorCreate(0.0, 0.0, -1.0),
VectorCreate(0.0, 1.0, 0.0));
Model := MatrixTransform(VectorCreate(0.0, 0.0, 0.0),
VectorCreate(0.0, TriangleRot, 0.0), VectorUniform(0.5));
ModelView := MatrixIdentity;
ModelView := MatrixMultiply(MatrixMultiply(Model, Cam), ProjMat);

// Update the shader
glUniformMatrix4fv(glGetUniformLocation(ShaderMana ger.GLSLPrograms['minimal'].
ProgramHandle, 'mvpmatrix'), 1, ByteBool(GL_FALSE), @ModelView);

// Render the triangle
glBindVertexArray(TriangleVAO);
glDrawArrays(GL_TRIANGLES, 0, 3);
glBindVertexArray(0);
end;
[/code]
The new code displays the triangle, but the translation doesn't work correctly. When I translate the triangle with an arrow key, it doesn't change its position. Once I strafe and then try to move it forward, it suddenly accelerates. Clearly it's a problem with the matrix I pass to the shader, but where is the bug hidden? The function was taken from LEAF2 engine - I hoped it was a good one.