Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Go Back   Foros Club Delphi > Principal > Varios
Register FAQ Members List Calendar Guía de estilo Today's Posts

Coloboración Paypal con ClubDelphi

Reply
 
Thread Tools Search this Thread Display Modes
  #1  
Old 20/07/2010
LoPiTaL LoPiTaL is offline
Miembro
 
Join Date: Apr 2009
Posts: 168
Poder: 18
LoPiTaL Va por buen camino
Initialization block no se ejecuta

Hola a todos!
Tengo una duda que cuanto menos es sorprendente: tengo (simplificando el problema) dos units, una de ellas depende de la otra, y las dos tienen un bloque de initialization. Se ejecuta primero el bloque initialization que depende de la otra unit, mientras que el de ésta no se ejecuta, provocándome un error...
Os pongo un ejemplo:

unit 1:
Código Delphi [-]
...
implementation
uses
  unit2;
...
initialization
  RegisterLineClass(TAudioLine);

unit2:

Código Delphi [-]
...
implementation
var
  LinesList: TList;

procedure RegisterLineClass(ALineClass: TGraphPrivateLinkClass);
begin
  LinesList.Add(ALineClass);
  RegisterClass(ALineClass);
end;
...
initialization
  LinesList:=TList.Create;

La instrucción LinesList:=TList.Create no se ejecuta, por lo que la llamada a RegisterLineClass devuelve error de lectura en dirección 0x0000008....
¿A alguien le ha ocurrido esto alguna vez?? Y lo que es más importante ( ) ¿alguien sabe cómo corregirlo?

Un saludo,
LoPiTaL
Reply With Quote
  #2  
Old 20/07/2010
Lord Delfos's Avatar
Lord Delfos Lord Delfos is offline
Miembro
 
Join Date: Jan 2008
Location: Tandil, Argentina
Posts: 558
Poder: 19
Lord Delfos Va por buen camino
Fijate que el orden en el que se ejecutan los initialization es opuesto al orden en el que están declaradas las units... Eso es medio truculento. Así que puede estar pasando que se ejecute primero el initialization de unit1 que el de unit2...

¿Pusiste un breakpoint en el de unit2 para ver qué pasa?
Reply With Quote
  #3  
Old 20/07/2010
rgstuamigo's Avatar
rgstuamigo rgstuamigo is offline
Miembro
 
Join Date: Jul 2008
Location: Santa Cruz de la Sierra-Bolivia
Posts: 1,646
Poder: 20
rgstuamigo Va por buen camino
Arrow

hummm....Como la variable "LinesList" de la unidad "Unit2" es una variable global, pues tranquilamente puedes crearla(instanciarla) en la inicializacion de la unidad "Unit1" mas o menos así:
unit 1:
Código Delphi [-]
...
implementation
uses
  unit2;
...
initialization
LinesList:=TList.Create;//<--
RegisterLineClass(TAudioLine);
Creo que con eso se solucionaría..
Saludos...
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
Reply With Quote
  #4  
Old 21/07/2010
LoPiTaL LoPiTaL is offline
Miembro
 
Join Date: Apr 2009
Posts: 168
Poder: 18
LoPiTaL Va por buen camino
Vale, rebuscando por internet he visto que el orden en que se inicializan las units no es siempre como se declaran las units en los uses, ya que si dependen también entre ellas en la parte implementation el compilador lo hace como le da la gana...
Al final, y para no tener que hacer el truco de inicializar cosas de la unit2 en la unit1 como dice "rgstuamigo" utilizo

Código Delphi [-]
procedure RegisterLineClass(ALineClass: TGraphPrivateLinkClass);
begin
  if not assigned(LinesList) then
    LinesList:=TList.Create;
  LinesList.Add(ALineClass);
  RegisterClass(ALineClass);
end;

y en la parte initialization también compruebo si está o no asignada para crearla o no.

Como os digo, rebuscando en internet encontré que esto es más bien un bug del compilador de Delphi:

http://qc.embarcadero.com/wc/qcmain.aspx?d=72245

Aquí exponen que el orden initialization que se espera NO es el que se obtiene, y que además ocurre en todas las versiones de Delphi. Incluyen un ejemplo y todo para demostrar el problema.

Yo por mi parte llego a la conclusión de que en el bloque initialization no debe utilizar otras variables/funciones de otra unit, y que si las utiliza, dichos objetos se deben inicializar manualmente (con un init propio) para estar seguro de que no va a fallar.

Gracias por los comentarios y ayuda,
Un saludo,
LoPiTaL
Reply With Quote
Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Similar Threads
Thread Thread Starter Forum Replies Last Post
Alterar el orden en que las clases ejecutan su código initialization noob Varios 5 06/04/2009 09:04
Orden de initialization y finalization mauro_med Varios 0 24/04/2008 00:30
con breakpoint ejecuta y sin el no lo ejecuta. pacuuy Varios 1 16/12/2007 13:41
EL Initialization en C++??? aeff C++ Builder 4 26/07/2007 08:00
Error dbExpress vendor initialization failed ivan022481 Conexión con bases de datos 1 26/06/2007 04:15


All times are GMT +2. The time now is 12:35.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi