Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-03-2015
Avatar de José Luis Garcí
[José Luis Garcí] José Luis Garcí is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Las Palmas de G.C.
Posts: 1.372
Poder: 25
José Luis Garcí Va camino a la fama
Veamos los cambios en el DataModule (DM)

Código Delphi [-]
//------------------------------------------------------------------------------
//**************************************************************[ Conectar ]****
//Nos permite conectar las tablas, querrys + IBDatabase + IBTransaction
//------------------------------------------------------------------------------
begin
   ...
   if IBDCaja.Active=false then IBDCaja.Active:=True;                    //La tabla Cajas
   if IBDClientes.Active=false then IBDClientes.Active:=True;            //La tabla Clientes
   if IBDMovimientos.Active=false then IBDMovimientos.Active:=True;      //La tabla Movimientos
   if IbdEtiquetas.Active=false then IbdEtiquetas.Active:=True;          //La tabla Etiquetas
end;

Como vemos vamos añadiendo nuestras tablas según avanzamos y vamos insertandolas
__________________
Un saludo desde Canarias, "El abuelo Cebolleta"
Responder Con Cita
  #2  
Antiguo 07-03-2015
Avatar de José Luis Garcí
[José Luis Garcí] José Luis Garcí is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Las Palmas de G.C.
Posts: 1.372
Poder: 25
José Luis Garcí Va camino a la fama
Y ya por último en esta semana ya que mañana dudo que pueda ponerme con el tutorial os pongo el módulo de movimiento y algunas partes a comentar



El código

https://gist.github.com/anonymous/fcad11f5cd2b6ef0b6e2
__________________
Un saludo desde Canarias, "El abuelo Cebolleta"
Responder Con Cita
  #3  
Antiguo 07-03-2015
Avatar de José Luis Garcí
[José Luis Garcí] José Luis Garcí is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Las Palmas de G.C.
Posts: 1.372
Poder: 25
José Luis Garcí Va camino a la fama
Veamos el procedimiento del botón nuevo del módulo movimientos, lo he dividido en partes para ir comentandolo


Código Delphi [-]
//------------------------------------------------------------------------------
//**************************************************************[ SBnuevo ]*****
//------------------------------------------------------------------------------
var VarIRegistro:Integer;
    VarBSeguimos:Boolean;

Creamos la variable VarBSeguimos, para saber si debemos continuar por uno u otor lado, ya lo veremos más adelante

Código Delphi [-]
begin
    VarBSeguimos:=True;
    if DM.IBDClientes.IsEmpty then VarBSeguimos:=false;
    if DM.IBDCargos.IsEmpty then VarBSeguimos:=false;

Le decimos a la variable que es true y lo primero que hacemos es saber si estas tablas tiene datos, en caso contrario marcamos la variable para no seguir

Código Delphi [-]
    if VarBSeguimos then
    begin
      ActQuery(IBQClientes,'Select * From CLIENTES');
      ActQuery(IBQCargos,'Select * From CARGOS');
      DsPrincipal.DataSet.Insert;
      VarIRegistro:=DM.IBDConfiguracionNUMERADOR_MOVIMIENTOS.Value;
      VarIRegistro:=VarIRegistro+1;
      DbeRegistro.Field.Value:=IntToStr(VarIRegistro);
      PanelDatos.Enabled:=True;
      PanelOculto.Visible:=True;
      Botonera1.Enabled:=false;
      DbeFecha.Field.Value:=Now;

Si tenemos datos usamos la variable y seguimos, activamos los ibquerry con todos los clientes y seguimos con los datos

Código Delphi [-]
 VarIModoApertura=1 then DbeConcepto.Field.Value:='Venta de la unidad [ '+DM.IBDUnidadesTITULO.Value+' ]';
      if VarIModoApertura=2 then DbeConcepto.Field.Value:='A cuenta del cliente [ '+DM.IBDClientesCODIGO.Value+' ]';
      if VarIModoApertura=3 then
      begin
         DbeConcepto.Field.Value:='Pagado por el cliente[ '+DM.IBDClientesCODIGO.Value+' ]';
         DbeCantidad.Field.Value:=DM.IBDClientesPENDIENTE.Value;
      end;
     DBLBCliente.SetFocus;
     end else ShowMessage('O bien clientes o cargos esta vacía, por lo que no puede continuar, anulando este proceso');
end;


Ahora dependerá de nuestro método de apertura preparamos ciertos datos usando la variable VarIModoApertura y para que este funcione automáticamente usamos el siguiente código

Código Delphi [-]
//------------------------------------------------------------------------------
//***************************************************************[ OnShow ]*****
// Cuando muestra la pantalla
//------------------------------------------------------------------------------
begin
   if not (DsPrincipal.DataSet.State in [dsEdit,dsInsert]) then
   begin
      if (VarIModoApertura=1) or (VarIModoApertura=2) or (VarIModoApertura=3) then SBNuevoClick(sender);
   end;
end;

Como vemos dice que si hay elegido un método de apertura diferente a o automáticamente nos genere un nuevo registro, ya que estos métodos vienen de los módulos Unidades en el botón vendida y de Clientes en los botones A Cuenta y Pagar
__________________
Un saludo desde Canarias, "El abuelo Cebolleta"
Responder Con Cita
  #4  
Antiguo 07-03-2015
Avatar de José Luis Garcí
[José Luis Garcí] José Luis Garcí is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Las Palmas de G.C.
Posts: 1.372
Poder: 25
José Luis Garcí Va camino a la fama
Sigamos con confirmar



Código Delphi [-]
procedure TFMovimientos.SpeedButton9Click(Sender: TObject);
//------------------------------------------------------------------------------
//********************************************************[ Grabar datos ]******
//------------------------------------------------------------------------------
 var VarIFase:Integer;
     VarbSaltar:Boolean;
begin
  try
    VarIFase:=1;
    VarbSaltar:=False;
    if DsPrincipal.DataSet.State in [dsInsert] then VarBGrabarNumerador:=True else VarBGrabarNumerador:=False;
    if DsPrincipal.DataSet.State in [dsEdit,dsInsert] then
    begin
       DSPrincipal.DataSet.Post;
    end;
    if VarBGrabarNumerador=true then
    begin
      VarIFase:=2;
      DM.IBDConfiguracion.Edit;
      DM.IBDConfiguracionNUMERADOR_MOVIMIENTOS.Value:=StrToInt(DbeRegistro.Field.Value);
      DM.IBDConfiguracion.Post;
    end;
    VarIFase:=3;
    if ((DM.IBDCaja.IsEmpty)) then VarbSaltar:=True;
    if VarbSaltar=False then  //Comprobamos si hay registro de la caja con esta fecha
    begin
       DM.IBDCaja.last;
       if DM.IBDCajaFECHA.Value<>Now then  VarbSaltar:=True;
    end;
    if VarbSaltar then
    begin
      DM.IBDConfiguracion.Edit;
      DM.IBDConfiguracionNUMERADOR_CAJA.Value:=DM.IBDConfiguracionNUMERADOR_CAJA.Value+1;
      DM.IBDConfiguracion.Post;
    end;
    DM.IBDCaja.Insert;
    DM.IBDCajaREGISTRO.Value:=IntToStr(DM.IBDConfiguracionNUMERADOR_CAJA.Value);
    DM.IBDCajaCLIENTE.Value:=DBLBCliente.Text;
    DM.IBDCajaCONCEPTO.Value:=DbeConcepto.Field.Value;
    DM.IBDCajaCARGO.Value:=DBLBCargo.Text;
    DM.IBDCajaFECHA.Value:=DbeFecha.Field.Value;
    DM.IBDCajaCANTIDAD.Value:=DbeCantidad.Field.Value;
    DM.IBDCajaUSUARIO.Value:=VarSUsuario;
    DM.IBDCaja.Post;
    VarIFase:=4;
    if VarIModoApertura=1 then
    begin
       DM.IBDUnidades.Edit;
       DM.IBDUnidadesVENDIDA.Value:='S';
       DM.IBDUnidadesDISPONIBLE.Value:='N';
       DM.IBDUnidadesFECHA_BAJA.Value:=Now;
       if DM.IBDUnidadesRENDIMIENTO.value=0 then DM.IBDUnidadesRENDIMIENTO.Value:=DbeCantidad.Field.Value
                                            else DM.IBDUnidadesRENDIMIENTO.Value:=DM.IBDUnidadesRENDIMIENTO.Value+DbeCantidad.Field.Value;
       VarSCadena:='chr(13)+--[ VENDIDA el '+DateToStr(now)+' al cliente número '+DBLBCliente.Text+'------------------Por ['+VarSUsuario+']';
       DM.IBDUnidadesNOTAS.Value:=DM.IBDUnidadesNOTAS.Value+VarSCadena;
       DM.IBDUnidades.post;
    end;
    if VarIModoApertura=2 then
    begin
       DM.IBDClientes.Edit;
       if DM.IBDClientesA_CUENTA.Value=0 then DM.IBDClientesA_CUENTA.Value:=DbeCantidad.Field.Value
                                         else DM.IBDClientesA_CUENTA.Value:=DM.IBDClientesA_CUENTA.Value+DbeCantidad.Field.Value;
       VarSCadena:=chr(13)+'--[ Entregado a cuenta  el '+DateToStr(now)+' La cantidad de  '+DbeCantidad.Text+'------------------Por ['+VarSUsuario+']';
       DM.IBDClientesNOTAS.Value:=DM.IBDClientesNOTAS.Value+VarSCadena;
       DM.IBDClientes.post;
    end;
    if VarIModoApertura=3 then
    begin
       DM.IBDClientes.Edit;
       if DM.IBDClientesPENDIENTE.Value=DbeCantidad.Field.Value then DM.IBDClientesPENDIENTE.Value:=0
       Else begin
          if DM.IBDClientesPENDIENTE.Value>DbeCantidad.Field.Value then DM.IBDClientesPENDIENTE.Value:=DM.IBDClientesPENDIENTE.Value-DbeCantidad.Field.Value
          else begin
             Case MessageBox(0, pchar(  'Ha entregado más dinero del que tenia pendiente de pagar'
                            +#13#10+#13#10+'¿Desea que el sobrante se lo añadamos a su cuenta en el apartado '
                            +#13#10+#13#10+'                                            [ A Cuenta ]'),
                            pchar('Entregado más que el pendiente'), 4+32+256) of
               6:begin       //Si
                    if DM.IBDClientesA_CUENTA.Value=0 then DM.IBDClientesA_CUENTA.Value:=DbeCantidad.Field.Value-DM.IBDClientesPENDIENTE.Value
                                                      else DM.IBDClientesA_CUENTA.Value:=DM.IBDClientesA_CUENTA.Value+(DbeCantidad.Field.Value-DM.IBDClientesPENDIENTE.Value);
                 end;
             end;
          end;
          DM.IBDClientesPENDIENTE.Value:=0
       end;
       VarSCadena:=chr(13)+'--[ Pagado el '+DateToStr(now)+' La cantidad de  '+DbeCantidad.Text+'------------------Por ['+VarSUsuario+']';
       DM.IBDClientesNOTAS.Value:=DM.IBDClientesNOTAS.Value+VarSCadena;
       DM.IBDClientes.post;
    end;
    VarIModoApertura:=0;
    VarIFase:=5;
    DM.IBT.CommitRetaining;    //Donde IBT es el nombre de su Ibtrasaction, con ruta
  except
    on E: Exception do
    begin
        MessageBeep(1000);
        ShowMessage('Se ha producido un error y el proceso no se ha podido terminar   Unidad:[ UMovimientos ]   Modulo:[ Grabar ]' + Chr(13) + Chr(13)
                  + 'Fase del error [ '+IntToStr(VarIFase)+' ]'+ Chr(13) + Chr(13)
                  + 'Clase de error: ' + E.ClassName + Chr(13) + Chr(13)
                  + 'Mensaje del error:' + E.Message+Chr(13) + Chr(13)
                  + '    '+Chr(13) + Chr(13)
                  + 'El proceso ha quedado interrumpido');
        if DsPrincipal.DataSet.State in [dsEdit,dsInsert] then DSPrincipal.DataSet.Cancel;
        DM.IBT.RollbackRetaining;    //Donde IBT es el nombre de su Ibtrasaction, con ruta
    end;
  end;
  PanelOculto.Visible:=False;
  PanelDatos.Enabled:=False;
  Botonera1.Enabled:=True;
end;


Como vemos difiere mucho de los otros botones confirmar, pero es muy simple de seguir el procedimiento, para ellos vamos a guiarnos por los valores que le vamos dando a la variable VarIFase, cuando vale 1 hacemos lo siguiente

-Comprobamos si estamos insertando, para en tal caso actualizar el numerador en Configuración y grabamos los datos de la tabla movimientos

Cuando VarIFase vale 2

-Actualizamos el numerador de configuración, pero sólo si la tabla estaba en inserción

Cuando VarIFase vale 3

-1º comprobamos si la caja ya tiene registro con esta fecha, en caso de no hacerlo pasamos al 2 paso

-2º En caso de no tener registro la creamos el aumento de este en el numerador de cajas de configuración

-3 Independientemente de que necesitemos el paso 2 o no grabamos los datos en la caja cogiendo el registro directamente del valor actual del numerador en configuración, por esto si no existe debemos registrarlo con el paso 2

Pasemos a cuando VarIFase vale 4

-Aquí dependerá del modo de apertura, modificando los campos necesarios de las tablas Unidades o clientes, según ha sido nuestra apertura, omitiendolos todos si estamos en modo de apertura 0

Aquí debemos registrar un cambio en el código que es el siguiente por un error mio

Código Delphi [-]
 if (VarIModoApertura=1) and (VarBGrabarNumerador) then
    begin
       DM.IBDUnidades.Edit;
       DM.IBDUnidadesVENDIDA.Value:='S';
       DM.IBDUnidadesDISPONIBLE.Value:='N';
       DM.IBDUnidadesFECHA_BAJA.Value:=Now;
       if DM.IBDUnidadesRENDIMIENTO.value=0 then DM.IBDUnidadesRENDIMIENTO.Value:=DbeCantidad.Field.Value
                                            else DM.IBDUnidadesRENDIMIENTO.Value:=DM.IBDUnidadesRENDIMIENTO.Value+DbeCantidad.Field.Value;
       VarSCadena:='chr(13)+--[ VENDIDA el '+DateToStr(now)+' al cliente número '+DBLBCliente.Text+'------------------Por ['+VarSUsuario+']';
       DM.IBDUnidadesNOTAS.Value:=DM.IBDUnidadesNOTAS.Value+VarSCadena;
       DM.IBDUnidades.post;
    end;
    if VarIModoApertura=2 and (VarBGrabarNumerador)  then
    begin
       DM.IBDClientes.Edit;
       if DM.IBDClientesA_CUENTA.Value=0 then DM.IBDClientesA_CUENTA.Value:=DbeCantidad.Field.Value
                                         else DM.IBDClientesA_CUENTA.Value:=DM.IBDClientesA_CUENTA.Value+DbeCantidad.Field.Value;
       VarSCadena:=chr(13)+'--[ Entregado a cuenta  el '+DateToStr(now)+' La cantidad de  '+DbeCantidad.Text+'------------------Por ['+VarSUsuario+']';
       DM.IBDClientesNOTAS.Value:=DM.IBDClientesNOTAS.Value+VarSCadena;
       DM.IBDClientes.post;
    end;
    if VarIModoApertura=3 and (VarBGrabarNumerador)  then
    begin
       DM.IBDClientes.Edit;
       if DM.IBDClientesPENDIENTE.Value=DbeCantidad.Field.Value then DM.IBDClientesPENDIENTE.Value:=0
       Else begin
          if DM.IBDClientesPENDIENTE.Value>DbeCantidad.Field.Value then DM.IBDClientesPENDIENTE.Value:=DM.IBDClientesPENDIENTE.Value-DbeCantidad.Field.Value
          else begin
             Case MessageBox(0, pchar(  'Ha entregado más dinero del que tenia pendiente de pagar'
                            +#13#10+#13#10+'¿Desea que el sobrante se lo añadamos a su cuenta en el apartado '
                            +#13#10+#13#10+'                                            [ A Cuenta ]'),
                            pchar('Entregado más que el pendiente'), 4+32+256) of
               6:begin       //Si
                    if DM.IBDClientesA_CUENTA.Value=0 then DM.IBDClientesA_CUENTA.Value:=DbeCantidad.Field.Value-DM.IBDClientesPENDIENTE.Value
                                                      else DM.IBDClientesA_CUENTA.Value:=DM.IBDClientesA_CUENTA.Value+(DbeCantidad.Field.Value-DM.IBDClientesPENDIENTE.Value);
                 end;
             end;
          end;
          DM.IBDClientesPENDIENTE.Value:=0
       end;
       VarSCadena:=chr(13)+'--[ Pagado el '+DateToStr(now)+' La cantidad de  '+DbeCantidad.Text+'------------------Por ['+VarSUsuario+']';
       DM.IBDClientesNOTAS.Value:=DM.IBDClientesNOTAS.Value+VarSCadena;
       DM.IBDClientes.post;
    end;

De esta manera la modificación solo se registra si estamos en insercción

Por último vamos cuando VarIFase vale 5 que eles el final

-Pasamos el DM.IBT.CommitRetaining; para que nuestros cambios se hagan efectivos

Por cierto hay otro cambio en el botón nuevo de este módulo donde pone

Código Delphi [-]
VarIRegistro:=DM.IBDConfiguracionNUMERADOR_CARGOS.Value;

debe ser

Código Delphi [-]
VarIRegistro:=DM.IBDConfiguracionNUMERADOR_MOVIMIENTOS.Value;
__________________
Un saludo desde Canarias, "El abuelo Cebolleta"
Responder Con Cita
  #5  
Antiguo 07-03-2015
Avatar de José Luis Garcí
[José Luis Garcí] José Luis Garcí is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Las Palmas de G.C.
Posts: 1.372
Poder: 25
José Luis Garcí Va camino a la fama
Comentamos algunas cosas más de los módulos con los que hemos trabajado hoy, en primer lugar en el DM hemos añadido elñ procedimiento


Código Delphi [-]
//------------------------------------------------------------------------------
//***************************************************[ MiControlDeErrores ]*****
//   Ds   Es el datasource a conectar
//   Unidad    LA unidad desde el que la llamamos
//   Apartado  El apartado
//   E    La  exception producida
//------------------------------------------------------------------------------
begin
   MessageBeep(1000);
   ShowMessage('Se ha producido un error y el proceso no se ha podido terminar   Unidad:[ '+Unidad+']   Modulo:[ '+Apartado+' ]' + Chr(13) + Chr(13)

             + 'Clase de error: ' + E.ClassName + Chr(13) + Chr(13)
             + 'Mensaje del error:' + E.Message+Chr(13) + Chr(13)
             + '    '+Chr(13) + Chr(13)
             + 'El proceso ha quedado interrumpido');
  if Ds.DataSet.State in [dsEdit,dsInsert] then DS.DataSet.Cancel;
  DM.IBT.RollbackRetaining;    //Donde IBT es el nombre de su Ibtrasaction, con ruta
end;

Que ya vimos y también vimos como se usaba en Unidades en procedimientos como el de bajas siendo la linea de llamada del código

Código Delphi [-]
DM.MiControlDeErrores(Dsprincipal,'UUnidades','Baja',E);

Lo bueno es que el mismo código, incluso podría substituir parte del código de todos los botones confirmar o en mucho de ellos


En clientes hay una parte que ha cambiado en el formulario y no se mostro, esta es en el panel botonera 2, os pongo una imagen



Como veis ahora podemos buscar por tres campos con el locate, no es el mejor método y de hecho suelo usar pantallas de búsqueda, pero para el tutorial creo que es suficiente, veamos dos trozos de código relacionados con este cambio

Código Delphi [-]
//------------------------------------------------------------------------------
//***********************************************[ ejecutamos la búsqueda ]*****
//------------------------------------------------------------------------------
begin
   case RadioGroup1.ItemIndex of
     0SPrincipal.DataSet.Locate('NOMBRE',Edit1.Text,[loCaseInsensitive,loPartialKey]);
     1SPrincipal.DataSet.Locate('DIRECCION',Edit1.Text,[loCaseInsensitive,loPartialKey]);
     2SPrincipal.DataSet.Locate('DOCUMENTO',Edit1.Text,[loCaseInsensitive,loPartialKey]);
   end;
end;

El primero es cuando le damos a buscar, por lo que miramos que elemento del RadioGroup esta seleccionado para saber por que buscamos

Código Delphi [-]
procedure TFClientes.RadioGroup1Click(Sender: TObject);
begin
    case RadioGroup1.ItemIndex of
       0:Label9.Caption:='Nombre';
       1:Label9.Caption:='Dirección';
       2:Label9.Caption:='Nº de documento';
    end;
end;



El segundo es para que cuando pulsamos en el Radiogroup nos identifique antes del edit por que campo buscamos



Creo que esto es todo por esta semana, si veis algo me dicen, seguro que hay fallos ya que estoy haciendo el tutorial según lo voy explicando. Buen fin de semana a todos
__________________
Un saludo desde Canarias, "El abuelo Cebolleta"
Responder Con Cita
  #6  
Antiguo 28-03-2015
Avatar de José Luis Garcí
[José Luis Garcí] José Luis Garcí is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Las Palmas de G.C.
Posts: 1.372
Poder: 25
José Luis Garcí Va camino a la fama
Después de 2 semanas en las que no he podido dedicarme al tutorial, volvemos no con mucho tiempo, pero entre hoy y mañana espero sacar el módulo de Alquiler y los que este lleva adosados.

Para ello vamos a ver el modulo Uvernotas



Y como su código es pequeño lo subo aquí también

Código Delphi [-]
unit Uvernota;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, Buttons;

type
  TFvernota = class(TForm)
    Panel1: TPanel;
    SBSalir: TSpeedButton;
    Memo1: TMemo;
    procedure SBSalirClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Fvernota: TFvernota;

implementation

{$R *.dfm}

procedure TFvernota.SBSalirClick(Sender: TObject);
//------------------------------------------------------------------------------
//**************************************************************[ SBSalir ]*****
//------------------------------------------------------------------------------
begin
  Close;
end;

end.
__________________
Un saludo desde Canarias, "El abuelo Cebolleta"
Responder Con Cita
  #7  
Antiguo 28-03-2015
Avatar de José Luis Garcí
[José Luis Garcí] José Luis Garcí is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Las Palmas de G.C.
Posts: 1.372
Poder: 25
José Luis Garcí Va camino a la fama
Bien ahora vamos a mostrar los campos de búsqueda , para ello añadimos a nuestro módulo DM una nueva variable que llamaremos varSBusqueda de tipo string

empecemos por buscar clientes



el código en https://gist.github.com/anonymous/8816e6d0705a950e7047


Y nada que comentar sobre este ya que lo haré en el siguiente
__________________
Un saludo desde Canarias, "El abuelo Cebolleta"
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Obtener fotograma de video. Video Finish rabata2001 Varios 0 07-05-2014 13:02:30
segundo video tutorial delphi cacu La Taberna 4 21-02-2012 15:30:26
Video Tutorial Delphi Para Novatos cacu Varios 4 22-11-2011 08:41:30
crear video tutorial glrjola Varios 7 28-04-2011 13:08:56
Video Tutorial para instalar Apache + MySQL + PHP desde 0 !!! Hagen PHP 0 07-02-2007 13:57:45


La franja horaria es GMT +2. Ahora son las 20:03:25.


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