Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Declarar un nombre a un edit creado en tiempo de ejecucion (https://www.clubdelphi.com/foros/showthread.php?t=93520)

TavoBran 25-10-2018 18:14:19

Cita:

Empezado por juniorSoft (Mensaje 529264)
Disculpas porque el código lo hice directamente en el editor del foro por no tener delphi instalado en la pc que estoy utilizando.

Tranquilo por eso no hay problema

juniorSoft 25-10-2018 19:02:35

Cuando tienes la declaración de un procedimiento o función en una clase a esto es que se le conoce como método

Dentro de la clase solo tienes las cabeceras de los procedimientos o las funciones(métodos) que utilices, a estas cabeceras se le llaman Prototipos e indican que luego se van a implementar, la definición es como dice Roman

solo tienes que hacer lo siguiente

En la clase del formulario

Código:

TfrmEjecucion = class(TForm)
        ..........
    ..........
  private   
      procedure CrearEdits(Edits:TMatriz; MaxX, MaxY:integer);
      procedure LlenarEdits(Edits:TMatriz; MaxX, MaxY:integer);

  public
      .......
      ......
end;

Colocas el cursor encima de los métodos y le das a las teclas Ctrl + Shift + C para que cree el esqueleto de los métodos en la sección de implementation el entorno te crear algo como sigue:

Código:

procedure TfrmEjecucion.llenarEdits(var Edits: TArrEdits; MaxX, MaxY:integer);
begin

end;

procedure TfrmEjecucion.CrearEdits(var Edits: TArrEdits; MaxX, MaxY:integer);
begin

end;

end.

ahora solo tienes que copiar el código que esta en los procedimientos sueltos en sus correspondientes métodos.

TavoBran 25-10-2018 21:14:36

Cita:

Empezado por juniorSoft (Mensaje 529268)
Cuando tienes la declaración de un procedimiento o función en una clase a esto es que se le conoce como método

Dentro de la clase solo tienes las cabeceras de los procedimientos o las funciones(métodos) que utilices, a estas cabeceras se le llaman Prototipos e indican que luego se van a implementar, la definición es como dice Roman

solo tienes que hacer lo siguiente

En la clase del formulario

Código:

TfrmEjecucion = class(TForm)
        ..........
    ..........
  private   
      procedure CrearEdits(Edits:TMatriz; MaxX, MaxY:integer);
      procedure LlenarEdits(Edits:TMatriz; MaxX, MaxY:integer);

  public
      .......
      ......
end;

Colocas el cursor encima de los métodos y le das a las teclas Ctrl + Shift + C para que cree el esqueleto de los métodos en la sección de implementation el entorno te crear algo como sigue:

Código:

procedure TfrmEjecucion.llenarEdits(var Edits: TArrEdits; MaxX, MaxY:integer);
begin

end;

procedure TfrmEjecucion.CrearEdits(var Edits: TArrEdits; MaxX, MaxY:integer);
begin

end;

end.

ahora solo tienes que copiar el código que esta en los procedimientos sueltos en sus correspondientes métodos.


Listo ya hice todo lo sugerido ya no me sale ese error pero ahora hay otro.
lo que pasa es que me sale error cuando llamo a los dos procedimientos el de LlenarEdits y CrearEdits

Código Delphi [-]

  CrearEdits(Matriz);  //[dcc32 Error] Ejecucion.pas(63): E2035 Not enough actual parameters
  llenarEdits(Matriz);  //[dcc32 Error] Ejecucion.pas(64): E2035 Not enough actual parameters

y mi codigo va asi:

Código Delphi [-]

unit Ejecucion;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.Menus;

type
  TMatriz = array of array of TEdit;
  TfrmEjecucion = class(TForm)
    Button1: TButton;
    Edt: TEdit;
    Panel1: TPanel;
    Panel2: TPanel;
    Button2: TButton;
    Button3: TButton;
    MainMenu1: TMainMenu;
    Volver1: TMenuItem;
    Button4: TButton;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    procedure CrearEdits(Edits:TMatriz; MX, MY:integer);
    procedure LlenarEdits(Edits:TMatriz; MX, MY:integer);
  public
    { Public declarations }
  end;

var
  frmEjecucion: TfrmEjecucion;

implementation

{$R *.dfm}

procedure TfrmEjecucion.Button1Click(Sender: TObject);
var
  Matriz:TMatriz;
  MX, MY:integer;
begin
  if Trim(Edt.Text) = '' then
  begin
    ShowMessage('Debe escribir un número');
    Exit;
  end;
  //Grivera Desicion para que no sea tan grande la matriz
  if StrToInt(Edt.Text) >= 11 then
  begin
    ShowMessage('El valor tiene que ser igual o menor a 10');
    Edt.Clear;
  end
  else
  begin
    //Grivera Establece el valor de la matriz y de los TEdit
    MY := StrToInt(Edt.Text);
    MX := StrToInt(Edt.Text);
    SetLength(Matriz, MX, MY);
    Button1.Visible := False;
    Edt.Visible := False;
  end;
  CrearEdits(Matriz);
  llenarEdits(Matriz);
end;

procedure TfrmEjecucion.CrearEdits(Edits: TMatriz; MX, MY: integer);
var
   i,j : integer;
begin
  for i:=0 to MX-1 do
  begin
    for J:=0 to MY-1 do
    begin
      Edits[i,i] := TEdit.Create(Self);
      Edits[i,i].Text := '';
      Edits[i,i].Top := 21 * (i + 1);
      Edits[i,i].Left := 21 * (j + 1);
      Edits[i,i].Width := 20;
      Edits[i,i].Height := 20;
      Edits[i,i].AutoSize := False;
      Edits[i,i].Enabled := False;
      Edits[i,j].Parent := Panel1;
      Button3.Visible := True;
    end;
  end;
end;

procedure TfrmEjecucion.LlenarEdits(Edits: TMatriz; MX, MY: integer);
var
  i,j:integer;
begin
  for i := 0 to MX-1 do
  begin;
    for j := 0 to MY-1 do
    begin
      Edits[i,j].Text:=IntToStr(Random(100));
    end;
  end;
end;

end.

muchas gracias.

juniorSoft 25-10-2018 21:42:24

Cita:

lo que pasa es que me sale error cuando llamo a los dos procedimientos el de LlenarEdits y CrearEdits
El error esta sucediendo porque se esta llamando a los métodos con un solo parámetro. Dicho de otra forma tienes declarado los métodos con tres parámetros formales y los estas invocando con un solo parámetro real. Lo que sucede es que con esos parámetros MaxX y MaxY se le busca mas independencia a los métodos, sino debes utilizar los valores que introducen los usuarios de forma directa.

Por otro lado los métodos están definidos en la sección privada de la clase por lo que solo se pueden invocar desde la clase del formulario en la que están definidos. Si requieres invocar esos métodos desde otro formulario o unidad diferente debes colocarlos en la sección publica de la clase.

juniorSoft 25-10-2018 21:53:08

Con esta corrección al invocar los métodos debería funcionar

Código:

CrearEdits(Matriz, MX, MY);
LlenarEdits(Matriz, MX, MY);


TavoBran 25-10-2018 22:00:45

Cita:

Empezado por juniorSoft (Mensaje 529273)
Con esta corrección al invocar los métodos debería funcionar

juniorSoft si tienes razon ya con estos dos parametros ya no me genera el error eres un genio.

otra cosa es que al momento de ejecutar el programa me funciona bien pero al momento de darle en el boton para que me genere los Edit no me genera nada que podria ser.

codigo completo:

Código Delphi [-]
unit Ejecucion;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.Menus;

type
  TMatriz = array of array of TEdit;
  TfrmEjecucion = class(TForm)
    Button1: TButton;
    Edt: TEdit;
    Panel1: TPanel;
    Panel2: TPanel;
    Button2: TButton;
    Button3: TButton;
    MainMenu1: TMainMenu;
    Volver1: TMenuItem;
    Button4: TButton;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);

  private
    { Private declarations }
  public
    procedure CrearEdits(Edits:TMatriz; Mx, My:integer);
    procedure LlenarEdits(Edits:TMatriz; Mx, My:integer);
  var
    Matriz : TMatriz;
    Mx,My : Integer;
  end;

var
  frmEjecucion: TfrmEjecucion;


implementation

{$R *.dfm}

procedure TfrmEjecucion.Button1Click(Sender: TObject);
begin
  if Trim(Edt.Text) = '' then
  begin
    ShowMessage('Debe escribir un número');
    Exit;
  end;
  //Grivera Desicion para que no sea tan grande la matriz
  if StrToInt(Edt.Text) >= 11 then
  begin
    ShowMessage('El valor tiene que ser igual o menor a 10');
    Edt.Clear;
  end
  else
  begin
    //Grivera Establece el valor de la matriz
    Mx := StrToInt(Edt.Text);
    My := StrToInt(Edt.Text);    
    SetLength(Matriz, Mx, My);
    
    Button1.Visible := False;
    Edt.Visible := False;
    CrearEdits(Matriz,Mx,My);
    llenarEdits(Matriz,Mx,My);
  end;
end;

procedure TfrmEjecucion.CrearEdits(Edits: TMatriz; Mx, My: integer);
var
   i,j : integer;
begin
  for i := 0 to Mx-1 do
  begin
    for j := 0 to My-1 do
    begin
      Edits[i,i] := TEdit.Create(Self);
      Edits[i,i].Text := '';
      Edits[i,i].Top := 21 * (i + 1);
      Edits[i,i].Left := 21 * (j + 1);
      Edits[i,i].Width := 20;
      Edits[i,i].Height := 20;
      Edits[i,i].AutoSize := False;
      Edits[i,i].Enabled := False;
      Edits[i,j].Parent := Panel1;
      Button3.Visible := True;
    end;
  end;
end;

procedure TfrmEjecucion.LlenarEdits(Edits: TMatriz; Mx, My: integer);
var
  i,j:integer;
begin
  for i := 0 to Mx-1 do
  begin;
    for j := 0 to My-1 do
    begin
      Edits[i,j].Text:=IntToStr(Random(100));
    end;
  end;
end;

le he modificado y ya me genera un edit pero me sale el siguiente error:

Access Violation at address 005D006D in module 'PruebasDelphi.exe'. Read of address 00000000.

TavoBran 25-10-2018 22:18:39

juniorSoft amigo usted es todo un crack me ayudo muchisimo el dia de hoy espero que estos conocimientos que tiene le ayuden mucho y gracias hoy aprendi mucho ha el error al anterior mensaje era que estabarepitiendo la i despues de crear los edits:

Código Delphi [-]
Edits[i,i] := TEdit.Create(Self);
      Edits[i,i].Text := '';
      Edits[i,i].Top := 21 * (i + 1);
      Edits[i,i].Left := 21 * (j + 1);
      Edits[i,i].Width := 20;
      Edits[i,i].Height := 20;
      Edits[i,i].AutoSize := False;
      Edits[i,i].Enabled := False;
      Edits[i,j].Parent := Panel1;

en estos campos jaja fue muy chistoso ese error pero gracias por todo dejo la solucion.

Código Delphi [-]
unit Ejecucion;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.Menus;

type
  TMatriz = array of array of TEdit;
  TfrmEjecucion = class(TForm)
    Button1: TButton;
    Edt: TEdit;
    Panel1: TPanel;
    Panel2: TPanel;
    Button2: TButton;
    Button3: TButton;
    MainMenu1: TMainMenu;
    Volver1: TMenuItem;
    Button4: TButton;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);

  private
    { Private declarations }
  public
    procedure CrearEdits(Edits:TMatriz; Mx, My:integer);
    procedure LlenarEdits(Edits:TMatriz; Mx, My:integer);
  end;

var
  frmEjecucion: TfrmEjecucion;


implementation

{$R *.dfm}

procedure TfrmEjecucion.Button1Click(Sender: TObject);
var
  Matriz : TMatriz;
  Mx,My : Integer;
begin
  if Trim(Edt.Text) = '' then
  begin
    ShowMessage('Debe escribir un número');
    Exit;
  end;
  //Grivera Desicion para que no sea tan grande la matriz
  if StrToInt(Edt.Text) >= 11 then
  begin
    ShowMessage('El valor tiene que ser igual o menor a 10');
    Edt.Clear;
  end
  else
  begin
    //Grivera Establece el valor de la matriz
    Mx := StrToInt(Edt.Text);
    My := StrToInt(Edt.Text);
    SetLength(Matriz, Mx, My);
    Button1.Visible := False;
    Edt.Visible := False;

    CrearEdits(Matriz,Mx,My);
    llenarEdits(Matriz,Mx,My);
  end;
end;

procedure TfrmEjecucion.CrearEdits(Edits: TMatriz; Mx, My: integer);
var
   i,j : integer;
begin
  for i := 0 to Mx-1 do
  begin
    for j := 0 to My-1 do
    begin
      Edits[i,j] := TEdit.Create(Self);
      Edits[i,j].Text := '';
      Edits[i,j].Top := 21 * (i + 1);
      Edits[i,j].Left := 21 * (j + 1);
      Edits[i,j].Width := 20;
      Edits[i,j].Height := 20;
      Edits[i,j].AutoSize := False;
      Edits[i,j].Enabled := False;
      Edits[i,j].Parent := Panel1;
      Button3.Visible := True;
    end;
  end;
end;

procedure TfrmEjecucion.LlenarEdits(Edits: TMatriz; Mx, My: integer);
var
  i,j:integer;
begin
  for i := 0 to Mx-1 do
  begin;
    for j := 0 to My-1 do
    begin
      Edits[i,j].Text:=IntToStr(Random(100));
    end;
  end;
end;

end.

juniorSoft 25-10-2018 23:54:57

Cita:

juniorSoft amigo usted es todo un crack....
No digas eso, aquí todos los días aprendemos algo nuevo cada día, en mi caso estoy muy lejos de ese titulo.

Saludos,


La franja horaria es GMT +2. Ahora son las 03:40:23.

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