Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
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 05-12-2014
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.142
Poder: 36
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Entonces, que me quede claro, ¿se pueden usar métodos de una clase sin instanciarla y sin que dichos métodos estén declarados como "de clase"?

Este Delphi...
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #2  
Antiguo 05-12-2014
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Se puede pero no se debe...

Este ecfisa...



// Saludos
Responder Con Cita
  #3  
Antiguo 05-12-2014
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.941
Poder: 27
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Y porque no?


Los class methods se usan regularmente de la forma exacta que se describe, no solo en Delphi sino en todos los lenguajes que soportan esta opcion.
__________________
El malabarista.
Responder Con Cita
  #4  
Antiguo 05-12-2014
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 23
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
David,

Cita:
Empezado por dec
...¿se pueden usar métodos de una clase sin instanciarla y sin que dichos métodos estén declarados como "de clase"?...


Revisa este código:
Código Delphi [-]
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TC1 = Object
  public
    // Método y variable tipo Object
    MsgUser : String;
    function Calculate(N1, N2 : Double) : Double;
  end;

  TC2 = class
  public
    // Variable de Instancia
    MsgUser : String;
    // Método de Clase
    class function Calculate1(N1, N2 : Double) : Double;
    // Método de Instancia
    function Calculate2(N1, N2 : Double) : Double;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

// Método Object
function TC1.Calculate(N1, N2: Double): Double;
begin
   ShowMessage(Format('Calculate = %n (+,-,*,/) %n',[N1,N2]));
end;

// Método de Clase
class function TC2.Calculate1(N1, N2: Double): Double;
begin
   ShowMessage(Format('Calculate = %n (+,-,*,/) %n',[N1,N2]));
end;

// Método de Instancia
function TC2.Calculate2(N1, N2: Double): Double;
begin
   ShowMessage(Format('Calculate = %n (+,-,*,/) %n',[N1,N2]));
end;

// Uso del tipo Object y de Métodos de Clase y de Instancia
procedure TForm1.Button1Click(Sender: TObject);
var
   C1 : TC1;
   C2 : TC2;

begin

   C1.MsgUser := 'Tipo Object = No requiere ser Instanciado para el uso de Variables y Métodos';
   ShowMessage(C1.MsgUser);
   C1.Calculate(7.1,3.14);

   ShowMessage('Método de Clase = No requiere ser Instanciada la Clase para su uso');
   TC2.Calculate1(7.1,3.14);

   C2 := TC2.Create;
   C2.MsgUser := 'Método y Variable de Instancia = Requiere ser Instanciada la Clase para su uso';
   ShowMessage(C2.MsgUser);
   C2.Calculate2(7.1,3.14);
   C2.Free;

end;

end.
El código anterior en Delphi 7 sobre Windows 7 Professional x32, ejemplifica el uso del tipo Object y de Métodos de Clase y de Instancia.

Nota: El tipo object permite instanciar objetos sin usar el método Create y es muy util para implementaciones de tipos abstractos simples, para desarrollos formales orientados a objetos se debe usar el tipo Class.

Revisa esta información:
Espero sea útil

Nelson.

Última edición por nlsgarcia fecha: 05-12-2014 a las 20:33:21.
Responder Con Cita
  #5  
Antiguo 05-12-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 38
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

Agrego algo a lo expuesto por Nelson. El detalle es, que conviene abstenerse de incluir métodos virtuales cuando se usa el antiguo estilo Pascal de declaración,
Código Delphi [-]
type 
  xxx = object
    procedure yyy; virtual;
  end;
con las nuevas versiones de Delphi.

Eso trae aparejado problemas que ya han sido reportados en QualityCentral: Using old style Objects in D2009 fails

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #6  
Antiguo 05-12-2014
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 23
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
Daniel,

Cita:
Empezado por ecfisa
...conviene abstenerse de incluir métodos virtuales cuando se usa el antiguo estilo Pascal...trae aparejado problemas que ya han sido reportados en QualityCentral...


Revisa este código:
Código Delphi [-]
 
  program testD2009;
  
  {$APPTYPE CONSOLE}
  
  uses
    SysUtils;
  
  Type
    PObject1 = ^TObject1;
    TObject1 = Object
      FCount     : Integer;
      Constructor Init;
      Procedure Add; virtual; { removing virtual allows the program to run }
      end;
  
  Type
    PObject2   = ^TObject2;
    TObject2   = Object(TObject1)
      Constructor Init;
      end;
  
  Constructor TObject1.Init;
  begin
  { Commenting out this assignment allows the program to run.
    It also runs if Procedure Add; is not Virtual.
    I presume there is some address mismatch resulting in an
    over-write of the VMT }
  FCount := 0;
  Writeln('TDynArray:Init');
  end;
  
  Procedure TObject1.Add;
  begin
  Writeln('Add');
  end;
  
  Constructor TObject2.Init;
  begin
  Inherited Init;
  Writeln('TObject2:Init');
  end;
  
  Var
    Object1 : PObject1;
    Object2 : PObject2;
  begin
    try
      Object1 := New(PObject1,Init);
      Object1^.Add;
  
      Object2 := New(PObject2,Init);
      Object2^.Add;
      readln;
    except
      on E:Exception do
        Writeln(E.Classname, ': ', E.Message);
    end;
  end.
Tomado de : QualityCentral-Using old style Objects in D2009 fails

El código anterior que falla en Delphi 2009 según se indica en QualityCentral, funciona correctamente en Delphi 2010 y Delphi XE6 sobre Windows x32 y Delphi XE7 sobre Windows 10 Technical Preview x32, al parecer el problema reportado solo aplica a Delphi 2009, no obstante para desarrollos formales orientados a objetos se debe usar el tipo Class.

Espero sea útil

Nelson.
Responder Con Cita
  #7  
Antiguo 06-12-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 38
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Nelson.
Cita:
Empezado por nlsgarcia Ver Mensaje
....al parecer el problema reportado solo aplica a Delphi 2009...
Bién por Embarcadero que lo haya solucionado en las versiones posteriores. Quede la advertencia para aquellos que usan la versión 2009 entonces...

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
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
Un momento, ¿no sería mejor comenzar con Python 3.x? Al González Python 4 05-04-2011 16:30:43
Liberar un objeto Com marcosl OOP 1 25-10-2007 00:10:19
Liberar el foco de un objeto Velia Varios 4 18-11-2005 01:08:08
Liberar un objeto xerkan Servers 1 28-10-2003 17:29:10


La franja horaria es GMT +2. Ahora son las 14:30:09.


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