]> git.llucax.com Git - z.facultad/75.07/algowars.git/blob - src/forms/FormConfig.pas
Import inicial después del "/var incident". :(
[z.facultad/75.07/algowars.git] / src / forms / FormConfig.pas
1 {** Formulario para configurar la aplicación}\r
2 unit FormConfig;\r
3 \r
4 interface\r
5 \r
6 uses\r
7   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,\r
8   StdCtrls, ExtCtrls,\r
9   ObjetoVolador;\r
10 \r
11 type\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
20     aLblZ: TLabel;\r
21     aLblY: TLabel;\r
22     aLblX: TLabel;\r
23     aRdGrpTipoOV: TRadioGroup;\r
24     aEditOVPosX: TEdit;\r
25     aEditOVPosY: TEdit;\r
26     aEditOVPosZ: TEdit;\r
27     aEditOVVelX: TEdit;\r
28     aEditOVVelY: TEdit;\r
29     aEditOVVelZ: TEdit;\r
30     aBtnAgregar: TButton;\r
31     aEditNPVelX: TEdit;\r
32     aEditNPVelY: TEdit;\r
33     aEditNPVelZ: TEdit;\r
34     aEditNPPosX: TEdit;\r
35     aEditNPPosY: TEdit;\r
36     aEditNPPosZ: TEdit;\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
48   private\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
56   public\r
57     { Public declarations }\r
58   end;\r
59 \r
60 var\r
61   ConfigForm: TConfigForm;\r
62 \r
63 implementation\r
64 \r
65 {$R *.DFM}\r
66 \r
67 uses\r
68   FormMain,\r
69   RegExpr,\r
70   Vectores,\r
71   NavesEnemigas,\r
72   Meteorito,\r
73   Armas,\r
74   NavePropia;\r
75 \r
76 procedure TConfigForm.aBtnAgregarClick(Sender: TObject);\r
77 var\r
78   oOV: cObjetoVolador;\r
79   oPos,\r
80   oVel: cVector;\r
81 begin\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
93                                oOV );\r
94     oPos.free;\r
95     oVel.free;\r
96   end;\r
97 end;\r
98 \r
99 procedure TConfigForm.aBtnCancelarClick(Sender: TObject);\r
100 var\r
101   oOV: cObjetoVolador;\r
102   i:   integer;\r
103   oObjetos: TList;\r
104 begin\r
105   oObjetos := MainForm.mGetObjetos;\r
106   i := 0;\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
112     else\r
113       i := i + 1;\r
114   end;\r
115   Close;\r
116 end;\r
117 \r
118 procedure TConfigForm.aBtnAceptarClick(Sender: TObject);\r
119 var\r
120   oOV: cObjetoVolador;\r
121   i:   integer;\r
122   oObjetos: TList;\r
123   oPos,\r
124   oVel: cVector;\r
125 begin\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
131   oPos.free;\r
132   oVel.free;\r
133   // Se sincronizan las listas de objetos (la del formulario con la de la list box)\r
134   oObjetos := MainForm.mGetObjetos;\r
135   i := 0;\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
140       oOV.free;\r
141     end else\r
142       i := i + 1;\r
143   end;\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
149   end;\r
150   Close;\r
151 end;\r
152 \r
153 procedure TConfigForm.aBtnQuitarClick(Sender: TObject);\r
154 var\r
155   oObjetos: TList;\r
156   oOV:      cObjetoVolador;\r
157   oPos,\r
158   oVel:     cVector;\r
159 begin\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
174       oOV.free;\r
175     oPos.free;\r
176     oVel.free;\r
177   end;\r
178 end;\r
179 \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
184 var\r
185   oOV: cObjetoVolador;\r
186   oPos: cVector;\r
187   oVel: cVector;\r
188 begin\r
189     case indice of\r
190       0: begin\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
194         oPos.free;\r
195         oVel.free;\r
196       end;\r
197       1: begin\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
201         oPos.free;\r
202         oVel.free;\r
203       end;\r
204       2: begin\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
208         oPos.free;\r
209         oVel.free;\r
210       end;\r
211       3: begin\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
215         oPos.free;\r
216         oVel.free;\r
217       end;\r
218       4: begin\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
222         oPos.free;\r
223         oVel.free;\r
224       end;\r
225       5: begin\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
229         oPos.free;\r
230         oVel.free;\r
231       end;\r
232       6: begin\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
236         oPos.free;\r
237         oVel.free;\r
238       end;\r
239       7: begin\r
240         oPos := cVector.create( StrToFloat( aEditOVPosX.Text ), StrToFloat( aEditOVPosY.Text ), StrToFloat( aEditOVPosZ.Text ) );\r
241         oOV := cMisilDirigido.create( MainForm.mGetNavePropia, oPos );\r
242         oPos.free;\r
243       end;\r
244     end;\r
245     result := oOV;\r
246 end;\r
247 procedure TConfigForm.mValidar(Sender: TObject);\r
248 const\r
249   // Expresion regular para hallar número un real\r
250   PATTERN = '^[+\-]?\d+(\,\d+)?([eE][+\-]?\d+)?$';\r
251 var\r
252   r :  TRegExpr;\r
253 begin\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
267         Text := '0';\r
268         SetFocus;\r
269       end;\r
270     finally\r
271       r.Free;\r
272     end;\r
273   end;\r
274 end;\r
275 \r
276 procedure TConfigForm.FormShow(Sender: TObject);\r
277 var\r
278   oOV:      cObjetoVolador;\r
279   i:        integer;\r
280   oObjetos: TList;\r
281   oPos,\r
282   oVel:     cVector;\r
283   tipo:     string;\r
284 begin\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
299                                      oOV );\r
300     oPos.free;\r
301     oVel.free;\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
310     oPos.free;\r
311     oVel.free;\r
312   end;\r
313 end;\r
314 \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
319 var\r
320   clase: string;\r
321 begin\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
335       result := 'Laser';\r
336     if clase = 'cMisil' then\r
337       result := 'Misil';\r
338     if clase = 'cMisilDirigido' then\r
339       result := 'Misil Dirigido';\r
340 end;\r
341 \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
346 var\r
347   clase: string;\r
348 begin\r
349     clase := oOV.ClassName;\r
350     result := -1;\r
351     if clase = 'cNavePesada' then\r
352       result := 0;\r
353     if clase = 'cNaveLiviana' then\r
354       result := 1;\r
355     if clase = 'cNaveSuicida' then\r
356       result := 2;\r
357     if clase = 'cNaveEspia' then\r
358       result := 3;\r
359     if clase = 'cMeteorito' then\r
360       result := 4;\r
361     if clase = 'cLaser' then\r
362       result := 5;\r
363     if clase = 'cMisil' then\r
364       result := 6;\r
365     if clase = 'cMisilDirigido' then\r
366       result := 7;\r
367 end;\r
368 \r
369 end.\r