Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   problema con el visual (https://www.clubdelphi.com/foros/showthread.php?t=31662)

lanp_prospero 14-05-2006 03:03:57

problema con el visual
 
hola,
quisiera alguien me ayudase con algun codigo de ejemplo de como hacer una llmada desde el visual a metodos de una clase, la verdad estoy iniciandome en delphi, pero apenas estoy dando tumbos en vano.

ejemplo:
una clase que sume dos numero, un boton que cuando se le de click, sume dos numeros que se entren por dos Edit. es decir algo sencillo.

gracias

Delphius 14-05-2006 07:20:22

Espero que te sirva
 
Bienvenido a clubdelphi.
Los moderadores siempre recomiendan que los miembros lean la guia de estilo. Yo no soy moderador... pero igual te la recomiendo...

Bueno, como dices que recien te estas iniciando en Delphi, te recomiendo también que leas "La Cara Oculta de Delphi 4". Buscala en google... que la vas a hallar muy rápido. Es un buen documento (en pdf) que te va a servir para introducirte en la mayoría de los temas.

A ver... dejame ver si entiendo: ¿tu quieres que desde la interfaz se envien unos datos hacia una clase?
Si es así, yo declararía en un módulo (unidad) aparte una clase:
Código Delphi [-]
Unit NombreUnidad;
 
type
  TMiclase = TClass;
    public
    function suma(a,b:integer): integer;
  end;

y su declaración:
Código Delphi [-]
function MiClase.suma(a,b:integer): integer;
  begin
   result := a + b;
  end;

Después, en la aplicación que corresponde haces uso de dicha unidad:
Código Delphi [-]
uses NombreUnidad;

Y en el cuerpo del clik del boton pones algo como:
Código Delphi [-]
var InstanciaClase: TMiClase;
     nro1,nro2:integer;
begin
  nro1 := IntToStr(Edit1.text);
  nro2 := IntToStr(Edit2.text);
  InstanciaClase := TMiClase.Create;
  showMessage(IntToStr(InstanciaClase.suma(nro1;nro2)));

El código se puede refinar... pero como para que se entienda más o menos bien... lo declaré así.

Saludos,

lanp_prospero 14-05-2006 18:42:22

Conseguido
 
gracias Delphius, con esto resolvi, aunque me hubiese gustado mas, sin pasarle los parametros por referencia al metodo, ponerlos como atributos de la clase, que era como estaba tratando de hacerlo. pero bueno, vere que sale.

Salu2s

Lepe 14-05-2006 20:02:30

Siguiendo el estilo de Delphius:

Código Delphi [-]
Unit NombreUnidad;
 
type
  TMiclase = TClass;
    private
      Fa:integer;
      Fb:integer;
    public
    function Suma: integer;
    property A:integer read Fa write Fa;
    property B:integer read Fb write Fb;
  end;

En principio Fa y Fb no proporciona nada nuevo, pero bueno....

La funcion devolverá Fa+Fb que son las variables privadas.

Saludos

Delphius 15-05-2006 04:01:18

Algo más...
 
Puedes si deseas redefinir el constructor para setear con algún valor las variables privadas. Para ello lo declaras como sigue:
Código Delphi [-]
constructor create(a,b:integer);
begin
Fa := a;
Fb := b;
end;
Un pequeño aporte...

lanp_prospero 15-05-2006 04:16:19

Delphius:
eso intente hacer pero me da un explote, tengo puesto este codigo.

//aqui defino la clase

unit Unit2;
interface
Type
TNumeros = class
private
protected
Fa: integer;
Fb: integer;
public
constructor Create(_Fa, _Fb: integer);
function Suma: integer;
property A:integer read Fa write Fa;
property B:integer read Fb write Fb;
published
end;

implementation
{ TNumeros }
constructor TNumeros.Create(_Fa, _Fb: integer)
begin
Self.Fa:=_Fa;
Self.Fb:=Fb;
end;
function TNumeros.Suma: integer;
begin
Result:=Fa + Fb;
end;
end.

//aqui defino la parte de la forma

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Unit2, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Button1: TButton;
Edit3: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
numeros: TNumeros;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
numeros.Create(StrToInt(Edit1.Text), StrToInt(Edit2.Text));
Edit3.Text:=IntToStr(numeros.Suma);
end;
end.

mira a ver y dime que podria ser.

gracias

Delphius 15-05-2006 04:33:01

Pues... que error te produce?
 
Antes que nada... usa las etiquetas [ DELPHI ] y [ /DELPHI ]para que el código que ingresas, sea más legible (debes ingresar sin espacios entre los corchetes.) Pues, mira como queda:

Código Delphi [-]
unit Unit2;
interface
Type
TNumeros = class
private
protected
Fa: integer;
Fb: integer;
public
constructor Create(_Fa, _Fb: integer);
function Suma: integer;
property A:integer read Fa write Fa;
property B:integer read Fb write Fb;
published 
end;

implementation
{ TNumeros }
constructor TNumeros.Create(_Fa, _Fb: integer)
begin
Self.Fa:=_Fa;
Self.Fb:=Fb;
end;
function TNumeros.Suma: integer;
begin
Result:=Fa + Fb;
end;
end.

Código Delphi [-]
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Unit2, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Button1: TButton;
Edit3: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
numeros: TNumeros;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
numeros.Create(StrToInt(Edit1.Text), StrToInt(Edit2.Text));
Edit3.Text:=IntToStr(numeros.Suma);
end;
end.

¿Pues, que error te produce?
A simple vista el código parece estar bien... ahora no tengo Delphi abierto... y no tengo mucho tiempo como para verlo. En cuanto pueda darte más mano, me fijo.

lanp_prospero 15-05-2006 05:01:21

errores
 
haber como te explico, sin tocar nada en ese codigo, me da un eeror en el {begin} del constructor en la declaracion, algo asi como esta en la imagen que adjunto aqui, la que dice error simple. ahora, cuando en la implementacion del costructor termino la linea contructor TNumeros.Create(....); con un ; como lo hice aqui ahora me da el eeror que en la imagen se llama explote, si le doy F9 nuevamente me da el ultimo error.

no se si soy bastante explicito, pero de igual forma si puedes probarlo, me dices que puede ser.

gracias

lanp_prospero 15-05-2006 05:02:56

bueno las imagenes no salen, no se por que, de todas formas pruebalo haber si te dice algo, sino debe de ser algun problema con mi delphi

Héctor Randolph 15-05-2006 09:39:01

Solamente falta ajustar unos pequeños detalles para que trabaje correctamente

Prueba de esta forma:

Código Delphi [-]
unit Unit1;

interface

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

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

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  numeros: TNumeros;
begin
  {Corrige esta línea}
  numeros:=TNumeros.Create(StrToInt(Edit1.Text), StrToInt(Edit2.Text));
  Edit3.Text:=IntToStr(numeros.Suma);
  numeros.Free; {Agrega esta línea}
end;

end.

Código Delphi [-]
unit Unit2;

interface

Type
  TNumeros = class
    private
    protected
      Fa: integer;
      Fb: integer;
    public
      constructor Create(_Fa, _Fb: integer);
      function Suma: integer;
      property A:integer read Fa write Fa;
      property B:integer read Fb write Fb;
    published
end;

implementation

{TNumeros }
constructor TNumeros.Create(_Fa, _Fb: integer);
begin
    Self.Fa:=_Fa;
    Self.Fb:=_Fb; {Corrige esta línea}
end;

function TNumeros.Suma: integer;
begin
  Result:=Fa + Fb;
end;

end.

Saludos

Lepe 15-05-2006 16:57:26

Roman comentó en un hilo anterior que al constructor no debe pasarse los parámetros que son propiedades (no encuentro el link del mensaje). La Razón es bien obvia... si tenemos 9 operandos A, B,C,D,E,F,G..., ¿tambien se los pasamos como parámetros al Create?.

Inicialmente no estaba de acuerdo con esa forma de pensar.... pero el tiempo le da la razón a los veteranos ;)

Además si añadimos código cuando se le da un valor al parámetro A ó B tambien tendríamos que modificar el Create... duplicamos y enrevesamos el código.

Saludos

lanp_prospero 15-05-2006 20:43:08

problema resuelto
 
gracias Hector Randolph, con esto resolvi.

gracias nuevamente.


La franja horaria es GMT +2. Ahora son las 15:51:58.

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