2 <TITLE>File: formconfig.pas </TITLE>
\r
3 <META NAME="GENERATOR" CONTENT="PasToHTML(Bystricky Vladimir)">
\r
5 <BODY BGCOLOR="#FFFFFF">
\r
6 <A NAME=formconfig.pas><CENTER><H3>formconfig.pas</H3></A><I> from <A HREF=/proyecto/doc/src-html/AlgoWars.html> Project: AlgoWars.dpr</A></I></CENTER>
\r
9 <I><FONT COLOR="Navy">{** Formulario para configurar la aplicación}</FONT></I>
\r
10 <B>unit</B> FormConfig;
\r
15 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
\r
16 StdCtrls, ExtCtrls,
\r
20 <I><FONT COLOR="Navy">{** Formulario para configurar la aplicación}</FONT></I>
\r
21 TConfigForm = <B>class</B>(TForm)
\r
22 aGrpBoxNavePropia: TGroupBox;
\r
23 aLblPosicionNP: TLabel;
\r
24 aLblVelocidadNP: TLabel;
\r
25 aGrpBoxNuevoOV: TGroupBox;
\r
26 aLblPosicionOV: TLabel;
\r
27 aLblVelocidadOV: TLabel;
\r
31 aRdGrpTipoOV: TRadioGroup;
\r
32 aEditOVPosX: TEdit;
\r
33 aEditOVPosY: TEdit;
\r
34 aEditOVPosZ: TEdit;
\r
35 aEditOVVelX: TEdit;
\r
36 aEditOVVelY: TEdit;
\r
37 aEditOVVelZ: TEdit;
\r
38 aBtnAgregar: TButton;
\r
39 aEditNPVelX: TEdit;
\r
40 aEditNPVelY: TEdit;
\r
41 aEditNPVelZ: TEdit;
\r
42 aEditNPPosX: TEdit;
\r
43 aEditNPPosY: TEdit;
\r
44 aEditNPPosZ: TEdit;
\r
45 aGrpBoxListaOV: TGroupBox;
\r
46 aListBoxObjetos: TListBox;
\r
47 aBtnQuitar: TButton;
\r
48 aBtnAceptar: TButton;
\r
49 aBtnCancelar: TButton;
\r
50 <B>procedure</B> <A HREF="#TConfigForm.aBtnAgregarClick">aBtnAgregarClick</A>(Sender: TObject);
\r
51 <B>procedure</B> <A HREF="#TConfigForm.aBtnCancelarClick">aBtnCancelarClick</A>(Sender: TObject);
\r
52 <B>procedure</B> <A HREF="#TConfigForm.aBtnAceptarClick">aBtnAceptarClick</A>(Sender: TObject);
\r
53 <B>procedure</B> <A HREF="#TConfigForm.aBtnQuitarClick">aBtnQuitarClick</A>(Sender: TObject);
\r
54 <B>procedure</B> <A HREF="#TConfigForm.mValidar">mValidar</A>(Sender: TObject);
\r
55 <B>procedure</B> <A HREF="#TConfigForm.FormShow">FormShow</A>(Sender: TObject);
\r
57 <I><FONT COLOR="Navy">{ Private declarations }</FONT></I>
\r
58 <I><FONT COLOR="Navy">{** Crea un objeto volador dependiendo del tipo que se eligió en los radio buttons}</FONT></I>
\r
59 <B>function</B> <A HREF="#TConfigForm.mCrearOV">mCrearOV</A>(indice: integer): cObjetoVolador;
\r
60 <I><FONT COLOR="Navy">{** Obtiene una cadena compatible con los radio buttons dependiendo de la clase del objeto}</FONT></I>
\r
61 <B>function</B> <A HREF="#mClassToStr">mClassToStr</A>( oOV: cObjetoVolador ): <B>string</B>;
\r
62 <I><FONT COLOR="Navy">{** Obtiene el indice compatible con los radio buttons dependiendo de la clase del objeto}</FONT></I>
\r
63 <B>function</B> <A HREF="#mClassToIndex">mClassToIndex</A>(oOV: cObjetoVolador): integer;
\r
65 <I><FONT COLOR="Navy">{ Public declarations }</FONT></I>
\r
69 ConfigForm: TConfigForm;
\r
71 <B>implementation</B>
\r
73 <I><FONT COLOR="Navy">{$R *.DFM}</FONT></I>
\r
84 <B>procedure</B> <A NAME=TConfigForm.aBtnAgregarClick>TConfigForm.aBtnAgregarClick</A>(Sender: TObject);
\r
86 oOV: cObjetoVolador;
\r
90 <B>if</B> aRdGrpTipoOV.ItemIndex > -1 <B>then</B> <B>begin</B>
\r
91 oOV := mCrearOV( aRdGrpTipoOV.ItemIndex );
\r
92 oPos := oOV.mGetPosicion;
\r
93 oVel := oOV.mGetVelocidad;
\r
94 aListBoxObjetos.Items.AddObject( aRdGrpTipoOV.Items[aRdGrpTipoOV.ItemIndex] +
\r
95 '; (' + FloatToStrF( oPos.mGetX, ffGeneral, 5, 5 ) +
\r
96 ';' + FloatToStrF( oPos.mGetY, ffGeneral, 5, 5 ) +
\r
97 ';' + FloatToStrF( oPos.mGetZ, ffGeneral, 5, 5 ) + ')' +
\r
98 '; (' + FloatToStrF( oVel.mGetX, ffGeneral, 5, 5 ) +
\r
99 ';' + FloatToStrF( oVel.mGetY, ffGeneral, 5, 5 ) +
\r
100 ';' + FloatToStrF( oVel.mGetZ, ffGeneral, 5, 5 ) + ')',
\r
107 <B>procedure</B> <A NAME=TConfigForm.aBtnCancelarClick>TConfigForm.aBtnCancelarClick</A>(Sender: TObject);
\r
109 oOV: cObjetoVolador;
\r
113 oObjetos := MainForm.mGetObjetos;
\r
115 <B>while</B> i < aListBoxObjetos.Items.Count <B>do</B> <B>begin</B>
\r
116 aListBoxObjetos.ItemIndex := i;
\r
117 oOV := cObjetoVolador( aListBoxObjetos.Items.Objects[i] );
\r
118 <B>if</B> oObjetos.IndexOf( oOV ) = -1 <B>then</B>
\r
119 aBtnQuitarClick( Sender )
\r
126 <B>procedure</B> <A NAME=TConfigForm.aBtnAceptarClick>TConfigForm.aBtnAceptarClick</A>(Sender: TObject);
\r
128 oOV: cObjetoVolador;
\r
134 <I><FONT COLOR="Navy">// Se modifican los valores de la nave propia </FONT></I>
\r
135 oPos := cVector.create( StrToFloat( aEditNPPosX.Text ), StrToFloat( aEditNPPosY.Text ), StrToFloat( aEditNPPosZ.Text ) );
\r
136 oVel := cVector.create( StrToFloat( aEditNPVelX.Text ), StrToFloat( aEditNPVelY.Text ), StrToFloat( aEditNPVelZ.Text ) );
\r
137 MainForm.mGetNavePropia.mSetPosicion( oPos );
\r
138 MainForm.mGetNavePropia.mSetVelocidad( oVel );
\r
141 <I><FONT COLOR="Navy">// Se sincronizan las listas de objetos (la del formulario con la de la list box) </FONT></I>
\r
142 oObjetos := MainForm.mGetObjetos;
\r
144 <B>while</B> i < oObjetos.Count <B>do</B> <B>begin</B>
\r
145 oOV := cObjetoVolador( oObjetos.Items[i] );
\r
146 <B>if</B> aListBoxObjetos.Items.IndexOfObject( oOV ) = -1 <B>then</B> <B>begin</B>
\r
147 oObjetos.Delete( i );
\r
149 <B>end</B> <B>else</B>
\r
152 <B>for</B> i := 0 <B>to</B> aListBoxObjetos.Items.Count - 1 <B>do</B> <B>begin</B>
\r
153 aListBoxObjetos.ItemIndex := i;
\r
154 oOV := cObjetoVolador( aListBoxObjetos.Items.Objects[i] );
\r
155 <B>if</B> oObjetos.IndexOf( oOV ) = -1 <B>then</B>
\r
156 oObjetos.Add( oOV );
\r
161 <B>procedure</B> <A NAME=TConfigForm.aBtnQuitarClick>TConfigForm.aBtnQuitarClick</A>(Sender: TObject);
\r
164 oOV: cObjetoVolador;
\r
168 oObjetos := MainForm.mGetObjetos;
\r
169 <B>if</B> (aListBoxObjetos.ItemIndex > -1) <B>and</B> (aListBoxObjetos.Items.Count > 0 ) <B>then</B> <B>begin</B>
\r
170 oOV := cObjetoVolador( aListBoxObjetos.Items.Objects[aListBoxObjetos.ItemIndex] );
\r
171 oPos := oOV.mGetPosicion;
\r
172 oVel := oOV.mGetVelocidad;
\r
173 aEditOVPosX.Text := FloatToStrF( oPos.mGetX, ffGeneral, 5, 5 );
\r
174 aEditOVPosY.Text := FloatToStrF( oPos.mGetY, ffGeneral, 5, 5 );
\r
175 aEditOVPosZ.Text := FloatToStrF( oPos.mGetZ, ffGeneral, 5, 5 );
\r
176 aEditOVVelX.Text := FloatToStrF( oVel.mGetX, ffGeneral, 5, 5 );
\r
177 aEditOVVelY.Text := FloatToStrF( oVel.mGetY, ffGeneral, 5, 5 );
\r
178 aEditOVVelZ.Text := FloatToStrF( oVel.mGetZ, ffGeneral, 5, 5 );
\r
179 aListBoxObjetos.Items.Delete( aListBoxObjetos.ItemIndex );
\r
180 aRdGrpTipoOV.ItemIndex := mClassToIndex( oOV );
\r
181 <B>if</B> oObjetos.IndexOf( oOV ) = -1 <B>then</B>
\r
188 <I><FONT COLOR="Navy">{** Crea un objeto volador dependiendo del tipo que se eligió en los radio buttons
\r
189 @param indice Indice del radio button
\r
190 @return Objeto Volador de la clase apropiada}</FONT></I>
\r
191 <B>function</B> <A NAME=TConfigForm.mCrearOV>TConfigForm.mCrearOV</A>( indice: integer ): cObjetoVolador;
\r
193 oOV: cObjetoVolador;
\r
197 <B>case</B> indice <B>of</B>
\r
199 oPos := cVector.create( StrToFloat( aEditOVPosX.Text ), StrToFloat( aEditOVPosY.Text ), StrToFloat( aEditOVPosZ.Text ) );
\r
200 oVel := cVector.create( StrToFloat( aEditOVVelX.Text ), StrToFloat( aEditOVVelY.Text ), StrToFloat( aEditOVVelZ.Text ) );
\r
201 oOV := cNavePesada.create( oPos, oVel );
\r
206 oPos := cVector.create( StrToFloat( aEditOVPosX.Text ), StrToFloat( aEditOVPosY.Text ), StrToFloat( aEditOVPosZ.Text ) );
\r
207 oVel := cVector.create( StrToFloat( aEditOVVelX.Text ), StrToFloat( aEditOVVelY.Text ), StrToFloat( aEditOVVelZ.Text ) );
\r
208 oOV := cNaveLiviana.create( oPos, oVel );
\r
213 oPos := cVector.create( StrToFloat( aEditOVPosX.Text ), StrToFloat( aEditOVPosY.Text ), StrToFloat( aEditOVPosZ.Text ) );
\r
214 oVel := cVector.create( StrToFloat( aEditOVVelX.Text ), StrToFloat( aEditOVVelY.Text ), StrToFloat( aEditOVVelZ.Text ) );
\r
215 oOV := cNaveSuicida.create( oPos, oVel );
\r
220 oPos := cVector.create( StrToFloat( aEditOVPosX.Text ), StrToFloat( aEditOVPosY.Text ), StrToFloat( aEditOVPosZ.Text ) );
\r
221 oVel := cVector.create( StrToFloat( aEditOVVelX.Text ), StrToFloat( aEditOVVelY.Text ), StrToFloat( aEditOVVelZ.Text ) );
\r
222 oOV := cNaveEspia.create( oPos, oVel );
\r
227 oPos := cVector.create( StrToFloat( aEditOVPosX.Text ), StrToFloat( aEditOVPosY.Text ), StrToFloat( aEditOVPosZ.Text ) );
\r
228 oVel := cVector.create( StrToFloat( aEditOVVelX.Text ), StrToFloat( aEditOVVelY.Text ), StrToFloat( aEditOVVelZ.Text ) );
\r
229 oOV := cMeteorito.create( oPos, oVel );
\r
234 oPos := cVector.create( StrToFloat( aEditOVPosX.Text ), StrToFloat( aEditOVPosY.Text ), StrToFloat( aEditOVPosZ.Text ) );
\r
235 oVel := cVector.create( StrToFloat( aEditOVVelX.Text ), StrToFloat( aEditOVVelY.Text ), StrToFloat( aEditOVVelZ.Text ) );
\r
236 oOV := cLaser.create( oPos, oVel );
\r
241 oPos := cVector.create( StrToFloat( aEditOVPosX.Text ), StrToFloat( aEditOVPosY.Text ), StrToFloat( aEditOVPosZ.Text ) );
\r
242 oVel := cVector.create( StrToFloat( aEditOVVelX.Text ), StrToFloat( aEditOVVelY.Text ), StrToFloat( aEditOVVelZ.Text ) );
\r
243 oOV := cMisil.create( oPos, oVel );
\r
248 oPos := cVector.create( StrToFloat( aEditOVPosX.Text ), StrToFloat( aEditOVPosY.Text ), StrToFloat( aEditOVPosZ.Text ) );
\r
249 oOV := cMisilDirigido.create( MainForm.mGetNavePropia, oPos );
\r
255 <B>procedure</B> <A NAME=TConfigForm.mValidar>TConfigForm.mValidar</A>(Sender: TObject);
\r
257 <I><FONT COLOR="Navy">// Expresion regular para hallar número un real </FONT></I>
\r
258 PATTERN = '^[+/-]?/d+(/,/d+)?([eE][+/-]?/d+)?$';
\r
262 <B>with</B> Sender <B>as</B> TEdit <B>do</B> <B>begin</B>
\r
263 r := TRegExpr.Create; <I><FONT COLOR="Navy">// Create object </FONT></I>
\r
264 <B>try</B> <I><FONT COLOR="Navy">// ensure memory release </FONT></I>
\r
265 r.Expression := PATTERN;
\r
266 <B>if</B> <B>not</B> r.Exec( Text ) <B>then</B> <B>begin</B> <I><FONT COLOR="Navy">// Si no es un real </FONT></I>
\r
267 ShowMessage( 'El valor "' + Text + '" no es válido. ' +
\r
268 'Por favor ingrese un valor real expresado con "," para separar los decimales ' +
\r
269 'o expresado en forma científica (con exponente). Ejemplos:' + #13 + #10 +
\r
270 ' 10,5' + #13 + #10 +
\r
271 ' -4,1' + #13 + #10 +
\r
272 ' 10e5' + #13 + #10 +
\r
273 ' -23e-5' + #13 + #10 +
\r
274 ' 98e-5' + #13 + #10 );
\r
284 <B>procedure</B> <A NAME=TConfigForm.FormShow>TConfigForm.FormShow</A>(Sender: TObject);
\r
286 oOV: cObjetoVolador;
\r
291 tipo: <B>string</B>;
\r
293 aListBoxObjetos.Clear;
\r
294 oObjetos := MainForm.mGetObjetos;
\r
295 <B>for</B> i := 0 <B>to</B> oObjetos.Count - 1 <B>do</B> <B>begin</B>
\r
296 oOV := cObjetoVolador( oObjetos.Items[i] );
\r
297 tipo := mClassToStr( oOV );
\r
298 oPos := oOV.mGetPosicion;
\r
299 oVel := oOV.mGetVelocidad;
\r
300 aListBoxObjetos.Items.AddObject( tipo +
\r
301 '; (' + FloatToStrF( oPos.mGetX, ffGeneral, 5, 5 ) +
\r
302 ';' + FloatToStrF( oPos.mGetY, ffGeneral, 5, 5 ) +
\r
303 ';' + FloatToStrF( oPos.mGetZ, ffGeneral, 5, 5 ) + ')' +
\r
304 '; (' + FloatToStrF( oVel.mGetX, ffGeneral, 5, 5 ) +
\r
305 ';' + FloatToStrF( oVel.mGetY, ffGeneral, 5, 5 ) +
\r
306 ';' + FloatToStrF( oVel.mGetZ, ffGeneral, 5, 5 ) + ')',
\r
310 oPos := MainForm.mGetNavePropia.mGetPosicion;
\r
311 oVel := MainForm.mGetNavePropia.mGetVelocidad;
\r
312 aEditNPPosX.Text := FloatToStrF( oPos.mGetX, ffGeneral, 5, 5 );
\r
313 aEditNPPosY.Text := FloatToStrF( oPos.mGetY, ffGeneral, 5, 5 );
\r
314 aEditNPPosZ.Text := FloatToStrF( oPos.mGetZ, ffGeneral, 5, 5 );
\r
315 aEditNPVelX.Text := FloatToStrF( oVel.mGetX, ffGeneral, 5, 5 );
\r
316 aEditNPVelY.Text := FloatToStrF( oVel.mGetY, ffGeneral, 5, 5 );
\r
317 aEditNPVelZ.Text := FloatToStrF( oVel.mGetZ, ffGeneral, 5, 5 );
\r
323 <I><FONT COLOR="Navy">{** Obtiene una cadena compatible con los radio buttons dependiendo de la clase del objeto
\r
324 @param oOV Objeto Volador de la clase apropiada
\r
325 @return Cadena compatible con el titulo del Radio Button}</FONT></I>
\r
326 <B>function</B> TConfigForm.mClassToStr(oOV: cObjetoVolador): <B>string</B>;
\r
328 clase: <B>string</B>;
\r
330 clase := oOV.ClassName;
\r
331 result := 'Desconocido';
\r
332 <B>if</B> clase = 'cNavePesada' <B>then</B>
\r
333 result := 'Nave Pesada';
\r
334 <B>if</B> clase = 'cNaveLiviana' <B>then</B>
\r
335 result := 'Nave Liviana';
\r
336 <B>if</B> clase = 'cNaveSuicida' <B>then</B>
\r
337 result := 'Nave Suicida';
\r
338 <B>if</B> clase = 'cNaveEspia' <B>then</B>
\r
339 result := 'Nave Espia';
\r
340 <B>if</B> clase = 'cMeteorito' <B>then</B>
\r
341 result := 'Meteorito';
\r
342 <B>if</B> clase = 'cLaser' <B>then</B>
\r
343 result := 'Laser';
\r
344 <B>if</B> clase = 'cMisil' <B>then</B>
\r
345 result := 'Misil';
\r
346 <B>if</B> clase = 'cMisilDirigido' <B>then</B>
\r
347 result := 'Misil Dirigido';
\r
350 <I><FONT COLOR="Navy">{** Obtiene el indice compatible con los radio buttons dependiendo de la clase del objeto
\r
351 @param oOV Objeto Volador de la clase apropiada
\r
352 @return Indice del Radio Button}</FONT></I>
\r
353 <B>function</B> TConfigForm.mClassToIndex(oOV: cObjetoVolador): integer;
\r
355 clase: <B>string</B>;
\r
357 clase := oOV.ClassName;
\r
359 <B>if</B> clase = 'cNavePesada' <B>then</B>
\r
361 <B>if</B> clase = 'cNaveLiviana' <B>then</B>
\r
363 <B>if</B> clase = 'cNaveSuicida' <B>then</B>
\r
365 <B>if</B> clase = 'cNaveEspia' <B>then</B>
\r
367 <B>if</B> clase = 'cMeteorito' <B>then</B>
\r
369 <B>if</B> clase = 'cLaser' <B>then</B>
\r
371 <B>if</B> clase = 'cMisil' <B>then</B>
\r
373 <B>if</B> clase = 'cMisilDirigido' <B>then</B>
\r