Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Acceso a coordenadas en segundo formulario. (https://www.clubdelphi.com/foros/showthread.php?t=92269)

Karlo Magno 12-09-2017 18:52:32

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.
**********************************************************************************

roman 12-09-2017 19:18:20

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

Karlo Magno 13-09-2017 03:06:16

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.

Caminante 13-09-2017 03:25:01

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

ecfisa 13-09-2017 05:37:18

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 :)

roman 13-09-2017 16:41:36

Cita:

Empezado por Karlo Magno (Mensaje 521023)
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

roman 13-09-2017 16:44:53

Cita:

Empezado por Caminante (Mensaje 521024)
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

Caminante 13-09-2017 16:58:39

Cita:

Empezado por roman (Mensaje 521044)
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 (Mensaje 521044)
Sin embargo, optaría más por la variante de ecfisa ya que así Form2 es independiente de Form1.

Opino igual.

Saludos

ecfisa 13-09-2017 20:02:16

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 :)

Caminante 13-09-2017 20:19:50

^\||/^\||/^\||/^\||/

roman 13-09-2017 20:44:42

Cita:

Empezado por ecfisa (Mensaje 521049)
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

ecfisa 13-09-2017 21:06:17

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 :)

roman 13-09-2017 21:09:55

Cita:

Empezado por ecfisa (Mensaje 521052)
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

ecfisa 13-09-2017 21:16:55

Hola de nuevo.

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

Saludos :)


La franja horaria es GMT +2. Ahora son las 16:55:55.

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