1 {** Formulario para configurar la aplicación}
\r
7 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
\r
12 {** Formulario para configurar la aplicación}
\r
13 TConfigForm = class(TForm)
\r
14 aGrpBoxNavePropia: TGroupBox;
\r
15 aLblPosicionNP: TLabel;
\r
16 aLblVelocidadNP: TLabel;
\r
17 aGrpBoxNuevoOV: TGroupBox;
\r
18 aLblPosicionOV: TLabel;
\r
19 aLblVelocidadOV: TLabel;
\r
23 aRdGrpTipoOV: TRadioGroup;
\r
30 aBtnAgregar: TButton;
\r
37 aGrpBoxListaOV: TGroupBox;
\r
38 aListBoxObjetos: TListBox;
\r
39 aBtnQuitar: TButton;
\r
40 aBtnAceptar: TButton;
\r
41 aBtnCancelar: TButton;
\r
42 procedure aBtnAgregarClick(Sender: TObject);
\r
43 procedure aBtnCancelarClick(Sender: TObject);
\r
44 procedure aBtnAceptarClick(Sender: TObject);
\r
45 procedure aBtnQuitarClick(Sender: TObject);
\r
46 procedure mValidar(Sender: TObject);
\r
47 procedure FormShow(Sender: TObject);
\r
49 { Private declarations }
\r
50 {** Crea un objeto volador dependiendo del tipo que se eligió en los radio buttons}
\r
51 function mCrearOV(indice: integer): cObjetoVolador;
\r
52 {** Obtiene una cadena compatible con los radio buttons dependiendo de la clase del objeto}
\r
53 function mClassToStr( oOV: cObjetoVolador ): string;
\r
54 {** Obtiene el indice compatible con los radio buttons dependiendo de la clase del objeto}
\r
55 function mClassToIndex(oOV: cObjetoVolador): integer;
\r
57 { Public declarations }
\r
61 ConfigForm: TConfigForm;
\r
76 procedure TConfigForm.aBtnAgregarClick(Sender: TObject);
\r
78 oOV: cObjetoVolador;
\r
82 if aRdGrpTipoOV.ItemIndex > -1 then begin
\r
83 oOV := mCrearOV( aRdGrpTipoOV.ItemIndex );
\r
84 oPos := oOV.mGetPosicion;
\r
85 oVel := oOV.mGetVelocidad;
\r
86 aListBoxObjetos.Items.AddObject( aRdGrpTipoOV.Items[aRdGrpTipoOV.ItemIndex] +
\r
87 '; (' + FloatToStrF( oPos.mGetX, ffGeneral, 5, 5 ) +
\r
88 ';' + FloatToStrF( oPos.mGetY, ffGeneral, 5, 5 ) +
\r
89 ';' + FloatToStrF( oPos.mGetZ, ffGeneral, 5, 5 ) + ')' +
\r
90 '; (' + FloatToStrF( oVel.mGetX, ffGeneral, 5, 5 ) +
\r
91 ';' + FloatToStrF( oVel.mGetY, ffGeneral, 5, 5 ) +
\r
92 ';' + FloatToStrF( oVel.mGetZ, ffGeneral, 5, 5 ) + ')',
\r
99 procedure TConfigForm.aBtnCancelarClick(Sender: TObject);
\r
101 oOV: cObjetoVolador;
\r
105 oObjetos := MainForm.mGetObjetos;
\r
107 while i < aListBoxObjetos.Items.Count do begin
\r
108 aListBoxObjetos.ItemIndex := i;
\r
109 oOV := cObjetoVolador( aListBoxObjetos.Items.Objects[i] );
\r
110 if oObjetos.IndexOf( oOV ) = -1 then
\r
111 aBtnQuitarClick( Sender )
\r
118 procedure TConfigForm.aBtnAceptarClick(Sender: TObject);
\r
120 oOV: cObjetoVolador;
\r
126 // Se modifican los valores de la nave propia
\r
127 oPos := cVector.create( StrToFloat( aEditNPPosX.Text ), StrToFloat( aEditNPPosY.Text ), StrToFloat( aEditNPPosZ.Text ) );
\r
128 oVel := cVector.create( StrToFloat( aEditNPVelX.Text ), StrToFloat( aEditNPVelY.Text ), StrToFloat( aEditNPVelZ.Text ) );
\r
129 MainForm.mGetNavePropia.mSetPosicion( oPos );
\r
130 MainForm.mGetNavePropia.mSetVelocidad( oVel );
\r
133 // Se sincronizan las listas de objetos (la del formulario con la de la list box)
\r
134 oObjetos := MainForm.mGetObjetos;
\r
136 while i < oObjetos.Count do begin
\r
137 oOV := cObjetoVolador( oObjetos.Items[i] );
\r
138 if aListBoxObjetos.Items.IndexOfObject( oOV ) = -1 then begin
\r
139 oObjetos.Delete( i );
\r
144 for i := 0 to aListBoxObjetos.Items.Count - 1 do begin
\r
145 aListBoxObjetos.ItemIndex := i;
\r
146 oOV := cObjetoVolador( aListBoxObjetos.Items.Objects[i] );
\r
147 if oObjetos.IndexOf( oOV ) = -1 then
\r
148 oObjetos.Add( oOV );
\r
153 procedure TConfigForm.aBtnQuitarClick(Sender: TObject);
\r
156 oOV: cObjetoVolador;
\r
160 oObjetos := MainForm.mGetObjetos;
\r
161 if (aListBoxObjetos.ItemIndex > -1) and (aListBoxObjetos.Items.Count > 0 ) then begin
\r
162 oOV := cObjetoVolador( aListBoxObjetos.Items.Objects[aListBoxObjetos.ItemIndex] );
\r
163 oPos := oOV.mGetPosicion;
\r
164 oVel := oOV.mGetVelocidad;
\r
165 aEditOVPosX.Text := FloatToStrF( oPos.mGetX, ffGeneral, 5, 5 );
\r
166 aEditOVPosY.Text := FloatToStrF( oPos.mGetY, ffGeneral, 5, 5 );
\r
167 aEditOVPosZ.Text := FloatToStrF( oPos.mGetZ, ffGeneral, 5, 5 );
\r
168 aEditOVVelX.Text := FloatToStrF( oVel.mGetX, ffGeneral, 5, 5 );
\r
169 aEditOVVelY.Text := FloatToStrF( oVel.mGetY, ffGeneral, 5, 5 );
\r
170 aEditOVVelZ.Text := FloatToStrF( oVel.mGetZ, ffGeneral, 5, 5 );
\r
171 aListBoxObjetos.Items.Delete( aListBoxObjetos.ItemIndex );
\r
172 aRdGrpTipoOV.ItemIndex := mClassToIndex( oOV );
\r
173 if oObjetos.IndexOf( oOV ) = -1 then
\r
180 {** Crea un objeto volador dependiendo del tipo que se eligió en los radio buttons
\r
181 @param indice Indice del radio button
\r
182 @return Objeto Volador de la clase apropiada}
\r
183 function TConfigForm.mCrearOV( indice: integer ): cObjetoVolador;
\r
185 oOV: cObjetoVolador;
\r
191 oPos := cVector.create( StrToFloat( aEditOVPosX.Text ), StrToFloat( aEditOVPosY.Text ), StrToFloat( aEditOVPosZ.Text ) );
\r
192 oVel := cVector.create( StrToFloat( aEditOVVelX.Text ), StrToFloat( aEditOVVelY.Text ), StrToFloat( aEditOVVelZ.Text ) );
\r
193 oOV := cNavePesada.create( oPos, oVel );
\r
198 oPos := cVector.create( StrToFloat( aEditOVPosX.Text ), StrToFloat( aEditOVPosY.Text ), StrToFloat( aEditOVPosZ.Text ) );
\r
199 oVel := cVector.create( StrToFloat( aEditOVVelX.Text ), StrToFloat( aEditOVVelY.Text ), StrToFloat( aEditOVVelZ.Text ) );
\r
200 oOV := cNaveLiviana.create( oPos, oVel );
\r
205 oPos := cVector.create( StrToFloat( aEditOVPosX.Text ), StrToFloat( aEditOVPosY.Text ), StrToFloat( aEditOVPosZ.Text ) );
\r
206 oVel := cVector.create( StrToFloat( aEditOVVelX.Text ), StrToFloat( aEditOVVelY.Text ), StrToFloat( aEditOVVelZ.Text ) );
\r
207 oOV := cNaveSuicida.create( oPos, oVel );
\r
212 oPos := cVector.create( StrToFloat( aEditOVPosX.Text ), StrToFloat( aEditOVPosY.Text ), StrToFloat( aEditOVPosZ.Text ) );
\r
213 oVel := cVector.create( StrToFloat( aEditOVVelX.Text ), StrToFloat( aEditOVVelY.Text ), StrToFloat( aEditOVVelZ.Text ) );
\r
214 oOV := cNaveEspia.create( oPos, oVel );
\r
219 oPos := cVector.create( StrToFloat( aEditOVPosX.Text ), StrToFloat( aEditOVPosY.Text ), StrToFloat( aEditOVPosZ.Text ) );
\r
220 oVel := cVector.create( StrToFloat( aEditOVVelX.Text ), StrToFloat( aEditOVVelY.Text ), StrToFloat( aEditOVVelZ.Text ) );
\r
221 oOV := cMeteorito.create( oPos, oVel );
\r
226 oPos := cVector.create( StrToFloat( aEditOVPosX.Text ), StrToFloat( aEditOVPosY.Text ), StrToFloat( aEditOVPosZ.Text ) );
\r
227 oVel := cVector.create( StrToFloat( aEditOVVelX.Text ), StrToFloat( aEditOVVelY.Text ), StrToFloat( aEditOVVelZ.Text ) );
\r
228 oOV := cLaser.create( oPos, oVel );
\r
233 oPos := cVector.create( StrToFloat( aEditOVPosX.Text ), StrToFloat( aEditOVPosY.Text ), StrToFloat( aEditOVPosZ.Text ) );
\r
234 oVel := cVector.create( StrToFloat( aEditOVVelX.Text ), StrToFloat( aEditOVVelY.Text ), StrToFloat( aEditOVVelZ.Text ) );
\r
235 oOV := cMisil.create( oPos, oVel );
\r
240 oPos := cVector.create( StrToFloat( aEditOVPosX.Text ), StrToFloat( aEditOVPosY.Text ), StrToFloat( aEditOVPosZ.Text ) );
\r
241 oOV := cMisilDirigido.create( MainForm.mGetNavePropia, oPos );
\r
247 procedure TConfigForm.mValidar(Sender: TObject);
\r
249 // Expresion regular para hallar número un real
\r
250 PATTERN = '^[+\-]?\d+(\,\d+)?([eE][+\-]?\d+)?$';
\r
254 with Sender as TEdit do begin
\r
255 r := TRegExpr.Create; // Create object
\r
256 try // ensure memory release
\r
257 r.Expression := PATTERN;
\r
258 if not r.Exec( Text ) then begin // Si no es un real
\r
259 ShowMessage( 'El valor "' + Text + '" no es válido. ' +
\r
260 'Por favor ingrese un valor real expresado con "," para separar los decimales ' +
\r
261 'o expresado en forma científica (con exponente). Ejemplos:' + #13 + #10 +
\r
262 ' 10,5' + #13 + #10 +
\r
263 ' -4,1' + #13 + #10 +
\r
264 ' 10e5' + #13 + #10 +
\r
265 ' -23e-5' + #13 + #10 +
\r
266 ' 98e-5' + #13 + #10 );
\r
276 procedure TConfigForm.FormShow(Sender: TObject);
\r
278 oOV: cObjetoVolador;
\r
285 aListBoxObjetos.Clear;
\r
286 oObjetos := MainForm.mGetObjetos;
\r
287 for i := 0 to oObjetos.Count - 1 do begin
\r
288 oOV := cObjetoVolador( oObjetos.Items[i] );
\r
289 tipo := mClassToStr( oOV );
\r
290 oPos := oOV.mGetPosicion;
\r
291 oVel := oOV.mGetVelocidad;
\r
292 aListBoxObjetos.Items.AddObject( tipo +
\r
293 '; (' + FloatToStrF( oPos.mGetX, ffGeneral, 5, 5 ) +
\r
294 ';' + FloatToStrF( oPos.mGetY, ffGeneral, 5, 5 ) +
\r
295 ';' + FloatToStrF( oPos.mGetZ, ffGeneral, 5, 5 ) + ')' +
\r
296 '; (' + FloatToStrF( oVel.mGetX, ffGeneral, 5, 5 ) +
\r
297 ';' + FloatToStrF( oVel.mGetY, ffGeneral, 5, 5 ) +
\r
298 ';' + FloatToStrF( oVel.mGetZ, ffGeneral, 5, 5 ) + ')',
\r
302 oPos := MainForm.mGetNavePropia.mGetPosicion;
\r
303 oVel := MainForm.mGetNavePropia.mGetVelocidad;
\r
304 aEditNPPosX.Text := FloatToStrF( oPos.mGetX, ffGeneral, 5, 5 );
\r
305 aEditNPPosY.Text := FloatToStrF( oPos.mGetY, ffGeneral, 5, 5 );
\r
306 aEditNPPosZ.Text := FloatToStrF( oPos.mGetZ, ffGeneral, 5, 5 );
\r
307 aEditNPVelX.Text := FloatToStrF( oVel.mGetX, ffGeneral, 5, 5 );
\r
308 aEditNPVelY.Text := FloatToStrF( oVel.mGetY, ffGeneral, 5, 5 );
\r
309 aEditNPVelZ.Text := FloatToStrF( oVel.mGetZ, ffGeneral, 5, 5 );
\r
315 {** Obtiene una cadena compatible con los radio buttons dependiendo de la clase del objeto
\r
316 @param oOV Objeto Volador de la clase apropiada
\r
317 @return Cadena compatible con el titulo del Radio Button}
\r
318 function TConfigForm.mClassToStr(oOV: cObjetoVolador): string;
\r
322 clase := oOV.ClassName;
\r
323 result := 'Desconocido';
\r
324 if clase = 'cNavePesada' then
\r
325 result := 'Nave Pesada';
\r
326 if clase = 'cNaveLiviana' then
\r
327 result := 'Nave Liviana';
\r
328 if clase = 'cNaveSuicida' then
\r
329 result := 'Nave Suicida';
\r
330 if clase = 'cNaveEspia' then
\r
331 result := 'Nave Espia';
\r
332 if clase = 'cMeteorito' then
\r
333 result := 'Meteorito';
\r
334 if clase = 'cLaser' then
\r
336 if clase = 'cMisil' then
\r
338 if clase = 'cMisilDirigido' then
\r
339 result := 'Misil Dirigido';
\r
342 {** Obtiene el indice compatible con los radio buttons dependiendo de la clase del objeto
\r
343 @param oOV Objeto Volador de la clase apropiada
\r
344 @return Indice del Radio Button}
\r
345 function TConfigForm.mClassToIndex(oOV: cObjetoVolador): integer;
\r
349 clase := oOV.ClassName;
\r
351 if clase = 'cNavePesada' then
\r
353 if clase = 'cNaveLiviana' then
\r
355 if clase = 'cNaveSuicida' then
\r
357 if clase = 'cNaveEspia' then
\r
359 if clase = 'cMeteorito' then
\r
361 if clase = 'cLaser' then
\r
363 if clase = 'cMisil' then
\r
365 if clase = 'cMisilDirigido' then
\r