2 <TITLE>File: formmain.pas </TITLE>
\r
3 <META NAME="GENERATOR" CONTENT="PasToHTML(Bystricky Vladimir)">
\r
5 <BODY BGCOLOR="#FFFFFF">
\r
6 <A NAME=formmain.pas><CENTER><H3>formmain.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 principal de la aplicación<br>
\r
12 29/11/00: Se agregan algunos controles gráficos con indicadores de energía y velocidad.
\r
13 No se incluyen en una clase Vista porque son muy pequeños.
\r
14 01/12/00: Se modifica levemente la interfaz.
\r
15 Se agregan controles para los disparos y metodos pertinentes.
\r
16 06/12/00: Se cambian minimamente los menúes, poniendo la parte del manejo
\r
17 de escenarios en un submenú del menú Archivo.
\r
18 08/12/00: Se termina de implementar la funcionalidad de los menúes
\r
19 Archivo -> Abrir ...
\r
20 Archivo -> Guardar ...
\r
21 Archivo -> Escenario -> Abrir ...
\r
22 Archivo -> Escenario -> Guardar ...
\r
23 Se completa el 'destructor', ya que faltaban liberar bastantes
\r
26 <B>unit</B> FormMain;
\r
31 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
\r
32 ExtCtrls, Menus, StdCtrls,
\r
43 <I><FONT COLOR="Navy">{** Formulario principal de la aplicación}</FONT></I>
\r
44 TMainForm = <B>class</B>(TForm)
\r
45 aBtnIniciar: TButton;
\r
46 aMainMenu: TMainMenu;
\r
48 aMenuJuego: TMenuItem;
\r
49 aMenuItemConfigurar: TMenuItem;
\r
50 aMenuItemSalir: TMenuItem;
\r
51 aTimerVista: TTimer;
\r
52 aEditEnergia: TEdit;
\r
53 aLblEnergia: TLabel;
\r
55 aMenuItemNuevoJuego: TMenuItem;
\r
56 aMenuItemGuardar: TMenuItem;
\r
57 aMenuItemAbrir: TMenuItem;
\r
58 aMenuItemAbrirEscenario: TMenuItem;
\r
59 aMenuItemGuardarEscenario: TMenuItem;
\r
61 aLblVelocidad: TLabel;
\r
62 aEditVelocidad: TEdit;
\r
64 aLblMisiles: TLabel;
\r
65 aEditMisiles: TEdit;
\r
66 aLblMisilesDir: TLabel;
\r
67 aEditMisilesDirigidos: TEdit;
\r
70 aMenuEscenario: TMenuItem;
\r
71 aSaveJuego: TSaveDialog;
\r
72 aOpenJuego: TOpenDialog;
\r
73 aSaveEscenario: TSaveDialog;
\r
74 aOpenEscenario: TOpenDialog;
\r
75 aMenuVista: TMenuItem;
\r
76 aMenuItemFrontal: TMenuItem;
\r
77 aMenuItemDerecha: TMenuItem;
\r
78 aMenuItemIzquierda: TMenuItem;
\r
79 aMenuItemTrasera: TMenuItem;
\r
80 aMenuItemSuperior: TMenuItem;
\r
81 aMenuItemInferior: TMenuItem;
\r
82 aMenuItemDelArma: TMenuItem;
\r
84 aMenuItemCalidad: TMenuItem;
\r
85 aMenuItemCambioAutomatico: TMenuItem;
\r
86 aMenuItemMapa: TMenuItem;
\r
87 <B>procedure</B> <A HREF="#TMainForm.aBtnIniciarClick">aBtnIniciarClick</A>(Sender: TObject);
\r
88 <B>procedure</B> <A HREF="#TMainForm.aTimerTimer">aTimerTimer</A>(Sender: TObject);
\r
89 <B>procedure</B> <A HREF="#TMainForm.aMenuItemConfigurarClick">aMenuItemConfigurarClick</A>(Sender: TObject);
\r
90 <B>procedure</B> <A HREF="#TMainForm.FormCreate">FormCreate</A>(Sender: TObject);
\r
91 <B>procedure</B> <A HREF="#TMainForm.aMenuItemSalirClick">aMenuItemSalirClick</A>(Sender: TObject);
\r
92 <B>procedure</B> <A HREF="#TMainForm.FormDestroy">FormDestroy</A>(Sender: TObject);
\r
93 <B>procedure</B> <A HREF="#TMainForm.FormKeyDown">FormKeyDown</A>(Sender: TObject; <B>var</B> Key: Word;
\r
94 Shift: TShiftState);
\r
95 <B>procedure</B> <A HREF="#TMainForm.FormHide">FormHide</A>(Sender: TObject);
\r
96 <B>procedure</B> <A HREF="#TMainForm.aTimerVistaTimer">aTimerVistaTimer</A>(Sender: TObject);
\r
97 <B>procedure</B> <A HREF="#TMainForm.aMenuItemGuardarClick">aMenuItemGuardarClick</A>(Sender: TObject);
\r
98 <B>procedure</B> <A HREF="#TMainForm.aMenuClick">aMenuClick</A>(Sender: TObject);
\r
99 <B>procedure</B> <A HREF="#TMainForm.aMenuItemAbrirClick">aMenuItemAbrirClick</A>(Sender: TObject);
\r
100 <B>procedure</B> <A HREF="#TMainForm.aMenuItemNuevoJuegoClick">aMenuItemNuevoJuegoClick</A>(Sender: TObject);
\r
101 <B>procedure</B> <A HREF="#TMainForm.aMenuItemGuardarEscenarioClick">aMenuItemGuardarEscenarioClick</A>(Sender: TObject);
\r
102 <B>procedure</B> <A HREF="#TMainForm.aMenuItemAbrirEscenarioClick">aMenuItemAbrirEscenarioClick</A>(Sender: TObject);
\r
103 <B>procedure</B> <A HREF="#TMainForm.CambiarVistaClick">CambiarVistaClick</A>(Sender: TObject);
\r
104 <B>procedure</B> <A HREF="#TMainForm.aMenuItemCalidadClick">aMenuItemCalidadClick</A>(Sender: TObject);
\r
105 <B>procedure</B> <A HREF="#TMainForm.DesSerializarEscenario">DesSerializarEscenario</A>( archivo: <B>string</B> );
\r
106 <B>procedure</B> <A HREF="#TMainForm.SerializarEscenario">SerializarEscenario</A>( archivo: <B>string</B> );
\r
107 <B>procedure</B> <A HREF="#TMainForm.DesSerializarJuego">DesSerializarJuego</A>( archivo: <B>string</B> );
\r
108 <B>procedure</B> <A HREF="#TMainForm.SerializarJuego">SerializarJuego</A>( archivo: <B>string</B> );
\r
109 <B>procedure</B> <A HREF="#TMainForm.aMenuItemCambioAutomaticoClick">aMenuItemCambioAutomaticoClick</A>(Sender: TObject);
\r
111 <I><FONT COLOR="Navy">{ Private declarations }</FONT></I>
\r
112 aObjetos: TList; <I><FONT COLOR="Navy">// Lista de objetos a utlizar con el espacio </FONT></I>
\r
113 aEspacio: cEspacio; <I><FONT COLOR="Navy">// Espacio a utilizar </FONT></I>
\r
114 aNavePropia: cNavePropia; <I><FONT COLOR="Navy">// Nave propia a utilizar con el espacio </FONT></I>
\r
115 aVista: cVista; <I><FONT COLOR="Navy">// Vista utilizada para dibujar el modelo en el formulario </FONT></I>
\r
116 <I><FONT COLOR="Navy">{$IFDEF DebugAlgoWars}</FONT></I>
\r
117 aDebugFile: Text; <I><FONT COLOR="Navy">// Archivo para guardar información de debug </FONT></I>
\r
118 <I><FONT COLOR="Navy">{$ENDIF}</FONT></I>
\r
120 <I><FONT COLOR="Navy">{ Public declarations }</FONT></I>
\r
121 <I><FONT COLOR="Navy">{** Obtiene la lista de objetos del formulario}</FONT></I>
\r
122 <B>function</B> <A HREF="#TMainForm.mGetObjetos">mGetObjetos</A>: TList;
\r
123 <I><FONT COLOR="Navy">{** Obtiene la nave propia del formulario}</FONT></I>
\r
124 <B>function</B> <A HREF="#TMainForm.mGetNavePropia">mGetNavePropia</A>: cNavePropia;
\r
128 MainForm: TMainForm;
\r
130 <B>implementation</B>
\r
134 ObjetoPersistente,
\r
135 SerializacionUtils,
\r
140 <I><FONT COLOR="Navy">{$R *.DFM}</FONT></I>
\r
143 DEBUGING: boolean = true; <I><FONT COLOR="Navy">// Constante para indicar si se genera el archivo de debug </FONT></I>
\r
145 <B>procedure</B> <A NAME=TMainForm.aBtnIniciarClick>TMainForm.aBtnIniciarClick</A>(Sender: TObject);
\r
147 <B>if</B> aEspacio = <B>nil</B> <B>then</B> <B>begin</B> <I><FONT COLOR="Navy">// Todavía no se inicio el juego </FONT></I>
\r
148 aEspacio := cEspacio.create( aNavePropia, aObjetos, 50 );
\r
149 aVista := cVista.create( self, aNavePropia );
\r
150 aMenuItemConfigurar.Enabled := false;
\r
151 aMenuItemGuardar.Enabled := true;
\r
152 aMenuEscenario.Enabled := false;
\r
153 aMenuVista.Enabled := true;
\r
155 <B>if</B> aTimer.Enabled = false <B>then</B> <B>begin</B>
\r
156 aTimer.enabled := true;
\r
157 aTimerVista.enabled := true;
\r
158 aBtnIniciar.caption := 'Pausa';
\r
159 <B>end</B> <B>else</B> <B>begin</B>
\r
160 aTimer.enabled := false;
\r
161 aTimerVista.enabled := false;
\r
162 aBtnIniciar.caption := 'Continuar';
\r
166 <B>procedure</B> <A NAME=TMainForm.aTimerTimer>TMainForm.aTimerTimer</A>(Sender: TObject);
\r
168 <B>try</B> <I><FONT COLOR="Navy">// Prueba el codigo </FONT></I>
\r
169 aEspacio.mActualizar;
\r
171 on e: ENavePropiaDestruida <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// Si cae en una excepcion de nave propia destruida </FONT></I>
\r
172 aBtnIniciarClick( self ); <I><FONT COLOR="Navy">// Detiene la ejecucion </FONT></I>
\r
173 aBtnIniciar.Enabled := false; <I><FONT COLOR="Navy">// No permite que se reinicie </FONT></I>
\r
174 aMenuItemGuardar.Enabled := false; <I><FONT COLOR="Navy">// No permite guardar el juego </FONT></I>
\r
175 aMenuVista.Enabled := false; <I><FONT COLOR="Navy">// No permite manipular la vista </FONT></I>
\r
176 <I><FONT COLOR="Navy">{$IFDEF DebugAlgoWars}</FONT></I>
\r
177 writeln( aDebugFile, 'GAME OVER!!!! (' + <I><FONT COLOR="Navy">// Escribe el archivo de LOG de ser necesario </FONT></I>
\r
178 e.<B>Message</B> + ')' );
\r
179 <I><FONT COLOR="Navy">{$ENDIF}</FONT></I>
\r
180 ShowMessage( 'GAME OVER!!!' ); <I><FONT COLOR="Navy">// Muestra un mensaje </FONT></I>
\r
182 on e: Exception <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// Si cae en una excepcion desconocida </FONT></I>
\r
183 aBtnIniciarClick( self ); <I><FONT COLOR="Navy">// Detiene la ejecucion </FONT></I>
\r
184 aBtnIniciar.Enabled := false; <I><FONT COLOR="Navy">// No permite que se reinicie </FONT></I>
\r
185 aMenuItemGuardar.Enabled := false; <I><FONT COLOR="Navy">// No permite guardar el juego </FONT></I>
\r
186 aMenuVista.Enabled := false; <I><FONT COLOR="Navy">// No permite manipular la vista </FONT></I>
\r
187 <I><FONT COLOR="Navy">{$IFDEF DebugAlgoWars}</FONT></I>
\r
188 writeln( aDebugFile, 'ERROR: ' + e.<B>Message</B>); <I><FONT COLOR="Navy">// Escribe el archivo de LOG de ser necesario </FONT></I>
\r
189 <I><FONT COLOR="Navy">{$ENDIF}</FONT></I>
\r
190 ShowMessage( 'ERROR: ' + e.<B>Message</B> ); <I><FONT COLOR="Navy">// Muestra un mensaje </FONT></I>
\r
195 <B>procedure</B> <A NAME=TMainForm.aTimerVistaTimer>TMainForm.aTimerVistaTimer</A>(Sender: TObject);
\r
199 <I><FONT COLOR="Navy">{$IFDEF DebugAlgoWars}</FONT></I>
\r
201 <I><FONT COLOR="Navy">{$ENDIF}</FONT></I>
\r
202 <I><FONT COLOR="Navy">// Muestra la energía de la nave </FONT></I>
\r
203 aEditEnergia.Text := IntToStr( aNavePropia.mGetEnergia );
\r
204 <I><FONT COLOR="Navy">// La velocidad esta en las unidades 1m/ms. Sabiendo que 1m = 0,001 km y </FONT></I>
\r
205 <I><FONT COLOR="Navy">// 1 h = 60 . 60 . 1000 ms, entonces 1 ms = 1 / 3600000 h </FONT></I>
\r
206 <I><FONT COLOR="Navy">// Entonces velocidad * 0,001 * 3600000 = velocidad * 3600 = km/h </FONT></I>
\r
207 aEditVelocidad.Text := FloatToStr( aNavePropia.mGetVelModulo * 3600 );
\r
208 <I><FONT COLOR="Navy">// Muestra la cantidad de misiles que le quedan a la nave </FONT></I>
\r
209 aEditMisiles.Text := IntToStr( aNavePropia.mGetMisiles );
\r
210 <I><FONT COLOR="Navy">// Muestra la cantidad de misiles dirigidos que le quedan a la nave </FONT></I>
\r
211 aEditMisilesDirigidos.Text := IntToStr( aNavePropia.mGetMisilesDirigidos );
\r
212 <I><FONT COLOR="Navy">// Muestra en el título la cámara actualmente en uso </FONT></I>
\r
213 Caption := Application.Title + ' @ ' + aVista.mGetCamaraStr;
\r
214 <I><FONT COLOR="Navy">// Muestra el arma seleccionada </FONT></I>
\r
215 <B>case</B> aNavePropia.mGetArmaSelec <B>of</B>
\r
216 OV_LASER: <B>begin</B>
\r
217 aEditArma.Text := 'Láser';
\r
218 <B>if</B> aNavePropia.mPuedeDispararLaser( <B>nil</B> ) <B>then</B>
\r
219 aEditArma.Font.Color := clLime
\r
221 aEditArma.Font.Color := clRed;
\r
223 OV_MISIL: <B>begin</B>
\r
224 aEditArma.Text := 'Misil';
\r
225 <B>if</B> aNavePropia.mPuedeDispararMisil( <B>nil</B> ) <B>then</B>
\r
226 aEditArma.Font.Color := clLime
\r
228 aEditArma.Font.Color := clRed;
\r
230 OV_MISDIR: <B>begin</B>
\r
231 aEditArma.Text := 'Misil Dirigido';
\r
232 <B>if</B> aNavePropia.mPuedeDispararMisDir( <B>nil</B> ) <B>then</B>
\r
233 aEditArma.Font.Color := clLime
\r
235 aEditArma.Font.Color := clRed;
\r
238 <B>try</B> <I><FONT COLOR="Navy">// Prueba el codigo </FONT></I>
\r
239 aVista.mDibujarVista( aEspacio );
\r
240 <I><FONT COLOR="Navy">{$IFDEF DebugAlgoWars}</FONT></I>
\r
241 <I><FONT COLOR="Navy">// Imprime la informacion del estado del espacio en este instante </FONT></I>
\r
242 writeln( aDebugFile, aEspacio.mGetDebugInfo( DI_NORMAL ) );
\r
243 <I><FONT COLOR="Navy">// Imprime la data de la vista </FONT></I>
\r
244 writeln( aDebugFile, aVista.mGetDebugInfo( DI_MAXI ) );
\r
245 writeln( aDebugFile, #13 + #10 + '====================> ' + IntToStr( i ) + ' <======================' );
\r
246 <I><FONT COLOR="Navy">{$ENDIF}</FONT></I>
\r
248 on e: ECameramanDestruido <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// Si cae en una excepcion de camara destruida </FONT></I>
\r
249 aBtnIniciarClick( self ); <I><FONT COLOR="Navy">// Detiene la ejecucion </FONT></I>
\r
250 aBtnIniciar.Enabled := false; <I><FONT COLOR="Navy">// No permite que se reinicie </FONT></I>
\r
251 <I><FONT COLOR="Navy">{$IFDEF DebugAlgoWars}</FONT></I>
\r
252 writeln( aDebugFile, 'ERROR!!!! (' + <I><FONT COLOR="Navy">// Escribe el archivo de LOG de ser necesario </FONT></I>
\r
253 e.<B>Message</B> + ')' );
\r
254 <I><FONT COLOR="Navy">{$ENDIF}</FONT></I>
\r
255 ShowMessage( 'ERROR!!!! (' + e.<B>Message</B> + ')' ); <I><FONT COLOR="Navy">// Muestra un mensaje </FONT></I>
\r
257 on e: ENavePropiaDestruida <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// Si cae en una excepcion de nave propia destruida </FONT></I>
\r
258 aBtnIniciarClick( self ); <I><FONT COLOR="Navy">// Detiene la ejecucion </FONT></I>
\r
259 aBtnIniciar.Enabled := false; <I><FONT COLOR="Navy">// No permite que se reinicie </FONT></I>
\r
260 <I><FONT COLOR="Navy">{$IFDEF DebugAlgoWars}</FONT></I>
\r
261 writeln( aDebugFile, 'GAME OVER!!!! (' + <I><FONT COLOR="Navy">// Escribe el archivo de LOG de ser necesario </FONT></I>
\r
262 e.<B>Message</B> + ')' );
\r
263 <I><FONT COLOR="Navy">{$ENDIF}</FONT></I>
\r
264 ShowMessage( 'GAME OVER!!!' ); <I><FONT COLOR="Navy">// Muestra un mensaje </FONT></I>
\r
266 on e: Exception <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// Si cae en una excepcion desconocida </FONT></I>
\r
267 aBtnIniciarClick( self ); <I><FONT COLOR="Navy">// Detiene la ejecucion </FONT></I>
\r
268 aBtnIniciar.Enabled := false; <I><FONT COLOR="Navy">// No permite que se reinicie </FONT></I>
\r
269 <I><FONT COLOR="Navy">{$IFDEF DebugAlgoWars}</FONT></I>
\r
270 writeln( aDebugFile, 'ERROR: ' + e.<B>Message</B>); <I><FONT COLOR="Navy">// Escribe el archivo de LOG de ser necesario </FONT></I>
\r
271 <I><FONT COLOR="Navy">{$ENDIF}</FONT></I>
\r
272 ShowMessage( 'ERROR: ' + e.<B>Message</B> ); <I><FONT COLOR="Navy">// Muestra un mensaje </FONT></I>
\r
277 <B>procedure</B> <A NAME=TMainForm.aMenuItemConfigurarClick>TMainForm.aMenuItemConfigurarClick</A>(Sender: TObject);
\r
279 ConfigForm.ShowModal;
\r
282 <B>procedure</B> <A NAME=TMainForm.FormCreate>TMainForm.FormCreate</A>(Sender: TObject);
\r
284 aEspacio := <B>nil</B>;
\r
285 aObjetos := TList.create;
\r
286 aNavePropia := cNavePropia.create;
\r
287 <I><FONT COLOR="Navy">// Pausa si se minimiza </FONT></I>
\r
288 Application.OnMinimize := FormHide;
\r
290 <I><FONT COLOR="Navy">{$IFDEF DebugAlgoWars}</FONT></I>
\r
291 <I><FONT COLOR="Navy">// Inicializa el archivo de texto para DEBUG </FONT></I>
\r
292 assignFile( aDebugFile, 'debug.txt' );
\r
293 rewrite( aDebugFile );
\r
294 <I><FONT COLOR="Navy">{$ENDIF}</FONT></I>
\r
296 <I><FONT COLOR="Navy">// Cargamos Algunos datos de ejemplo al principio si existe el archivo </FONT></I>
\r
297 <B>if</B> FileExists( 'comun.eaw' ) <B>then</B>
\r
298 <B>try</B> <I><FONT COLOR="Navy">// Prueba que no haya errores </FONT></I>
\r
299 DesSerializarEscenario( 'comun.eaw' );
\r
301 on e: ESerializacion <B>do</B> <B>begin</B>
\r
302 ShowMessage( 'Hubo un error al recuperar el escenario por defecto "comun.eaw": ' + e.<B>Message</B> ); <I><FONT COLOR="Navy">// Muestra un mensaje </FONT></I>
\r
303 <I><FONT COLOR="Navy">// Resetea todos los valores ... </FONT></I>
\r
307 aEspacio := <B>nil</B>;
\r
308 aObjetos := TList.create;
\r
309 aNavePropia := cNavePropia.create;
\r
314 <B>procedure</B> <A NAME=TMainForm.aMenuItemSalirClick>TMainForm.aMenuItemSalirClick</A>(Sender: TObject);
\r
319 <B>procedure</B> <A NAME=TMainForm.FormDestroy>TMainForm.FormDestroy</A>(Sender: TObject);
\r
321 ov: cObjetoVolador;
\r
323 <I><FONT COLOR="Navy">// Si el espacio no esta creado, liberamos la nave propia y los objetos </FONT></I>
\r
324 <B>if</B> aEspacio = <B>nil</B> <B>then</B> <B>begin</B>
\r
326 <B>while</B> aObjetos.Count > 0 <B>do</B> <B>begin</B>
\r
327 ov := aObjetos.First;
\r
328 aObjetos.Remove( ov );
\r
332 <B>end</B> <B>else</B> <I><FONT COLOR="Navy">// Si el espacio esta creado ... </FONT></I>
\r
333 <I><FONT COLOR="Navy">// aObjetos y aNavePropia se liberan cuando se libera el aEspacio </FONT></I>
\r
336 <I><FONT COLOR="Navy">{$IFDEF DebugAlgoWars}</FONT></I>
\r
337 <I><FONT COLOR="Navy">// Cierra el archivo para DEBUG </FONT></I>
\r
338 closeFile( aDebugFile );
\r
339 <I><FONT COLOR="Navy">{$ENDIF}</FONT></I>
\r
342 <I><FONT COLOR="Navy">{** Obtiene la lista de objetos del formulario
\r
343 @return Lista de objetos que utilizara el espacio}</FONT></I>
\r
344 <B>function</B> <A NAME=TMainForm.mGetObjetos>TMainForm.mGetObjetos</A>: TList;
\r
346 result := aObjetos;
\r
349 <I><FONT COLOR="Navy">{** Obtiene la nave propia del formulario
\r
350 @return Nave propia que utilizara el espacio}</FONT></I>
\r
351 <B>function</B> <A NAME=TMainForm.mGetNavePropia>TMainForm.mGetNavePropia</A>: cNavePropia;
\r
353 result := aNavePropia;
\r
356 <B>procedure</B> <A NAME=TMainForm.FormKeyDown>TMainForm.FormKeyDown</A>(Sender: TObject; <B>var</B> Key: Word;
\r
357 Shift: TShiftState);
\r
359 <I><FONT COLOR="Navy">{$IFDEF DebugAlgoWars}</FONT></I>
\r
360 writeln( aDebugFile, 'Presiono la letra: ', Key );
\r
361 <I><FONT COLOR="Navy">{$ENDIF}</FONT></I>
\r
362 <B>if</B> aTimer.Enabled <B>then</B>
\r
363 <B>case</B> Key <B>of</B>
\r
364 <I><FONT COLOR="Navy">// 8.7e-3 es 0,5 grados </FONT></I>
\r
365 73<I><FONT COLOR="Navy">{I}</FONT></I>: aNavePropia.mGirarArriba( 8.7e-3 );
\r
366 75<I><FONT COLOR="Navy">{K}</FONT></I>: aNavePropia.mGirarAbajo( 8.7e-3 );
\r
367 74<I><FONT COLOR="Navy">{J}</FONT></I>: aNavePropia.mGirarIzquierda( 8.7e-3 );
\r
368 76<I><FONT COLOR="Navy">{L}</FONT></I>: aNavePropia.mGirarDerecha( 8.7e-3 );
\r
369 85<I><FONT COLOR="Navy">{U}</FONT></I>: aNavePropia.mRotarDerecha( 8.7e-3 );
\r
370 79<I><FONT COLOR="Navy">{O}</FONT></I>: aNavePropia.mRotarIzquierda( 8.7e-3 );
\r
371 <I><FONT COLOR="Navy">// 0.005 es 18 km/h </FONT></I>
\r
372 81<I><FONT COLOR="Navy">{Q}</FONT></I>: aNavePropia.mAcelerar( 0.005 );
\r
373 65<I><FONT COLOR="Navy">{A}</FONT></I>: aNavePropia.mDesacelerar( 0.005 );
\r
374 <I><FONT COLOR="Navy">// Disparos </FONT></I>
\r
375 83<I><FONT COLOR="Navy">{S}</FONT></I>: <B>begin</B> <I><FONT COLOR="Navy">// Dispara creando la nueva camara del arma si hubo un disparo </FONT></I>
\r
376 aVista.mCrearCamaraDeArma( aNavePropia.mIntentarDisparo );
\r
377 <B>if</B> aMenuItemCambioAutomatico.Checked <B>then</B> <B>begin</B> <I><FONT COLOR="Navy">// Si está activado el cambio automatico... </FONT></I>
\r
378 CambiarVistaClick( aMenuItemDelArma ); <I><FONT COLOR="Navy">// Cambia la camara </FONT></I>
\r
381 87<I><FONT COLOR="Navy">{W}</FONT></I>: aNavePropia.mSeleccionarArmaSig;
\r
382 84<I><FONT COLOR="Navy">{T}</FONT></I>: aNavePropia.mCambiarLockeado( aEspacio.mGetObjetos );
\r
383 <I><FONT COLOR="Navy">// Vista </FONT></I>
\r
384 67<I><FONT COLOR="Navy">{C}</FONT></I>: aVista.mCamaraSiguiente;
\r
388 <B>procedure</B> <A NAME=TMainForm.FormHide>TMainForm.FormHide</A>(Sender: TObject);
\r
390 <B>if</B> aBtnIniciar.caption = 'Pausa' <B>then</B> <I><FONT COLOR="Navy">// Esta jugando </FONT></I>
\r
391 aBtnIniciarClick( self ); <I><FONT COLOR="Navy">// Pausa el juego </FONT></I>
\r
394 <B>procedure</B> <A NAME=TMainForm.aMenuItemGuardarClick>TMainForm.aMenuItemGuardarClick</A>(Sender: TObject);
\r
397 <B>if</B> aTimer.Enabled = true <B>then</B> <I><FONT COLOR="Navy">// Si esta funcinando, </FONT></I>
\r
398 aBtnIniciarClick( self ); <I><FONT COLOR="Navy">// lo interrumpe... </FONT></I>
\r
399 <B>if</B> aSaveJuego.Execute <B>then</B> <I><FONT COLOR="Navy">// Si eligio un archivo... </FONT></I>
\r
400 SerializarJuego( aSaveJuego.Filename );
\r
403 <B>procedure</B> <A NAME=TMainForm.aMenuClick>TMainForm.aMenuClick</A>(Sender: TObject);
\r
405 <B>if</B> aTimer.Enabled = true <B>then</B> <I><FONT COLOR="Navy">// Si esta funcinando, </FONT></I>
\r
406 aBtnIniciarClick( self ); <I><FONT COLOR="Navy">// lo interrumpe... </FONT></I>
\r
409 <B>procedure</B> <A NAME=TMainForm.aMenuItemAbrirClick>TMainForm.aMenuItemAbrirClick</A>(Sender: TObject);
\r
412 <B>if</B> aTimer.Enabled = true <B>then</B> <I><FONT COLOR="Navy">// Si esta funcinando, </FONT></I>
\r
413 aBtnIniciarClick( self ); <I><FONT COLOR="Navy">// lo interrumpe... </FONT></I>
\r
414 <B>if</B> aOpenJuego.Execute <B>then</B> <I><FONT COLOR="Navy">// Si eligio un archivo... </FONT></I>
\r
415 DesSerializarJuego( aOpenJuego.Filename );
\r
418 <B>procedure</B> <A NAME=TMainForm.aMenuItemNuevoJuegoClick>TMainForm.aMenuItemNuevoJuegoClick</A>(Sender: TObject);
\r
420 ov: cObjetoVolador;
\r
423 <B>if</B> aTimer.Enabled = true <B>then</B> <I><FONT COLOR="Navy">// Si esta funcinando, </FONT></I>
\r
424 aBtnIniciarClick( self ); <I><FONT COLOR="Navy">// lo interrumpe... </FONT></I>
\r
425 <B>if</B> MessageDlg( 'Se perderán todos los datos del juego actual ¿Está seguro que desea empezar un juego nuevo?',
\r
426 mtConfirmation, [mbYes, mbNo], 0) = mrYes <B>then</B> <B>begin</B>
\r
427 <I><FONT COLOR="Navy">// Si el espacio no esta creado, liberamos la nave propia y los objetos </FONT></I>
\r
428 <B>if</B> aEspacio = <B>nil</B> <B>then</B> <B>begin</B>
\r
430 <B>while</B> aObjetos.Count > 0 <B>do</B> <B>begin</B>
\r
431 ov := aObjetos.First;
\r
432 aObjetos.Remove( ov );
\r
436 <B>end</B> <B>else</B> <I><FONT COLOR="Navy">// Si el espacio esta creado ... </FONT></I>
\r
437 <I><FONT COLOR="Navy">// aObjetos y aNavePropia se liberan cuando se libera el aEspacio </FONT></I>
\r
440 aEspacio := <B>nil</B>;
\r
441 aVista := <B>nil</B>;
\r
442 aObjetos := TList.create;
\r
443 aNavePropia := cNavePropia.create;
\r
444 aBtnIniciar.caption := 'Iniciar';
\r
445 aMenuItemConfigurar.Enabled := true;
\r
446 aMenuItemGuardar.Enabled := false;
\r
447 aMenuEscenario.Enabled := true;
\r
448 aBtnIniciar.Enabled := true; <I><FONT COLOR="Navy">// Se puede iniciar el juego </FONT></I>
\r
452 <B>procedure</B> <A NAME=TMainForm.aMenuItemGuardarEscenarioClick>TMainForm.aMenuItemGuardarEscenarioClick</A>(Sender: TObject);
\r
455 <B>if</B> aTimer.Enabled = true <B>then</B> <I><FONT COLOR="Navy">// Si esta funcinando, </FONT></I>
\r
456 aBtnIniciarClick( self ); <I><FONT COLOR="Navy">// lo interrumpe... </FONT></I>
\r
457 <B>if</B> aSaveEscenario.Execute <B>then</B> <I><FONT COLOR="Navy">// Si eligio un archivo... </FONT></I>
\r
458 SerializarEscenario( aSaveEscenario.Filename );
\r
461 <B>procedure</B> <A NAME=TMainForm.aMenuItemAbrirEscenarioClick>TMainForm.aMenuItemAbrirEscenarioClick</A>(Sender: TObject);
\r
464 <B>if</B> aTimer.Enabled = true <B>then</B> <I><FONT COLOR="Navy">// Si esta funcinando, </FONT></I>
\r
465 aBtnIniciarClick( self ); <I><FONT COLOR="Navy">// lo interrumpe... </FONT></I>
\r
466 <B>if</B> aOpenEscenario.Execute <B>then</B> <I><FONT COLOR="Navy">// Si eligio un archivo... </FONT></I>
\r
467 DesSerializarEscenario( aOpenEscenario.Filename ); <I><FONT COLOR="Navy">// Deserializa el archivo </FONT></I>
\r
470 <B>procedure</B> <A NAME=TMainForm.CambiarVistaClick>TMainForm.CambiarVistaClick</A>(Sender: TObject);
\r
472 <B>if</B> Sender = aMenuItemFrontal <B>then</B>
\r
473 aVista.mCambiarCamara( CAMARA_FRONTAL )
\r
474 <B>else</B> <B>if</B> Sender = aMenuItemDerecha <B>then</B>
\r
475 aVista.mCambiarCamara( CAMARA_LATDER )
\r
476 <B>else</B> <B>if</B> Sender = aMenuItemIzquierda <B>then</B>
\r
477 aVista.mCambiarCamara( CAMARA_LATIZQ )
\r
478 <B>else</B> <B>if</B> Sender = aMenuItemTrasera <B>then</B>
\r
479 aVista.mCambiarCamara( CAMARA_TRASERA )
\r
480 <B>else</B> <B>if</B> Sender = aMenuItemSuperior <B>then</B>
\r
481 aVista.mCambiarCamara( CAMARA_ARRIBA )
\r
482 <B>else</B> <B>if</B> Sender = aMenuItemInferior <B>then</B>
\r
483 aVista.mCambiarCamara( CAMARA_ABAJO )
\r
484 <B>else</B> <B>if</B> Sender = aMenuItemDelArma <B>then</B>
\r
485 aVista.mCambiarCamara( CAMARA_ARMA )
\r
486 <B>else</B> <B>if</B> Sender = aMenuItemMapa <B>then</B>
\r
487 aVista.mCambiarCamara( CAMARA_MAPA )
\r
490 <B>procedure</B> <A NAME=TMainForm.aMenuItemCalidadClick>TMainForm.aMenuItemCalidadClick</A>(Sender: TObject);
\r
492 aVista.mCambiarCalidad;
\r
493 aMenuItemCalidad.Checked := <B>not</B> aMenuItemCalidad.Checked;
\r
496 <B>procedure</B> <A NAME=TMainForm.DesSerializarEscenario>TMainForm.DesSerializarEscenario</A>( archivo: <B>string</B> );
\r
499 str: <B>string</B>;
\r
502 ov: cObjetoVolador;
\r
508 assignFile( f, archivo ); <I><FONT COLOR="Navy">// Asigna el archivo </FONT></I>
\r
509 reset( f ); <I><FONT COLOR="Navy">// Abre el archivo </FONT></I>
\r
511 <B>while</B> <B>not</B> eof( f ) <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// Lee el archivo </FONT></I>
\r
512 <B>read</B>( f, c ); <I><FONT COLOR="Navy">// caracter por caracter </FONT></I>
\r
513 recuperado := recuperado + c; <I><FONT COLOR="Navy">// Almacenandolo en un string </FONT></I>
\r
515 closeFile( f ); <I><FONT COLOR="Navy">// Cierra el archivo </FONT></I>
\r
516 <B>except</B> <I><FONT COLOR="Navy">// Si hay algun error </FONT></I>
\r
517 on e: Exception <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// Muestra un mensaje </FONT></I>
\r
518 ShowMessage( 'Hubo un error al leer el archivo "' +
\r
519 archivo + '": ' + #13 + #10 +
\r
520 e.<B>Message</B> + #13 + #10 +
\r
521 'Por favor lea la Sección de Errores del Manual del ' +
\r
522 'Usuario para más información' ); <I><FONT COLOR="Navy">// Muestra un mensaje </FONT></I>
\r
525 r := TRegExpr.create;
\r
526 <B>try</B> <I><FONT COLOR="Navy">// ensure memory release </FONT></I>
\r
527 r.Expression := '<eaw/s+version=(/d+[/./d+]*)/s*>/s*(.+)/s*</eaw>';
\r
528 <B>if</B> r.Exec ( recuperado ) <B>then</B>
\r
529 <B>if</B> r.Match[1] = '1.0' <B>then</B> <B>begin</B> <I><FONT COLOR="Navy">// Si el archivo es version 1.0 </FONT></I>
\r
530 str := r.Match[2];
\r
531 <B>try</B> <I><FONT COLOR="Navy">// ensure memory release </FONT></I>
\r
532 r.Expression := '<navepropia>/s*(.+)/s*</navepropia>';
\r
533 <B>if</B> r.Exec ( str ) <B>then</B> <B>begin</B>
\r
534 aNavePropia.free; <I><FONT COLOR="Navy">// Libera la vieja nave propia </FONT></I>
\r
535 <I><FONT COLOR="Navy">// Obtiene la nueva navepropia de la serializacion </FONT></I>
\r
536 aNavePropia := cNavePropia.crearDeSerializado( r.Match[1] );
\r
537 <B>try</B> <I><FONT COLOR="Navy">// se fija si hay errores al extraer los datos </FONT></I>
\r
538 r.Expression := '<objetos/s+total=(/d+)/s*>/s*(.+)/s*</objetos>'; <I><FONT COLOR="Navy">// contruye la expresion regular a buscar </FONT></I>
\r
539 <B>if</B> r.Exec ( str ) <B>then</B> <B>begin</B> <I><FONT COLOR="Navy">// Ejecuta la expresion. Si la encuentra... </FONT></I>
\r
540 total := StrToInt( r.Match[1] );
\r
541 str := r.Match[2];
\r
542 <I><FONT COLOR="Navy">// libera los objetos viejos </FONT></I>
\r
543 <B>while</B> aObjetos.Count > 0 <B>do</B> <B>begin</B>
\r
544 ov := aObjetos.First;
\r
545 aObjetos.Remove( ov );
\r
548 <B>for</B> i := 0 <B>to</B> total - 1 <B>do</B> <B>begin</B>
\r
549 <I><FONT COLOR="Navy">// OBJETO N </FONT></I>
\r
550 <B>try</B> <I><FONT COLOR="Navy">// se fija si hay errores al extraer los datos </FONT></I>
\r
551 r.Expression := '<objeto' + IntToStr( i ) + '/s+class=([/w/d]+)/s*>/s*(.+)/s*</objeto' + IntToStr( i ) + '>'; <I><FONT COLOR="Navy">// contruye la expresion regular a buscar </FONT></I>
\r
552 <B>if</B> r.Exec ( str ) <B>then</B> <B>begin</B> <I><FONT COLOR="Navy">// Ejecuta la expresion. Si la encuentra... </FONT></I>
\r
553 <I><FONT COLOR="Navy">// lo crea segun su clase y lo agrega a la lista </FONT></I>
\r
554 ov := restaurarObjeto( r.Match[1], r.Match[2] );
\r
555 aObjetos.Add( ov );
\r
556 <I><FONT COLOR="Navy">// Elimina duplicados </FONT></I>
\r
557 <B>if</B> ov <B>is</B> cMisilDirigido <B>then</B> <B>begin</B>
\r
558 (ov <B>as</B> cMisilDirigido).mGetObjetivo.free; <I><FONT COLOR="Navy">// libera el objetivo duplicado </FONT></I>
\r
559 (ov <B>as</B> cMisilDirigido).mSetObjetivo( aNavePropia ); <I><FONT COLOR="Navy">// le asigna como objetivo a la nave propia </FONT></I>
\r
561 <B>end</B> <B>else</B> <I><FONT COLOR="Navy">// si no encontro la experesion... </FONT></I>
\r
562 ShowMessage( 'No se encontro el objeto ' + IntToStr( i ) ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>
\r
563 <B>except</B> <I><FONT COLOR="Navy">// Si hubieron errores ... </FONT></I>
\r
564 on e: ESerializacion <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// Si fueron de serializacion... </FONT></I>
\r
565 r.Free; <I><FONT COLOR="Navy">// libera memoria </FONT></I>
\r
566 ShowMessage( 'Error al deserializar el objeto '
\r
567 + IntToStr( i ) + ': ' + e.<B>Message</B> ); <I><FONT COLOR="Navy">// muestra mensaje </FONT></I>
\r
569 on e: ERegExpr <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// si fueron de expresiones regulares... </FONT></I>
\r
570 r.Free; <I><FONT COLOR="Navy">// libera memoria </FONT></I>
\r
571 ShowMessage( 'Error al extraer el objeto ' + IntToStr( i ) + ' utilizando expresiones regulares: ' + e.<B>Message</B> ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>
\r
575 <B>end</B> <B>else</B> <I><FONT COLOR="Navy">// si no encontro el tag <objetos total=n> </FONT></I>
\r
576 ShowMessage( 'No se encontro la cantidad total de objetos' ); <I><FONT COLOR="Navy">// muestra mensaje </FONT></I>
\r
577 <B>except</B> <I><FONT COLOR="Navy">// Si hubieron errores en el tag <objetos total=n> </FONT></I>
\r
578 on e: ERegExpr <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// si fueron de expresiones regulares... </FONT></I>
\r
579 r.Free; <I><FONT COLOR="Navy">// libera memoria </FONT></I>
\r
580 ShowMessage( 'Error al extraer la cantidad total de objetos utilizando expresiones regulares: ' + e.<B>Message</B> ); <I><FONT COLOR="Navy">// cae en una excepcion </FONT></I>
\r
583 <B>end</B> <B>else</B> <I><FONT COLOR="Navy">// si no encontro el tag <navepropia> </FONT></I>
\r
584 ShowMessage( 'No se encontro la nave propia' ); <I><FONT COLOR="Navy">// muestra mensaje </FONT></I>
\r
585 <B>except</B> <I><FONT COLOR="Navy">// si hubieron errores en el tag <navepropia> </FONT></I>
\r
586 on e: ERegExpr <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// si fueron de expresiones regulares... </FONT></I>
\r
588 ShowMessage( 'Error al recuperar la nave propia utilizando expresiones regulares: ' + e.<B>Message</B> );
\r
590 on e: ESerializacion <B>do</B> <B>begin</B>
\r
592 ShowMessage( 'Error al recuperar la nave propia: ' + e.<B>Message</B> );
\r
595 <B>end</B> <B>else</B> <I><FONT COLOR="Navy">// if r.Match[1] = '1.0' then begin - chequeo de version fallido </FONT></I>
\r
596 ShowMessage( 'El escenario almacenado es de una versión incorrecta (' +
\r
597 r.Match[1] + ').' )
\r
598 <B>else</B> <I><FONT COLOR="Navy">// if r.Exec ( recuperado ) then - si no se encontró un escenario almacenado </FONT></I>
\r
599 ShowMessage( 'No se encontró un escenario almacenado en el archivo "' +
\r
601 <B>except</B> <I><FONT COLOR="Navy">// error en el tag <eaw version=n> </FONT></I>
\r
602 on e: ERegExpr <B>do</B> <B>begin</B>
\r
604 ShowMessage( 'Error al recuperar el escenario utilizando expresiones regulares: ' + e.<B>Message</B> );
\r
606 <B>end</B>; <I><FONT COLOR="Navy">// try - except </FONT></I>
\r
609 <B>procedure</B> <A NAME=TMainForm.SerializarEscenario>TMainForm.SerializarEscenario</A>( archivo: <B>string</B> );
\r
611 serializado: <B>string</B>;
\r
613 ov: cObjetoVolador;
\r
617 assignFile( f, archivo ); <I><FONT COLOR="Navy">// Asigna el archivo </FONT></I>
\r
618 rewrite( f ); <I><FONT COLOR="Navy">// Sobreescribe el archivo </FONT></I>
\r
619 <I><FONT COLOR="Navy">// Serializa la nave propia agregando alguna información sobre el archivo y la versión </FONT></I>
\r
620 serializado := '<eaw version=1.0><navepropia>' + aNavePropia.mSerializar + '</navepropia>' +
\r
621 '<objetos total=' + IntToStr( aObjetos.Count ) + '>';
\r
622 <I><FONT COLOR="Navy">// Serializa los objetos </FONT></I>
\r
623 <B>for</B> i := 0 <B>to</B> aObjetos.Count - 1 <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// recorre la lista </FONT></I>
\r
624 ov := aObjetos.Items[i]; <I><FONT COLOR="Navy">// obteniendo el primer objeto volador </FONT></I>
\r
625 <I><FONT COLOR="Navy">// Serializa el objeto actual </FONT></I>
\r
626 serializado := serializado + '<objeto' + IntToStr( i ) + ' class=' +
\r
627 ov.ClassName + '>' + ov.mSerializar + '</objeto' +
\r
628 IntToStr( i ) + '>';
\r
630 serializado := serializado + '</objetos></eaw>';
\r
631 <B>write</B>( f, serializado ); <I><FONT COLOR="Navy">// Escribe en el archivo </FONT></I>
\r
632 closeFile( f ); <I><FONT COLOR="Navy">// Cierra el archivo </FONT></I>
\r
633 <B>except</B> <I><FONT COLOR="Navy">// Si hay algun error </FONT></I>
\r
634 on e: Exception <B>do</B> <I><FONT COLOR="Navy">// Muestra un mensaje </FONT></I>
\r
635 ShowMessage( 'Hubo un error al grabar el archivo "' +
\r
636 archivo + '": ' + #13 + #10 +
\r
637 e.<B>Message</B> + #13 + #10 +
\r
638 'Por favor lea la Sección de Errores del Manual del ' +
\r
639 'Usuario para más información' ); <I><FONT COLOR="Navy">// Muestra un mensaje </FONT></I>
\r
643 <B>procedure</B> <A NAME=TMainForm.DesSerializarJuego>TMainForm.DesSerializarJuego</A>( archivo: <B>string</B> );
\r
645 recuperado: <B>string</B>;
\r
651 assignFile( f, archivo ); <I><FONT COLOR="Navy">// Asigna el archivo </FONT></I>
\r
652 reset( f ); <I><FONT COLOR="Navy">// Abre el archivo </FONT></I>
\r
654 <B>while</B> <B>not</B> eof( f ) <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// Lee el archivo </FONT></I>
\r
655 <B>read</B>( f, c ); <I><FONT COLOR="Navy">// caracter por caracter </FONT></I>
\r
656 recuperado := recuperado + c; <I><FONT COLOR="Navy">// Almacenandolo en un string </FONT></I>
\r
658 <B>except</B> <I><FONT COLOR="Navy">// Si hay algun error </FONT></I>
\r
659 on e: Exception <B>do</B> <B>begin</B> <I><FONT COLOR="Navy">// Muestra un mensaje </FONT></I>
\r
660 ShowMessage( 'Hubo un error al leer el archivo "' +
\r
661 archivo + '": ' + #13 + #10 +
\r
662 e.<B>Message</B> + #13 + #10 +
\r
663 'Por favor lea la Sección de Errores del Manual del ' +
\r
664 'Usuario para más información' ); <I><FONT COLOR="Navy">// Muestra un mensaje </FONT></I>
\r
667 r := TRegExpr.create;
\r
668 <B>try</B> <I><FONT COLOR="Navy">// ensure memory release </FONT></I>
\r
669 r.Expression := '<jaw/s+version=(/d+[/./d+]*)/s*>/s*(.+)/s*</jaw>';
\r
670 <B>if</B> r.Exec ( recuperado ) <B>then</B>
\r
671 <B>if</B> r.Match[1] = '1.0' <B>then</B> <B>begin</B> <I><FONT COLOR="Navy">// Si el archivo es version 1.0 </FONT></I>
\r
672 aEspacio.free; <I><FONT COLOR="Navy">// Libera el espacio existente de existir </FONT></I>
\r
673 aEspacio := <B>nil</B>;
\r
674 aEspacio := cEspacio.crearDeSerializado( r.Match[2] ); <I><FONT COLOR="Navy">// Crea el nuevo a partir del guardado </FONT></I>
\r
675 aNavePropia := aEspacio.mGetNavePropia; <I><FONT COLOR="Navy">// Asigna la nueva nave propia </FONT></I>
\r
676 aVista.free; <I><FONT COLOR="Navy">// Libera la vieja vista </FONT></I>
\r
677 aVista := <B>nil</B>;
\r
678 aVista := cVista.create( self, aNavePropia ); <I><FONT COLOR="Navy">// Crea la nueva vista </FONT></I>
\r
679 aBtnIniciar.Enabled := true; <I><FONT COLOR="Navy">// Se puede iniciar el juego </FONT></I>
\r
680 <B>end</B> <B>else</B>
\r
681 ShowMessage( 'El juego almacenado es de una versión incorrecta (' +
\r
682 r.Match[1] + ').' )
\r
684 ShowMessage( 'No se encontró un juego almacenado en el archivo "' +
\r
687 on e: ERegExpr <B>do</B> <B>begin</B>
\r
689 ShowMessage( 'Error al recuperar el juego utilizando expresiones regulares: ' + e.<B>Message</B> );
\r
691 on e: ESerializacion <B>do</B> <B>begin</B>
\r
693 ShowMessage( 'Error al recuperar el juego: ' + e.<B>Message</B> );
\r
696 closeFile( f ); <I><FONT COLOR="Navy">// Cierra el archivo </FONT></I>
\r
699 <B>procedure</B> <A NAME=TMainForm.SerializarJuego>TMainForm.SerializarJuego</A>( archivo: <B>string</B> );
\r
701 serializado: <B>string</B>;
\r
705 assignFile( f, archivo ); <I><FONT COLOR="Navy">// Asigna el archivo </FONT></I>
\r
706 rewrite( f ); <I><FONT COLOR="Navy">// Sobreescribe el archivo </FONT></I>
\r
707 <I><FONT COLOR="Navy">// Serializa agregando alguna información sobre el archivo y la versión </FONT></I>
\r
708 serializado := '<jaw version=1.0>' + aEspacio.mSerializar + '</jaw>';
\r
709 <B>write</B>( f, serializado ); <I><FONT COLOR="Navy">// Escribe en el archivo </FONT></I>
\r
710 closeFile( f ); <I><FONT COLOR="Navy">// Cierra el archivo </FONT></I>
\r
711 <B>except</B> <I><FONT COLOR="Navy">// Si hay algun error </FONT></I>
\r
712 on e: Exception <B>do</B> <I><FONT COLOR="Navy">// Muestra un mensaje </FONT></I>
\r
713 ShowMessage( 'Hubo un error al grabar el archivo "' +
\r
714 archivo + '": ' + #13 + #10 +
\r
715 e.<B>Message</B> + #13 + #10 +
\r
716 'Por favor lea la Sección de Errores del Manual del ' +
\r
717 'Usuario para más información' ); <I><FONT COLOR="Navy">// Muestra un mensaje </FONT></I>
\r
721 <B>procedure</B> <A NAME=TMainForm.aMenuItemCambioAutomaticoClick>TMainForm.aMenuItemCambioAutomaticoClick</A>(Sender: TObject);
\r
723 aMenuItemCambioAutomatico.Checked := <B>not</B> aMenuItemCambioAutomatico.Checked;
\r