I'm having trouble with the shaders... The shader loads just fine and I can set the uniform parameters, but I get "invalid operation" on glEnd();

Here's the vertex program:
Code:
void main(void)
{
	gl_TexCoord[0] = gl_MultiTexCoord0;
   gl_Position = ftransform();
}
Fragment program:
Code:
uniform sampler2D colorMap;

void main(void)
{
	gl_FragColor = texture2D( colorMap, gl_TexCoord[0].st); 
}
Here's the test code:
[pascal]
glActiveTextureARB(GL_TEXTURE0_ARB);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, Textures[0]);
glCheckForError();
Shader.Enable;
glCheckForError();
Shader.SetParameter('colorMap', GL_TEXTURE0_ARB);
glCheckForError();

glBegin(GL_QUADS);
glColor3f(1, 1, 1);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 1, 0);
glVertex3f(10, -10, -30);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 1, 1);
glVertex3f(10, 10, -30);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 0, 1);
glVertex3f(-10, 10, -30);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 0, 0);
glVertex3f(-10, -10, -30);
glEnd();
glCheckForError(); // Error here

Shader.Disable;
[/pascal]

The shader class is just a simple wrapper for loading the programs and setting parameters that I made for testing.

[pascal]
unit uShader;
{
Project Miniverse
http://www.projectminiverse.com

Description:
GLSL shader object

Classes:
TShader

Created:
22.04.2006 (JA)

Modified:

}

interface

uses
{$IFDEF USE_SDL}
GL, GLU, GLEXT,
{$ELSE}
dglOpenGL,
{$ENDIF}
glShader, glGeometry;

type
TShader = class(TObject)
protected
FProgramObject: GLHandleARB;
FName: String;
FResult: String;
public
constructor Create(FileName: String); overload;
constructor Create(const Name, VertexProgram, FragmentProgram: String); overload;
destructor Destroy; override;

procedure Enable;
procedure Disable;
procedure SetParameter(const Name: String; Value: TInt); overload;
procedure SetParameter(const Name: String; Value: TFloat); overload;
procedure SetParameter(const Name: String; Value1, Value2, Value3, Value4: TFloat); overload;

property Name: String read FName;
property ProgramObject: GLHandleARB read FProgramObject;
property Result: String read FResult;
end;

implementation

uses
glUtils;

constructor TShader.Create(FileName: String);
begin
inherited Create;
end;

constructor TShader.Create(const Name, VertexProgram, FragmentProgram: String);
begin
inherited Create;
FName := Name;
FProgramObject := glShader.LoadFragmentandVertexShader(FragmentProgr am, VertexProgram);
FResult := glShader.CheckForErrors(FProgramObject);
glCheckForError();
end;

destructor TShader.Destroy;
begin
inherited Destroy;
end;

procedure TShader.Enable;
begin
glUseProgramObjectARB(FProgramObject);
end;

procedure TShader.Disable;
begin
glUseProgramObjectARB(0);
end;

procedure TShader.SetParameter(const Name: String; Value: TInt);
var
p: PGLcharARB;
l: TInt;
begin
p := PGLCharArb(Name);
glUniform1iARB(glGetUniformLocationARB(FProgramObj ect, p), Value);
end;

procedure TShader.SetParameter(const Name: String; Value: TFloat);
var
p: PGLcharARB;
l: TInt;
begin
p := PGLCharARB(Name);
glUniform1fARB(glGetUniformLocationARB(FProgramObj ect, p), Value);
end;

procedure TShader.SetParameter(const Name: String; Value1, Value2, Value3, Value4: TFloat);
var
p: PGLcharARB;
l: TInt;
begin
p := PGLCharARB(Name);
glUniform4fARB(glGetUniformLocationARB(FProgramObj ect, p), Value1, Value2, Value3, Value4);
end;

end.
[/pascal]

I tried to search for possible reason, but I can't seem to find any.