]> git.llucax.com Git - z.facultad/75.07/algowars.git/blob - doc/src-html/forms/FormConfig.pas
Import inicial después del "/var incident". :(
[z.facultad/75.07/algowars.git] / doc / src-html / forms / FormConfig.pas
1 <HTML><HEAD>\r
2 <TITLE>File: formconfig.pas </TITLE>\r
3 <META NAME="GENERATOR" CONTENT="PasToHTML(Bystricky Vladimir)">\r
4 </HEAD>\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
7 <HR>\r
8 <PRE>\r
9 <I><FONT COLOR="Navy">{** Formulario para configurar la aplicación}</FONT></I> \r
10 <B>unit</B> FormConfig; \r
11  \r
12 <B>interface</B> \r
13  \r
14 <B>uses</B> \r
15   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, \r
16   StdCtrls, ExtCtrls, \r
17   ObjetoVolador; \r
18  \r
19 <B>type</B> \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
28     aLblZ: TLabel; \r
29     aLblY: TLabel; \r
30     aLblX: 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
56   <B>private</B> \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
64   <B>public</B> \r
65     <I><FONT COLOR="Navy">{ Public declarations }</FONT></I> \r
66   <B>end</B>; \r
67  \r
68 <B>var</B> \r
69   ConfigForm: TConfigForm; \r
70  \r
71 <B>implementation</B> \r
72  \r
73 <I><FONT COLOR="Navy">{$R *.DFM}</FONT></I> \r
74  \r
75 <B>uses</B> \r
76   FormMain, \r
77   RegExpr, \r
78   Vectores, \r
79   NavesEnemigas, \r
80   Meteorito, \r
81   Armas, \r
82   NavePropia; \r
83  \r
84 <B>procedure</B> <A NAME=TConfigForm.aBtnAgregarClick>TConfigForm.aBtnAgregarClick</A>(Sender: TObject); \r
85 <B>var</B> \r
86   oOV: cObjetoVolador; \r
87   oPos, \r
88   oVel: cVector; \r
89 <B>begin</B> \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
101                                oOV ); \r
102     oPos.free; \r
103     oVel.free; \r
104   <B>end</B>; \r
105 <B>end</B>; \r
106  \r
107 <B>procedure</B> <A NAME=TConfigForm.aBtnCancelarClick>TConfigForm.aBtnCancelarClick</A>(Sender: TObject); \r
108 <B>var</B> \r
109   oOV: cObjetoVolador; \r
110   i:   integer; \r
111   oObjetos: TList; \r
112 <B>begin</B> \r
113   oObjetos := MainForm.mGetObjetos; \r
114   i := 0; \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
120     <B>else</B> \r
121       i := i + 1; \r
122   <B>end</B>; \r
123   Close; \r
124 <B>end</B>; \r
125  \r
126 <B>procedure</B> <A NAME=TConfigForm.aBtnAceptarClick>TConfigForm.aBtnAceptarClick</A>(Sender: TObject); \r
127 <B>var</B> \r
128   oOV: cObjetoVolador; \r
129   i:   integer; \r
130   oObjetos: TList; \r
131   oPos, \r
132   oVel: cVector; \r
133 <B>begin</B> \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
139   oPos.free; \r
140   oVel.free; \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
143   i := 0; \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
148       oOV.free; \r
149     <B>end</B> <B>else</B> \r
150       i := i + 1; \r
151   <B>end</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
157   <B>end</B>; \r
158   Close; \r
159 <B>end</B>; \r
160  \r
161 <B>procedure</B> <A NAME=TConfigForm.aBtnQuitarClick>TConfigForm.aBtnQuitarClick</A>(Sender: TObject); \r
162 <B>var</B> \r
163   oObjetos: TList; \r
164   oOV:      cObjetoVolador; \r
165   oPos, \r
166   oVel:     cVector; \r
167 <B>begin</B> \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
182       oOV.free; \r
183     oPos.free; \r
184     oVel.free; \r
185   <B>end</B>; \r
186 <B>end</B>; \r
187  \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
192 <B>var</B> \r
193   oOV: cObjetoVolador; \r
194   oPos: cVector; \r
195   oVel: cVector; \r
196 <B>begin</B> \r
197     <B>case</B> indice <B>of</B> \r
198       0: <B>begin</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
202         oPos.free; \r
203         oVel.free; \r
204       <B>end</B>; \r
205       1: <B>begin</B> \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
209         oPos.free; \r
210         oVel.free; \r
211       <B>end</B>; \r
212       2: <B>begin</B> \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
216         oPos.free; \r
217         oVel.free; \r
218       <B>end</B>; \r
219       3: <B>begin</B> \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
223         oPos.free; \r
224         oVel.free; \r
225       <B>end</B>; \r
226       4: <B>begin</B> \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
230         oPos.free; \r
231         oVel.free; \r
232       <B>end</B>; \r
233       5: <B>begin</B> \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
237         oPos.free; \r
238         oVel.free; \r
239       <B>end</B>; \r
240       6: <B>begin</B> \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
244         oPos.free; \r
245         oVel.free; \r
246       <B>end</B>; \r
247       7: <B>begin</B> \r
248         oPos := cVector.create( StrToFloat( aEditOVPosX.Text ), StrToFloat( aEditOVPosY.Text ), StrToFloat( aEditOVPosZ.Text ) ); \r
249         oOV := cMisilDirigido.create( MainForm.mGetNavePropia, oPos ); \r
250         oPos.free; \r
251       <B>end</B>; \r
252     <B>end</B>; \r
253     result := oOV; \r
254 <B>end</B>; \r
255 <B>procedure</B> <A NAME=TConfigForm.mValidar>TConfigForm.mValidar</A>(Sender: TObject); \r
256 <B>const</B> \r
257   <I><FONT COLOR="Navy">// Expresion regular para hallar número un real </FONT></I>\r
258   PATTERN = '^[+/-]?/d+(/,/d+)?([eE][+/-]?/d+)?$'; \r
259 <B>var</B> \r
260   r :  TRegExpr; \r
261 <B>begin</B> \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
275         Text := '0'; \r
276         SetFocus; \r
277       <B>end</B>; \r
278     <B>finally</B> \r
279       r.Free; \r
280     <B>end</B>; \r
281   <B>end</B>; \r
282 <B>end</B>; \r
283  \r
284 <B>procedure</B> <A NAME=TConfigForm.FormShow>TConfigForm.FormShow</A>(Sender: TObject); \r
285 <B>var</B> \r
286   oOV:      cObjetoVolador; \r
287   i:        integer; \r
288   oObjetos: TList; \r
289   oPos, \r
290   oVel:     cVector; \r
291   tipo:     <B>string</B>; \r
292 <B>begin</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
307                                      oOV ); \r
308     oPos.free; \r
309     oVel.free; \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
318     oPos.free; \r
319     oVel.free; \r
320   <B>end</B>; \r
321 <B>end</B>; \r
322  \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
327 <B>var</B> \r
328   clase: <B>string</B>; \r
329 <B>begin</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
348 <B>end</B>; \r
349  \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
354 <B>var</B> \r
355   clase: <B>string</B>; \r
356 <B>begin</B> \r
357     clase := oOV.ClassName; \r
358     result := -1; \r
359     <B>if</B> clase = 'cNavePesada' <B>then</B> \r
360       result := 0; \r
361     <B>if</B> clase = 'cNaveLiviana' <B>then</B> \r
362       result := 1; \r
363     <B>if</B> clase = 'cNaveSuicida' <B>then</B> \r
364       result := 2; \r
365     <B>if</B> clase = 'cNaveEspia' <B>then</B> \r
366       result := 3; \r
367     <B>if</B> clase = 'cMeteorito' <B>then</B> \r
368       result := 4; \r
369     <B>if</B> clase = 'cLaser' <B>then</B> \r
370       result := 5; \r
371     <B>if</B> clase = 'cMisil' <B>then</B> \r
372       result := 6; \r
373     <B>if</B> clase = 'cMisilDirigido' <B>then</B> \r
374       result := 7; \r
375 <B>end</B>; \r
376  \r
377 <B>end</B>. \r
378 </PRE>\r
379 </BODY>\r
380 </HTML>\r