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 24-10-2018 17:31:38

Declarar un nombre a un edit creado en tiempo de ejecucion
 
Hola a todos...

lo que pasa es que quiero declararle un nombre a un TEdit que estoy creando en tiempo de ejcucion pero el problema es que los estoy creando con una matriz y no se como hacer para declararle todos los nombres a todos los TEdit...
les agradesco su ayuda. :)

Este es el codigo.

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
  matriz = array of array of Integer;
  TfrmEjecucion = class(TForm)
    Button1: TButton;
    Edt: TEdit;
    Panel1: TPanel;
    Panel2: TPanel;
    Button2: TButton;
    Button3: TButton;
    MainMenu1: TMainMenu;
    Volver1: TMenuItem;
    Button4: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Volver1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmEjecucion: TfrmEjecucion;
  NEdits : Integer;
  Edits: TEdit;
  m : matriz;

implementation

{$R *.dfm}

procedure TfrmEjecucion.Button1Click(Sender: TObject);
var
  c,f : Integer;
begin
  //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
    //Establece el valor de la matriz y de los TEdit
    NEdits := StrToInt(Edt.Text);
    SetLength(m, StrToInt(Edt.Text),StrToInt(Edt.Text));
    Button1.Visible := False;
    Edt.Visible := False;
  end;
  // Creo y posiciono los Edits
  for c := 1 to NEdits do
  begin
    for f := 1 to NEdits do
    begin
      Edits := TEdit.Create(Self);
      Edits.Left := 21 * (c + 1);
      Edits.Top := 21 * (f + 1);
      Edits.Width := 20;
      Edits.Height := 20;
      Edits.Enabled := False;
      Edits.Parent := Panel1;
      Button3.Visible := True;
    end;
  end;
end;

procedure TfrmEjecucion.Volver1Click(Sender: TObject);
begin
    Close;
end;

end.

roman 24-10-2018 18:35:19

¿Para qué quieres ponerle un nombre? Normalmente, el nombre de un control se utiliza sólamente para referirnos a él en código, pero, dado que lo creas en tiempo de ejecución, no hace mucho sentido.

// Saludos

TavoBran 24-10-2018 18:49:46

roman lo que pasa es que después necesito llamar a todos los Edit creados para así llenarlos con una matriz y la única forma que se me ocurría era llamarlos por el nombre.

juniorSoft 24-10-2018 19:11:23

Hola,

Probaste hacer esto:

Código:

for f := 1 to NEdits do
    begin
      Edits := TEdit.Create(Self);
      Edits.Left := 21 * (c + 1);
      Edits.Top := 21 * (f + 1);
      Edits.Width := 20;
      Edits.Height := 20;
      Edits.Enabled := False;
      Edits.Parent := Panel1;
      Edits.name := 'Edit'+f.ToString;
      Button3.Visible := True;
    end;


roman 24-10-2018 19:23:51

El problema es que, para encontrar un control por su nombre utilizas FindComponent. Pero este método, a su vez, es un ciclo que recorre todos los componentes del formulario para encontrar una coincidencia de nombre. Entonces, si tu rejilla es, digamos, de 10x10, estarías recorriendo el formulario 100 veces.

Dado que estás creando los controles por código, fácilmente puedes declarar una matriz de Edits:

Código Delphi [-]
var
  Edits: array[1..10,1..10] of TEdit;

y llenarla con los controles que creas. Posteriormente será mucho más fácil utilizarlos por sus coordenadas:

Código Delphi [-]
Edits[2, 8].Text := 'Algo';

// Saludos

TavoBran 24-10-2018 21:52:20

Si ramon yo lo declaro así solo que es dinámico y defino la matriz a través de un TEdit y como es una matriz cuadrada no hay problema,

Declaro la matriz asi:
Código Delphi [-]

matriz = array of array of Integer;

y defino el valor asi:

Código Delphi [-]

SetLength(m, StrToInt(Edt.Text),StrToInt(Edt.Text));

TavoBran 24-10-2018 21:53:02

Si ramon yo lo declaro así solo que es dinámico y defino la matriz a través de un TEdit y como es una matriz cuadrada no hay problema,

Declaro la matriz asi:
Código Delphi [-]

matriz = array of array of Integer;

y defino el valor asi:

Código Delphi [-]

SetLength(m, StrToInt(Edt.Text),StrToInt(Edt.Text));

TavoBran 24-10-2018 21:54:07

juniorSoft si claro ya lo intente

TavoBran 24-10-2018 22:00:28

Amigo muchas gracias por su ayuda ya busque y pude solucionar mi error

les dejo mi solucion y me dicen que les parece

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
  matriz = array of array of Integer;
  TfrmEjecucion = class(TForm)
    Button1: TButton;
    Edt: TEdit;
    Panel1: TPanel;
    Panel2: TPanel;
    Button2: TButton;
    Button3: TButton;
    MainMenu1: TMainMenu;
    Volver1: TMenuItem;
    Button4: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Volver1Click(Sender: TObject);
  private
    { Private declarations }
  public
    NEdits : Integer;
    Edits: TEdit;
    m : matriz;
    f,c : Integer;
    con : Integer;
  end;

var
  frmEjecucion: TfrmEjecucion;


implementation

{$R *.dfm}

procedure TfrmEjecucion.Button1Click(Sender: TObject);
var
  i,j : Integer;
begin
  if Trim(Edt.Text) = '' then
  begin
    ShowMessage('Debe escribir un número');
    Exit;
  end;
  //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
    //Establece el valor de la matriz y de los TEdit
    c := StrToInt(Edt.Text);
    f := StrToInt(Edt.Text);
    SetLength(m, StrToInt(Edt.Text),StrToInt(Edt.Text));
    Button1.Visible := False;
    Edt.Visible := False;
  end;
  //Creo y posiciono los Edits
 for i := 1 to c do
  begin
    for j := 1 to f do
    begin
      Edits := TEdit.Create(Self);
      Edits.Name := 'Edit' + IntToStr(i) + IntToStr(j);
      Edits.Text := '';
      Edits.Top := 21 * (i + 1);
      Edits.Left := 21 * (j + 1);
      Edits.Width := 20;
      Edits.Height := 20;
      Edits.AutoSize := False;
      Edits.Enabled := False;
      Edits.Parent := Panel1;
      Button3.Visible := True;
    end;
  end;
end;


procedure TfrmEjecucion.Button2Click(Sender: TObject);
begin
  m := nil;
end;

procedure TfrmEjecucion.Button3Click(Sender: TObject);
var
  i,j,c : Integer;
  Comp : TComponent;
begin
  //Agrega numeros a la matriz aleatoriamente.
  c := StrToInt(Edt.Text);
  For i := 0 to c do
  begin
    for j := 0 to c do
    begin
       Comp := FindComponent ('Edit' + IntToStr(i)+ IntToStr(j));
       if Assigned (Comp) then
       begin
         (Comp as TEdit).Text := IntToStr(Random(100));
       end;
    end;
  end;

end;

procedure TfrmEjecucion.Volver1Click(Sender: TObject);
begin
    Close;
end;

end.

juniorSoft 25-10-2018 03:41:40

Puedes probar algo como esto para no utilizar el método FindComponent
Código Delphi [-]
Const
    max = 10;
type
   TArrEdits = array[1..max, 1..max] of TEdit;

procedure CrearEdits(Edits:TArrEdits);
var
   I, J:integer;
begin
   Button1.Visible := False;
    for i:=1 to max do
        for J:=1 to max 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;

procedure llenarEdits(Edits:TArrEdits);
var
  I, J:integer;

begin
       for i:=1 to max do
        for J:=1 to max do
            begin
                Edits[I, J].text :=IntToStr(Random(100));
           end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  ArrEdits:TArrEdits;
begin
   CrearEdits(ArrEdits);
   llenarEdits(ArrEdits);
end;

roman 25-10-2018 14:36:15

Tal como propone juniorSoft es lo más adecuado en mi opinión. No hay necesdad de utilizar el nombre de un componente cuando nosotros mismos lo creamos.

// Saludos

TavoBran 25-10-2018 16:31:51

juniorSoft esta muy buena esa idea pero yo quiero utilizar una matriz dinamica y como veo en tu ejemplo es estatica ya que tu le pones el valor en max, como hago para que esa variable const no sea constante si no que el usuario la defina por medio de un edit.

no se si me hice entender.

gracias por vuestra ayuda.

roman 25-10-2018 17:14:57

No hay gran problema con eso, con que sea estática, pues tú mismo fijaste un límite máximo. Puedes declarar la matriz con las dimensionaes máximas y cuando el usuario escoja el número de celdas (que deberá ser menor que el máximo) sólo creas ese número de componentes quedando el resto de entradas en nil.

De todas formas, si quieres que sea diinámica, tampoco hay problema. Declara un tipo de datos:

Código Delphi [-]
type
  TEditMatriz = array of array of TEdit;

y usas SetLength para definir las dimensiones según la elección del usuario.

// Saludos

juniorSoft 25-10-2018 17:34:55

Hola TavoBran,,


podrías hacer varios cambios

Código:

type
  TArrEdits =  array of array of TEdit;

procedure CrearEdits(var Edits:TArrEdits; MaxX, MaxY:integer);
var
  I, J:integer;
begin
  Button1.Visible := False;
    for i:=0 to MaxX-1 do
        for J:=0 to MaxY-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;

procedure llenarEdits(var Edits:TArrEdits; MaxX, MaxY:integer);
var
  I, J:integer;

begin
      for i:=0 to MaxX-1 do
        for J:=0 to MaxY-1 do
            begin
                Edits[I, J].text :=IntToStr(Random(100));
          end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  ArrEdits:TArrEdits;
  MX, MY:integer; //maximo de  columnas y filas
begin
    //pedir al usuario los valores de MX y MY
    SetLength(ArrEdits, MX, MY); //Aquí se establece las dimenciones del array en dos dimensiones
  CrearEdits(ArrEdits);
  llenarEdits(ArrEdits);
end;


Un detalle que falto en el anterior ejemplo es que los parámetros debes declararlos por referencia.

Otra observación: los Arrays dinámicos empiezan en cero(0).

Saludos,

juniorSoft 25-10-2018 17:39:16

También como dice Roman puedes establecer la constante a una cantidad limite
y pedirle al usuario que introduzca la cantidad que desea que no exceda la cantidad limite de edits.

TavoBran 25-10-2018 17:44:19

roman si eso yo lo defino como me dices solo que tengo otra duda

este es mi codigo

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
    { Public declarations }
  end;

var
  frmEjecucion: TfrmEjecucion;
  m : TMatriz;
  ma : Integer;

implementation

{$R *.dfm}

procedure CrearEdits(Edits:TMatriz);
var
  i,j :integer;
begin
  for i := 1 to ma do
  begin
    for j := 1 to ma 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;
    end;
  end;
end;


procedure llenarEdits(Edits:TMatriz);
var
  i, j:integer;
begin
  for i:=1 to ma do
  begin
    for j:=1 to ma do
    begin
      Edits[i,j].text := IntToStr(Random(100));
    end;
  end;
end;

procedure TfrmEjecucion.Button1Click(Sender: TObject);
var
  matriz:TMatriz;
  i,j : 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
    //Establece el valor de la matriz
    ma := StrToInt(Edt.Text);
    SetLength(m, StrToInt(Edt.Text),StrToInt(Edt.Text));
    Button1.Visible := False;
    Edt.Visible := False;
  end;
  CrearEdits(matriz);
  llenarEdits(matriz);
end;

end.

pero me genera dos errores que son al momento de crear los edit

Código Delphi [-]

Edits[i,j]:=TEdit.Create(Self);  // [dcc32 Error] Ejecucion.pas(46): E2003 Undeclared identifier: 'Self'
Edits[i,j].Parent := Panel1;  //[dcc32 Error] Ejecucion.pas(54): E2003 Undeclared identifier: 'Panel1'

lo tengo asi pero me genera error en esas dos lineas de codigo

juniorSoft 25-10-2018 17:54:17

Cita:

pero me genera dos errores que son al momento de crear los edit
El error esta en que estan como procedimientos sueltos, declaralos como métodos de la clase del formulario.

roman 25-10-2018 17:56:52

Eso es porque LlenarEdits y Crear Edits están declarados como procedimientos independientes. Debes declararlos como métodos del formulario:

Código Delphi [-]
TfrmEjecucion = class(TForm)
  procedure CrearEdits(Edits:TMatriz);
  procedure LlenarEdits(Edits:TMatriz);

y al momento de implementarlos, anteponer el prefijo TfrmEjecucion. al nombre del procedimiento.

// Saludos

juniorSoft 25-10-2018 18:01:09

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

TavoBran 25-10-2018 18:10:39

JuniorSoft como asi estoy perdido.

es que no llevo mucho tiempo programando y aun hay cosas que no tengo claras si me puedes explicar te agradecería mucho.

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 22:50:30.

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