Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Llamar procedure con TStringList (https://www.clubdelphi.com/foros/showthread.php?t=92149)

Unkger 09-08-2017 03:20:55

Llamar procedure con TStringList
 
Hola!, tengo un procedure llamado "listas" donde dentro tengo dos listas "lista1 y lista2", lo que quiero ahora es que cada que le de click a button1 me aparezca la lista1 y cuando le de a button2 me aparezca la lista2 sin tener que hacer dos procedure, aquí el código reducido:

Código Delphi [-]
implementation

procedure listas;
var
lista1 : TStringList;
lista2 : TstringList;
i, j : Integer;
begin
  lista1 := TStringList.Create;
  lista2 := TStringList.Create;

  lista1.Add('1');
  lista1.Add('2');
  lista1.Add('3');

  lista2.Add('4');
  lista2.Add('5');
  lista2.Add('6');

  for i := 0 to lista1.Count - 1 do
  begin
    Form1.ListBox1.items.add(lista1.Strings[i]);
  end;

  for j := 0 to lista2.Count - 1 do
   begin
     Form1.ListBox2.items.add(lista2.Strings[j]);
   end;
end;

Intente con esto pero no funciona:
Código Delphi [-]
implementation
procedure listas;
var
lista1 : TStringList;
lista2 : TstringList;
i, j : Integer;
begin
  lista1 := TStringList.Create;
  lista2 := TStringList.Create;

  lista1.Add('1');
  lista1.Add('2');
  lista1.Add('3');

  lista2.Add('4');
  lista2.Add('5');
  lista2.Add('6');

  for i := 0 to lista1.Count - 1 do
  begin
    Form1.ListBox1.items.add(lista1.Strings[i]);
  end;

  with Form1.Button2 do /////////////////////////
  if sender = Button2 then ///////////////////////
  begin
  for j := 0 to lista2.Count - 1 do
   begin
     Form1.ListBox2.items.add(lista2.Strings[j]);
   end;
  end;
end;

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
listas; ???????
end;

Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject);
begin
????????
end;

AgustinOrtu 09-08-2017 05:07:09

La unica forma es que tu procedimiento reciba un parametro que es el que indica si es el boton 1 o el boton 2.

Tu codigo no funciona porque dentro del procedimiento listas no se conoce a ninguna variable llamada sender. Sender es un parametro que se manda en casi todos los eventos de los components de la VCL, y es un puntero al objeto que recibe dicho evento, al que se lo notifica de que "algo" paso. Un ejemplo es el OnClick de un TButton, en ese caso Sender apunta al objeto TButton que fue clickeado

manelb 09-08-2017 09:42:32

Fijate en el siguiente código....

En él tengo dos botones conectados al mismo evento de forma que llaman al mismo procedimiento, reconociendo este de que botón procede la llamada.

Código Delphi [-]
implementation

{$R *.dfm}

procedure TForm2.ButtonClick(Sender: TObject);
begin
  lista(sender);
end;

procedure TForm2.lista(sender: TObject);
begin

  if sender=Button1 then
  begin
    showmessage(TButton(sender).caption);
  end
  else begin
    showmessage(TButton(sender).caption);
  end;
end;

ecfisa 09-08-2017 20:40:38

Hola.

Para reconocer de que botón procede la llamada podes evaluar el nombre del argumento enviado.

A modo de ejemplo:
Código Delphi [-]
type
  TForm1 = class(TForm)
  ...
  private
    procedure Listas(Sender: TObject);
  ...

implementation

procedure TForm1.Listas(Sender: TObject);
var
  lista1 : TStringList;
  lista2 : TstringList;
begin
  if not (Sender is TButton) then Exit; // si no es un TButton -> Salir

  lista1 := TStringList.Create;
  lista2 := TStringList.Create;
  try
    lista1.Add('1');
    lista1.Add('2');
    lista1.Add('3');

    lista2.Add('4');
    lista2.Add('5');
    lista2.Add('6');

    if TButton(Sender).Name = 'Button1' then   // ¿ Es Button1 ?
      ListBox1.Items.AddStrings(lista1);

    if TButton(Sender).Name = 'Button2' then  // ¿ Es Button2 ?
      ListBox2.Items.AddStrings(lista2);

  finally
    lista1.Free;
    lista2.Free;
  end;
end;

...
Algo muy importante: Fijate que al finalizar el procedimiento se libera la memoria ocupada por la creación de las dos listas.

Saludos :)

TOPX 09-08-2017 22:50:46

Cita:

Empezado por ecfisa (Mensaje 520148)
Código Delphi [-]
    if TButton(Sender).Name = 'Button1' then   // ¿ Es Button1 ?
      ListBox1.Items.AddStrings(lista1);

    if TButton(Sender).Name = 'Button2' then  // ¿ Es Button2 ?
      ListBox2.Items.AddStrings(lista2);

Personalmente, me gustaría más de la siguiente manera:
Código Delphi [-]
    if Sender = Button1 then   // ¿ Es Button1 ?
      ListBox1.Items.AddStrings(lista1)
    else
    if Sender = Button2 then  // ¿ Es Button2 ?
      ListBox2.Items.AddStrings(lista2);
Pero creo que ya son reparos de la vejez.
-

Unkger 09-08-2017 23:40:31

Muchas gracias a todos por su ayuda!, esto quedó resuelto. Es verdad ecfisa, se me paso liberar, gracias. :D


La franja horaria es GMT +2. Ahora son las 10:25: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