|
unit main;
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
IniFiles,IdURI,Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls,
|
|
ExtCtrls, Buttons, clrespuesta;
|
|
|
|
type
|
|
|
|
{ TfrmMain }
|
|
|
|
TfrmMain = class(TForm)
|
|
Image1: TImage;
|
|
Image2: TImage;
|
|
imgBien: TImage;
|
|
imgMal: TImage;
|
|
imgNC: TImage;
|
|
lblFallos: TLabel;
|
|
lblNC: TLabel;
|
|
lblTiempoUsado: TLabel;
|
|
lblNombre: TLabel;
|
|
lblFecha: TLabel;
|
|
lblNota: TLabel;
|
|
lblAciertos: TLabel;
|
|
lblPregActiva: TLabel;
|
|
lblNumPregunta: TLabel;
|
|
pnNota: TPanel;
|
|
SpeedButton1: TSpeedButton;
|
|
spAnterior: TSpeedButton;
|
|
spSiguiente: TSpeedButton;
|
|
lblTiempo: TStaticText;
|
|
lblNumPreguntas: TStaticText;
|
|
tmrCuestion: TTimer;
|
|
procedure btnOpcionesClick(sender: TObject);
|
|
procedure FormCreate(Sender: TObject);
|
|
procedure spAnteriorClick(Sender: TObject);
|
|
procedure SpeedButton1Click(Sender: TObject);
|
|
procedure tmrCuestionTimer(Sender: TObject);
|
|
private
|
|
procedure CrearMemos;
|
|
procedure EnviarRespuestas();
|
|
function LeerIni(): boolean;
|
|
procedure MostrarMemos(preguntaActiva, numOpc: integer);
|
|
function tiempo(value: integer): string;
|
|
procedure ValidarExamen();
|
|
{ private declarations }
|
|
public
|
|
{ public declarations }
|
|
procedure finalizar();
|
|
end;
|
|
type
|
|
TExamen=record
|
|
codigo:string;
|
|
tipo:integer;
|
|
nombre:string;
|
|
corregido:integer;
|
|
nota:string;
|
|
Aciertos:string;
|
|
fallos:string;
|
|
fecha:string;
|
|
tiempousado:string;
|
|
soluciones:array of integer;
|
|
respuestascorregidas:array of integer;
|
|
tiempo:integer;
|
|
archivo:string;
|
|
numPreguntas:integer;
|
|
numOpciones:integer;
|
|
pregActiva:integer;
|
|
preguntas:array of string;
|
|
opciones:array of array of string;
|
|
respuestas:array of integer;
|
|
end;
|
|
var
|
|
frmMain: TfrmMain;
|
|
lblPregunta:Array of Tlabel;
|
|
lblOpciones:Array of array of TLabel;
|
|
btnOpciones:Array of array of TSpeedButton;
|
|
f_contador:integer;
|
|
g_Examen:TExamen;
|
|
implementation
|
|
uses global;
|
|
Const
|
|
DIR_CUSTION:string='%s/recibidos_profesor/.examen.ini';
|
|
procedure TfrmMain.ValidarExamen();
|
|
var
|
|
i:integer;
|
|
mens:string;
|
|
resuelto:boolean;
|
|
begin
|
|
try
|
|
mens:='';
|
|
for i:=0 to g_Examen.NumPreguntas -1 do
|
|
if g_Examen.respuestas[i]= 0 then
|
|
mens:=mens+inttostr(i+1)+', ';
|
|
|
|
|
|
resuelto:=mens='';
|
|
if not resuelto then
|
|
begin
|
|
mens:=leftstr(mens,length(mens)-2);
|
|
mens:='Te falta las siguientes preguntas por contestar: ' +mens+' ?Deseas finalizar el examen?';
|
|
if Mensaje(mens,sino) = 1 then
|
|
EnviarRespuestas;
|
|
end
|
|
else
|
|
begin
|
|
EnviarRespuestas;
|
|
end;
|
|
except
|
|
mensaje('error al enviar examen',aceptar);
|
|
end;
|
|
end;
|
|
|
|
function Tfrmmain.tiempo(value:integer):string;
|
|
var
|
|
minutos,segundos:string;
|
|
nminutos,nsegundos:integer;
|
|
begin
|
|
nminutos:=value div 60;
|
|
if nminutos<10 then
|
|
minutos:='0'+inttostr(nminutos)
|
|
else
|
|
minutos:=inttostr(nminutos);
|
|
nsegundos:=value mod 60;
|
|
if nsegundos <10 then
|
|
segundos:='0'+inttostr(nsegundos)
|
|
else
|
|
segundos:=inttostr(nsegundos);
|
|
result:=minutos+':'+segundos;
|
|
end;
|
|
procedure Tfrmmain.MostrarMemos(preguntaActiva,numOpc:integer);
|
|
var
|
|
dada, sol,j,i:integer;
|
|
begin
|
|
for j:= 0 to g_Examen.numPreguntas-1 do
|
|
begin
|
|
lblPregunta[j].visible:=false;
|
|
for i:=0 to g_Examen.numOpciones-1 do
|
|
begin
|
|
lblOpciones[j][i].visible:=false;
|
|
lblOpciones[j][i].Font.Color:=clBlack;
|
|
btnOpciones[j][i].visible:=false;
|
|
end;
|
|
end;
|
|
imgMal.visible:=false;
|
|
imgBien.Visible:=false;
|
|
imgNc.Visible:=false;
|
|
lblPregunta[preguntaActiva].visible:=true;
|
|
If g_Examen.corregido=1 then
|
|
begin
|
|
sol:= (g_Examen.soluciones[preguntaActiva]-1);
|
|
dada:=(g_Examen.respuestascorregidas[preguntaActiva])-1;
|
|
if dada=-1 then
|
|
begin
|
|
imgNC.visible:=true;
|
|
end
|
|
else
|
|
begin
|
|
imgmal.left:=lblOpciones[preguntaActiva][dada].left-imgmal.width -5;
|
|
imgMal.top:=lblOpciones[preguntaActiva][dada].top;
|
|
imgBien.Top:=imgMal.top;
|
|
imgBien.left:=imgMal.Left;
|
|
if sol= dada then
|
|
imgBien.visible:=true
|
|
else
|
|
imgMal.visible:=true
|
|
end;
|
|
end;
|
|
for i:=0 to numOpc-1 do
|
|
begin
|
|
lblOpciones[preguntaActiva][i].visible:=true;
|
|
if g_Examen.corregido=1 then
|
|
lblOpciones[preguntaActiva][sol].Font.color:=clGreen;
|
|
btnOpciones[preguntaActiva][i].visible:=(g_Examen.corregido=0) ;
|
|
end;
|
|
application.processmessages;
|
|
end;
|
|
|
|
Function Tfrmmain.LeerIni():boolean;
|
|
var
|
|
Mifichero:TMemIniFile;
|
|
dircuestion:string;
|
|
j,i:integer;
|
|
aci,fal,nc:integer;
|
|
begin
|
|
try
|
|
dircuestion:=Format(DIR_CUSTION,[g_dirpersonal]);
|
|
result:=false;
|
|
if FileExists(dircuestion) then
|
|
begin
|
|
Mifichero:= TMemIniFile.create(dircuestion);
|
|
try
|
|
with MiFichero do
|
|
begin
|
|
g_Examen.Nombre:=ReadString('TIPO','Nombre','Prueba');
|
|
g_Examen.Codigo:=ReadString('TIPO','Codigo','');
|
|
g_Examen.Tipo:=ReadInteger('TIPO','Tipo',1);
|
|
g_Examen.Corregido:=ReadInteger('Tipo','Corregido',0);
|
|
g_Examen.Nota:=ReadString('TIPO','Nota','0');
|
|
g_Examen.Aciertos:=ReadString('TIPO','Aciertos','0');
|
|
g_Examen.Fallos:=ReadString('TIPO','Fallos','0');
|
|
g_Examen.Fecha:=ReadString('TIPO','Fecha','02/12/2008');
|
|
g_Examen.TiempoUsado:=ReadString('TIPO','TiempoUsado','02/12/2008');
|
|
g_Examen.tiempo:=ReadInteger('TIPO','Tiempo',15);
|
|
g_Examen.numPreguntas:=ReadInteger('TIPO','Numero_Preguntas',0);
|
|
g_Examen.numOpciones:=ReadInteger('TIPO','Numero_Opciones',0);
|
|
lblNumPreguntas.caption:=inttostr(g_Examen.numPreguntas);
|
|
lblNota.Caption:=g_Examen.nota;
|
|
if StrToFloat(g_Examen.Nota)>=5 then
|
|
lblNota.font.Color:=clgreen
|
|
else
|
|
lblNota.font.Color:=clred;
|
|
|
|
lblAciertos.Caption:=g_Examen.Aciertos;
|
|
lblFallos.Caption:=g_Examen.Fallos;
|
|
aci:=strtoint(g_Examen.Aciertos);
|
|
fal:=strtoint(g_Examen.Fallos);
|
|
nc:=g_Examen.numPreguntas -(aci+fal);
|
|
lblNC.caption:=inttostr(nc);
|
|
lblFecha.Caption:=g_Examen.Fecha;
|
|
lblTiempoUsado.Caption:=g_Examen.TiempoUsado;
|
|
lblNombre.Caption:=g_Examen.nombre;
|
|
if g_Examen.numPreguntas>0 then
|
|
begin
|
|
setlength(g_Examen.Preguntas,g_Examen.numPreguntas);
|
|
setlength(lblPregunta,g_Examen.numPreguntas);
|
|
setlength(g_Examen.opciones,g_Examen.numPreguntas);
|
|
setlength(lblOpciones,g_Examen.numPreguntas);
|
|
setlength(btnOpciones,g_Examen.numPreguntas);
|
|
setlength(g_Examen.respuestas,g_Examen.numPreguntas);
|
|
setlength(g_Examen.soluciones,g_Examen.numPreguntas);
|
|
setlength(g_Examen.respuestascorregidas,g_Examen.numPreguntas);
|
|
for j:=0 to g_Examen.numPreguntas -1 do
|
|
begin
|
|
g_Examen.Preguntas[j]:=ReadString('PREGUNTA_'+inttostr(j+1),'Pregunta','');
|
|
g_Examen.respuestas[j]:=0;
|
|
if g_Examen.corregido =1 then
|
|
begin
|
|
g_Examen.respuestascorregidas[j]:=ReadInteger('PREGUNTA_'+inttostr(j+1),'Respuesta',1);
|
|
g_Examen.soluciones[j]:=ReadInteger('PREGUNTA_'+inttostr(j+1),'Solucion',-1);
|
|
end;
|
|
setlength(g_Examen.opciones[j],g_Examen.numOpciones);
|
|
setlength(lblOpciones[j],g_Examen.numOpciones);
|
|
setlength(btnOpciones[j],g_Examen.numOpciones);
|
|
for i:=0 to g_Examen.numOpciones-1 do
|
|
begin;
|
|
g_Examen.opciones[j][i]:=ReadString('PREGUNTA_'+inttostr(j+1),'Opcion_'+inttostr(i+1),'');
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
f_contador:=g_Examen.tiempo;
|
|
finally
|
|
Mifichero.free;
|
|
end;
|
|
result:=true;
|
|
end
|
|
except
|
|
writeln('Error al leer el examen');
|
|
application.terminate;
|
|
end;
|
|
end;
|
|
procedure TfrmMain.EnviarRespuestas();
|
|
var
|
|
i:integer;
|
|
mirespuestas:string;
|
|
mcomando:string;
|
|
begin
|
|
try
|
|
enabled:=false;
|
|
hide;
|
|
tmrCuestion.enabled:=false;
|
|
g_tiempoempleado:=g_Examen.tiempo-f_contador;
|
|
mirespuestas:='';
|
|
for i:=0 to g_Examen.numPreguntas -1 do
|
|
mirespuestas:=mirespuestas+inttostr(g_Examen.respuestas[i]);
|
|
mcomando:='respuestasExamen '+ g_mihost+' '+inttostr(g_Examen.tiempo)+' '+ mirespuestas+' '+inttostr(g_tiempoempleado)+' '+g_usuario;
|
|
with ThrRespuesta.Create(g_hostprofe, mcomando) do resume;
|
|
|
|
except
|
|
close;
|
|
end;
|
|
end;
|
|
procedure Tfrmmain.CrearMemos;
|
|
var j,i:integer;
|
|
begin
|
|
for j:=0 to g_Examen.numPreguntas-1 do
|
|
begin
|
|
lblPregunta[j]:=Tlabel.Create(self);
|
|
with lblPregunta[j] do
|
|
begin
|
|
//font.name:='Helvetica';
|
|
font.size:=16;
|
|
//font.style:=[fsbold];
|
|
autosize:=false;
|
|
wordwrap:=true;
|
|
width:=670;
|
|
height:=81;
|
|
Parent:=self;
|
|
tag:=j;
|
|
left:= 185;
|
|
top:=112;
|
|
text:=TIdURI.URLDecode(g_Examen.Preguntas[j]);
|
|
end;
|
|
for i:=0 to g_Examen.numOpciones-1 do
|
|
begin
|
|
lblOpciones[j][i]:=TLabel.Create(self);
|
|
btnOpciones[j][i]:=TSpeedButton.Create(self);
|
|
with btnOpciones[j][i] do
|
|
begin
|
|
//font.name:='Helvetica';
|
|
font.size:=18;
|
|
//font.style:=[fsbold];
|
|
width:=40;
|
|
height:=40;
|
|
AllowAllup:=true;
|
|
color:=clwhite;
|
|
Cursor:=crHandPoint;
|
|
Caption:= intToStr(i+1);
|
|
Parent:=self;
|
|
GroupIndex:=j+1;
|
|
tag:=i+1;
|
|
left:= lblPregunta[j].left;
|
|
top:= lblPregunta[j].top + lblPregunta[j].height +10+ (i*(10+lblPregunta[j].height-20));
|
|
onClick:=@btnOpcionesClick;
|
|
end;
|
|
with lblOpciones[j][i] do
|
|
begin
|
|
//font.name:='Helvetica';
|
|
font.size:=16;
|
|
font.style:=[fsbold];
|
|
color:=clwhite;
|
|
transparent:=false;
|
|
autosize:=false;
|
|
wordwrap:=true;
|
|
width:=lblPregunta[j].width-btnOpciones[j][i].width-10;
|
|
height:=lblPregunta[j].height-18;
|
|
Parent:=self;
|
|
tag:=i+1;
|
|
left:= btnOpciones[j][i].left+btnOpciones[j][i].width+10;
|
|
top:= btnOpciones[j][i].top+10;
|
|
text:=TIdURI.URLDecode(g_Examen.opciones[j][i]);;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TfrmMain.FormCreate(Sender: TObject);
|
|
const
|
|
SMI_HOST:string='echo $LTSP_CLIENT';
|
|
var
|
|
prof:string;
|
|
begin
|
|
SetBounds(0,0,1024,768);
|
|
g_mihost:=HallarDato(SMI_HOST);
|
|
g_hostprofe:='localhost';
|
|
g_dirpersonal:=getenvironmentvariable('HOME');
|
|
g_usuario:=getenvironmentvariable('USER');
|
|
g_Examen.PregActiva:=0;
|
|
if not LeerIni() then
|
|
application.Terminate
|
|
else
|
|
begin
|
|
CrearMemos();
|
|
application.processMessages;
|
|
MostrarMemos(g_Examen.pregActiva,g_Examen.numOpciones);
|
|
application.processMessages;
|
|
pnNota.Visible:=(g_Examen.corregido=1);
|
|
tmrCuestion.enabled:=(g_Examen.corregido=0);
|
|
end;
|
|
|
|
end;
|
|
|
|
procedure TfrmMain.spAnteriorClick(Sender: TObject);
|
|
var
|
|
sumando:integer;
|
|
begin
|
|
sumando:=(sender as TSpeedbutton).tag;
|
|
spAnterior.enabled:=true;
|
|
spSiguiente.enabled:=true;
|
|
g_Examen.pregActiva:=g_Examen.pregActiva+sumando;
|
|
if g_Examen.pregActiva<=0 then
|
|
begin
|
|
spAnterior.enabled:=false;
|
|
g_Examen.pregActiva:=0;
|
|
end
|
|
else if g_Examen.pregActiva>=g_Examen.numPreguntas-1 then
|
|
begin
|
|
spsiguiente.enabled:=false;
|
|
g_Examen.pregActiva:=g_Examen.numPreguntas-1;
|
|
end;
|
|
lblPregActiva.caption:=inttostr(g_Examen.pregActiva+1);
|
|
MostrarMemos(g_Examen.pregActiva,g_Examen.numOpciones);
|
|
end;
|
|
|
|
procedure TfrmMain.SpeedButton1Click(Sender: TObject);
|
|
begin
|
|
if g_Examen.corregido=0 then
|
|
ValidarExamen
|
|
else
|
|
close;
|
|
end;
|
|
|
|
procedure TfrmMain.tmrCuestionTimer(Sender: TObject);
|
|
begin
|
|
f_contador:=f_contador-1;
|
|
lbltiempo.caption:=Tiempo(f_contador);
|
|
if f_contador = 0 then
|
|
EnviarRespuestas;
|
|
end;
|
|
|
|
procedure Tfrmmain.btnOpcionesClick(sender:TObject);
|
|
begin
|
|
if (sender as TSpeedButton).down then
|
|
g_examen.respuestas[g_Examen.PregActiva]:=(sender as TSpeedButton).tag
|
|
else
|
|
g_examen.respuestas[g_Examen.PregActiva]:=0;
|
|
end;
|
|
procedure TfrmMain.finalizar();
|
|
begin
|
|
close;
|
|
end;
|
|
|
|
initialization
|
|
{$I main.lrs}
|
|
|
|
end.
|
|
|