Club Delphi  
    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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-09-2017
Karlo Magno Karlo Magno is offline
Registrado
NULL
 
Registrado: ago 2017
Posts: 5
Poder: 0
Karlo Magno Va por buen camino
Acceso a coordenadas en segundo formulario.

Hola a todos. Estoy haciendo un programa que me permita "navegar" por el conjunto de Mandelbrot
He avanzado bastante pero ahora me he quedado atascado en el paso de intentar averiguar en que punto del formulario de dibujo (Form2) he pinchado con el ratón. Lo he de averiguar desde el formulario de control (Form1), en concreto no consigo acceder desde Form1 al "onclick" del Form2, por venir éste de Tobject.

Os dejo abajo un resumen del problema, seguro que a alguien se le ocurre algo.

Código Delphi [-]
 
 unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,unit2;

type

  { TForm1 }

  TForm1 = class(TForm)
    Bcalcula: TButton;
    procedure BcalculaClick(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;
  coordenadas: tpoint;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.BcalculaClick(Sender: TObject);
begin
  form2.show;

//  form2.formclick;
  coordenadas:=coordenadasraton;
end;

end.
 ***********************************************************++          

Ahora va el Form2.
                        
 unit Unit2;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs;

type

  { TForm2 }

  TForm2 = class(TForm)
    procedure FormClick(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form2: TForm2;
  coordenadasraton:tpoint;

implementation

{$R *.lfm}

{ TForm2 }

procedure TForm2.FormClick(Sender: TObject);
begin
   coordenadasraton:=mouse.cursorpos;
end;

end.
**********************************************************************************

Última edición por roman fecha: 12-09-2017 a las 19:18:57. Razón: Agregar etiquetas [delphi] código [/delphi]
Responder Con Cita
  #2  
Antiguo 12-09-2017
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
Hola,

Recuerda usar las etiquetas adecuadas para publicar código, tal como he hecho en tu mensaje.

En cuanto a la duda, considera que puedes asignar al evento OnClick de un objeto un método de otro objeto:

Código Delphi [-]
type
  TForm1 = class(TForm)
  public
    procedure Form2Click(Sender: TObject);
  end;

implementation

procedure TForm1.Form2Click(Sender: TObject);
begin
  // Aquí entrará cuando se haga clic en el Form2
end;

La asignación podrías hacerla en el constructor del segundo formulario:

Código Delphi [-]
type
  TForm1 = class(TForm)
  public
    procedure FormCreate(Sender: TObject);
  end;

implementation

uses Unit1;

procedure TForm2.FormCreate(Sender: TObject);
begin
  OnClick := Form1.Form2Click;
end;

No es, quizá, la manera más limpia de hacerlo, pero puede servir

LineComment Saludos
Responder Con Cita
  #3  
Antiguo 13-09-2017
Karlo Magno Karlo Magno is offline
Registrado
NULL
 
Registrado: ago 2017
Posts: 5
Poder: 0
Karlo Magno Va por buen camino
Algo falla

He intentado lo que sugieres y me da error "wrong number of parameters specified for call to "Form2Click"" y "Found declaration: Form2Click (TObject).

Código Delphi [-]
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,unit2;

type

  { TForm1 }

  TForm1 = class(TForm)
    public
     procedure Form2Click(Sender: TObject);
  end;

var
  Form1: TForm1;
  coordenadas: tpoint;

implementation

{$R *.lfm}

{ TForm1 }

  procedure tForm1.Form2click(sender: Tobject);
  begin

  end;

end.
  


unit Unit2;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs;

type

  { TForm2 }

  TForm2 = class(TForm)

  public
   procedure formcreate(sender: Tobject);
  end;

var
  Form2: TForm2;


implementation

Uses unit1;
{$R *.lfm}

{ TForm2 }
procedure Tform2.formcreate(sender : Tobject);
  begin
     onclick := Form1.Form2click;  //aquí da el error;
  end;

end.


Un saludo y gracias.
Responder Con Cita
  #4  
Antiguo 13-09-2017
Avatar de Caminante
Caminante Caminante is offline
Miembro
 
Registrado: oct 2010
Ubicación: Lima - Peru
Posts: 338
Poder: 14
Caminante Va camino a la fama
Hola puedes probar haciendo

Código Delphi [-]
procedure Tform2.formcreate(sender : Tobject);  
 begin      
onclick := @Form1.Form2click;  //aquí da el error;  
 end;

Espero sea util

Saludos
__________________
Caminante, son tus huellas el camino y nada más; Caminante, no hay camino, se hace camino al andar.
Antonio Machado
Responder Con Cita
  #5  
Antiguo 13-09-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
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.

Otra opción para dectectar un click en Form2 desde Form1, puede ser:

Form1,
Código Delphi [-]
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    btnShowForm2: TButton;
    procedure btnShowForm2Click(Sender: TObject);
  private
    procedure HuboClickEnForm2(mp: TPoint);
  public
  end;

var
  Form1: TForm1;

implementation  {$R *.dfm}

uses Unit2; // Form2

// Hizo click en Form2
procedure TForm1.HuboClickEnForm2(mp: TPoint);
begin
  Label1.Caption := Format('X:%3.d, Y:%3.d', [mp.X, mp.Y]);
end;

// Mostrar Form2 - asignar evento
procedure TForm1.btnShowForm2Click(Sender: TObject);
begin
  Form2.Show; // se supone ya creado
  Form2.OnClickInForm := HuboClickEnForm2;
end;

end.

Form2,
Código Delphi [-]
unit Unit2;

interface

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

type
  TClickInForm = procedure(mp: TPoint) of object;
  TForm2 = class(TForm)
    procedure FormClick(Sender: TObject);
  private
    FClickInForm: TClickInForm;
  public
    property OnClickInForm: TClickInForm read FClickInForm write FClickInForm;
  end;

var
  Form2: TForm2;

implementation   {$R *.dfm}

procedure TForm2.FormClick(Sender: TObject);
begin
   if Assigned(FClickInForm) then
    FClickInForm(ScreenToClient(Mouse.CursorPos));
end;

end.

Salida:


Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #6  
Antiguo 13-09-2017
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
Cita:
Empezado por Karlo Magno Ver Mensaje
He intentado lo que sugieres y me da error "wrong number of parameters specified for call to "Form2Click"" y "Found declaration: Form2Click (TObject).
No sé porqué te falle, a no ser que Lázarus haga algo raro o que hayas hecho la asignación así:

Código Delphi [-]
OnClick := Form1.Form2Click();

Aquí el ejemplo según mi versión:



Sin embargo, optaría más por la variante de ecfisa ya que así Form2 es independiente de Form1.

LineComment Saludos
Responder Con Cita
  #7  
Antiguo 13-09-2017
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
Cita:
Empezado por Caminante Ver Mensaje
Código Delphi [-]
procedure Tform2.formcreate(sender : Tobject);  
 begin      
onclick := @Form1.Form2click;  //aquí da el error;  
 end;
A mi esto me da el error:

Cita:
[Error] Unit2.pas(29): Variable required
LineComment Saludos
Responder Con Cita
  #8  
Antiguo 13-09-2017
Avatar de Caminante
Caminante Caminante is offline
Miembro
 
Registrado: oct 2010
Ubicación: Lima - Peru
Posts: 338
Poder: 14
Caminante Va camino a la fama
Cita:
Empezado por roman Ver Mensaje
A mi esto me da el error:



LineComment Saludos

Que raro, a mi siempre me funciona asi. Aunque nunca he asignado un procedimiento de otra unidad de esa manera solo de la misma. Mejor lo compruebo.

Cita:
Empezado por roman Ver Mensaje
Sin embargo, optaría más por la variante de ecfisa ya que así Form2 es independiente de Form1.
Opino igual.

Saludos
__________________
Caminante, son tus huellas el camino y nada más; Caminante, no hay camino, se hace camino al andar.
Antonio Machado
Responder Con Cita
  #9  
Antiguo 13-09-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
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.

Los dos están en lo correcto, según se trate, la sintáxis de asignación difiere.

En Delphi es,
Código Delphi [-]
OnClick := Form1.Form2Click;
mientras que en Lazarus hay que indicar que se trata de una dirección:
Código Delphi [-]
OnClick := @Form1.Form2Click;

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #10  
Antiguo 13-09-2017
Avatar de Caminante
Caminante Caminante is offline
Miembro
 
Registrado: oct 2010
Ubicación: Lima - Peru
Posts: 338
Poder: 14
Caminante Va camino a la fama
__________________
Caminante, son tus huellas el camino y nada más; Caminante, no hay camino, se hace camino al andar.
Antonio Machado
Responder Con Cita
  #11  
Antiguo 13-09-2017
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
Cita:
Empezado por ecfisa Ver Mensaje
mientras que en Lazarus hay que indicar que se trata de una dirección:
Código Delphi [-]
OnClick := @Form1.Form2Click;
¡Ah! Pero, qué raro. Esto haría muy incompatibles los códigos. ¿No tendrá lázarus alguna opción de compilación para esto?

De todas formas, gracias por la aclaración.

LineComment Saludos
Responder Con Cita
  #12  
Antiguo 13-09-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
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 roman.

Si la tiene,
Código Delphi [-]
unit Unit1;
  // {$mode objfpc}{$H+}

{$IFDEF FPC}
   {$MODE DELPHI}
{$ENDIF}

interface

uses  Classes, SysUtils,  ...

...
y entonces no habría problemas con la asignación anterior.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #13  
Antiguo 13-09-2017
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
Cita:
Empezado por ecfisa Ver Mensaje
Hola roman.

Si la tiene,
Código Delphi [-]
unit Unit1;
  // {$mode objfpc}{$H+}

{$IFDEF FPC}
   {$MODE DELPHI}
{$ENDIF}

interface

uses  Classes, SysUtils,  ...

...
y entonces no habría problemas con la asignación anterior.

Saludos


LineComment Gracias
Responder Con Cita
  #14  
Antiguo 13-09-2017
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
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 de nuevo.

No podía recordar el enlace donde lo había leido..., pero aquí esta: Free Pascal compiler modes.

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
Acceder a un segundo formulario desde una Unit JuanOrtega Varios 2 08-01-2016 23:39:41
Mejor evento para mostrar un segundo formulario franfl C++ Builder 5 16-04-2008 21:33:44
Corelab ...Formulario de Acceso al sistema ... Kenobi Varios 2 21-04-2007 00:47:57
Errores con mi formulario de acceso.... Kenobi Varios 4 17-04-2007 18:11:02
pasar coordenadas gps a coordenadas builder iaav1 C++ Builder 3 03-07-2006 20:59:02


La franja horaria es GMT +2. Ahora son las 22:50:34.


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
Copyright 1996-2007 Club Delphi