Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Cambiar caption de botón de otro formulario (https://www.clubdelphi.com/foros/showthread.php?t=95424)

mRoman 10-10-2021 03:58:08

Cambiar caption de botón de otro formulario
 
Hola amigos buenas noches.

Estoy tratando de cambiar el CAPTION de un tBitBtn creado dinámicamente en otro formulario. En ese otro formulario se da click sobre el botón creado dinámicamente para mostrar otra pantalla, en esta pantalla se realiza ciertas acciones que se crea una "leyenda" la cual necesito se coloque en el caption del boton.

Estoy tratando de hacer esto:
Código Delphi [-]
        frmMeseroMain((Sender as tBitBtn).Caption:=Label2.Caption);

La verdad estaba experimentando haber si me funcionaba, pero no lo hace, obvio marca error...."Missing operator or semicolon"...

Entonces, de que otra manera puedo accesar al caption del botón q es creado dinámicamente desde otro formulario para cambiárselo??

Gracias por su tiempo.

Casimiro Notevi 10-10-2021 11:10:45

A falta de más código, por decir algo, ¿has probado de modo "normal"?
Código Delphi [-]
formulario.boton.caption := 'nuevo caption';

ecfisa 10-10-2021 16:49:41

Hola.

Podrías hacer:
Código Delphi [-]
...
var
  bt: TBitBtn;
begin
  OtroForm := TOtroForm.Create(Self);
  OtroForm.Show;

  // NombreDelBoton(TBitBtn) fue creado dinámicamente en OtroForm en este punto

  bt := TBitBtn(OtroForm.FindComponent('NombreDelBoton'));
  if Assigned(bt) then
    bt.Caption := 'New Caption';

  ...
end;

Saludos :)

mRoman 10-10-2021 21:06:15

Cita:

Empezado por Casimiro Notevi (Mensaje 543459)
A falta de más código, por decir algo, ¿has probado de modo "normal"?
Código Delphi [-]
formulario.boton.caption := 'nuevo caption';

Gracias por contestar Casimiro.

Claro q ese sería lo mas obvio....si el botón lo creara en tiempo de diseño, pero este se crea en tiempo de ejecución...en la parte de ".boton.caption...etc", como hago la referencia en "boton", que iria ahi, si el botón es creado cuando se corre la aplicación??...es eso lo que no sé, como puedo accesar a ese botón en especifico?, puede ser 1,2,3 o más botones los que se crean....como le hago para saber q botón se pulso y de esa manera acceder a su caption después, para cambiarla lo q tenga ahi.

Para los botones que coloco en tiempo de diseño no tengo problema "tForm1.btnAceptar.Caption:="...pero los q se crean en tiempo de ejecución, no se como hacer la referencia a esos botones....

Bueno, gracias por contestar

mRoman 10-10-2021 21:10:47

Cita:

Empezado por ecfisa (Mensaje 543463)
Hola.

Podrías hacer:
Código Delphi [-]
...
var
  bt: TBitBtn;
begin
  OtroForm := TOtroForm.Create(Self);
  OtroForm.Show;

  // NombreDelBoton(TBitBtn) fue creado dinámicamente en OtroForm en este punto

  bt := TBitBtn(OtroForm.FindComponent('NombreDelBoton'));
  if Assigned(bt) then
    bt.Caption := 'New Caption';

  ...
end;

Saludos :)

Hola Daniel, gracias por contestar.

Ahora q leo tu código ya me da un mejor panorama por donde ir.
Con este código creo los botones...
Código Delphi [-]
procedure TfrmCambiarMesa.FormShow(Sender: TObject);
var
    PosY: Integer;
    nLeft:Integer;
begin
//    edMesaActual.Text:=frmRegComanda.Edit1.Text;
    Label3.Caption:=frmRegComanda.Edit1.Text;
    BitBtn1.Enabled:=False;
    qryMesas.Close;
    qryMesas.Open;
    qryMesas.First;

    while ScrollBox1.ControlCount > 0 do
        ScrollBox1.Controls[0].Free;

     PosY:=8;
     nLeft:=8;
     n:=1;

     if not(qryMesas.IsEmpty) then
     begin
         While not qryMesas.Eof do
         begin
            BtnsMesas[n]:=TBitBtn.Create(Self);
            with BtnsMesas[n] do
            begin
                Caption:=qryMesas.FieldByName('MESA_NUM').AsString;
                Parent:=ScrollBox1;
                Height:=100;
                Top:=PosY;
                Left:=nLeft;
                if nLeft=508 then begin //200
                   nLeft:=8;
                   PosY:=PosY+Height+5
                end Else Begin
                   nLeft:=nLeft+100;
                end;
                Width:=100;
                OnClick:=OnButtonClick1;
                Font.Size:=12;
                Tag:=qryMesas.FieldByName('MESA_NUM').AsInteger;
                Font.Style:=[fsBold];
                Layout:=blGlyphTop;
                Glyph:=Image2.Picture.Bitmap;
            end;
            qryMesas.Next;
            inc(n);
         end;
    end;
end;

En este codigo no uso la propiedad "Name" del boton, la usaré para crearle un nombre y asi poder acceder a su caption, siguiendo el código q me enviaste.

Lo aplico en cuanto pueda y les comento como me fue.

Saludos y gracias por tu tiempo.

Casimiro Notevi 10-10-2021 22:35:50

Cita:

Empezado por mRoman (Mensaje 543464)
si el botón lo creara en tiempo de diseño, pero este se crea en tiempo de ejecución...

Se me pasó ese "pequeño" detalle :rolleyes:

mRoman 11-10-2021 16:30:18

Resuelto
 
Cita:

Empezado por ecfisa (Mensaje 543463)
Hola.

Podrías hacer:
Código Delphi [-]
...
var
  bt: TBitBtn;
begin
  OtroForm := TOtroForm.Create(Self);
  OtroForm.Show;

  // NombreDelBoton(TBitBtn) fue creado dinámicamente en OtroForm en este punto

  bt := TBitBtn(OtroForm.FindComponent('NombreDelBoton'));
  if Assigned(bt) then
    bt.Caption := 'New Caption';

  ...
end;

Saludos :)

Hola Daniel.

Comentarte a ti y a todos los del foro como quedó solucionado, aqui el código:
Código Delphi [-]
procedure TfrmCambiarMesa.BitBtn1Click(Sender: TObject);
var
   bt: tBitBtn;
begin
   if Application.MessageBox('Es correcto el CAMBIO DE MESA','Pregunta',mb_OkCancel+mb_IconQuestion)=idOk then
   begin
        frmRegComanda.nFlagCerrarCambioMesa:=1;
        qryEjecuta.Prepare;
        qryEjecuta.ParamByName('NUM_MESA').AsString:=Label2.Caption;
        qryEjecuta.ParamByName('LETRA').AsString:='';
        qryEjecuta.ParamByName('COMANDA_ID').AsString:=frmRegComanda.Edit4.Text;
        qryEjecuta.ParamByName('EMP_ID').AsInteger:=qryEmpleado.fieldByName('EMPLEADO_ID').AsInteger;
        qryejecuta.ExecSQL;
        DM.trsComanda.Commit;

        bt:= tBitBtn(frmMeseroMain.FindComponent(frmMeseroMain.NombreBoton) );
        if Assigned(bt) then
            bt.Caption:=Label2.Caption;


        Application.MessageBox('Cambio realizado exitosamente','Aviso',mb_Ok+mb_IconInformation);

        Close;
   end;
end;

Aqui parte del codigo del formulario "frmMeseroMain" en donde se crean dinámicamente los botones:

Código Delphi [-]
procedure TfrmMeseroMain.MostrarMesas;
var
    PosY: Integer;
    nLeft:Integer;
begin
    // **** Con el siguiente codigo eliminamos los botones que puedan estar dentro del SCROLLBOX1 *****
    
    ScrollBox1.Visible:=True;
    while ScrollBox1.ControlCount > 0 do
        ScrollBox1.Controls[0].Free;

//************* CREA LOS BOTONES POR CADA MESA *****************
     PosY:=8;
     nLeft:=8;
     n:=1;
     qryMesas.Close;
     qryMesas.ParamByName('EMP_ID').AsString:=vNumEmpl;
     qryMesas.Open;
     qryMesas.First;
{     if not(qryMesas.IsEmpty) then
     begin}
         While not qryMesas.Eof do
         begin
            Botones[n]:=TBitBtn.Create(Self);
            with Botones[n] do
            begin
                Caption:=qryMesas.fieldbyname('MESA').AsString;
                Parent:=ScrollBox1;
                Height:=75;
                Top:=PosY;
                Left:=nLeft;
                if nLeft=708 then begin
                   nLeft:=8;
                   PosY:=PosY+Height+5
                end Else Begin
                   nLeft:=nLeft+100;
                end;
                Width:=85;
                OnClick:=OnButtonClick1;
                Name:='btn'+IntToStr(n);
                Font.Size:=13;
                Font.Style:=[fsBold];
                Layout:=blGlyphTop;
                ShowHint:=True;
                Hint:='No. Comanda: '+qryMesas.FieldByName('COMANDA_ID').AsString+' Nombre:'+Name;
                if qryMesas.FieldByName('COMANDA_ESTATUS').AsString='A' then
                    Glyph:=Image1.Picture.Bitmap;
                if qryMesas.FieldByName('COMANDA_ESTATUS').AsString='C' then
                    Glyph:=Image2.Picture.Bitmap;
                Tag:=qryMesas.fieldByName('COMANDA_ID').AsInteger;
            end;
            qryMesas.Next;
            inc(n);
         end;
{    end Else Begin
        ShowMessage('No tienes aún MESAS ABIERTAS!');
    end;}
    btnAbrirMesa.Enabled:=True;
end;

Y lo que sucede al dar click sobre algunos de los botones creados:
Código Delphi [-]
procedure TfrmMeseroMain.OnButtonClick1(Sender:TObject);
{var
  nRegID2 : Integer;}
begin
     nRegID:=(Sender as TBitBtn).Tag;
     NombreBoton:=(SEnder as tBitBtn).Name; //Aqui le asigno el nombre del boton al dar click sobre el mismo a la variable "NombreBoton"
     IniciaTRS();
     if FindComponent('frmRegComanda') = nil then
           frmRegComanda:=TfrmRegComanda.Create(self);
     frmRegComanda.ShowModal;
end;

Muchas gracias. Saludos.

engranaje 13-10-2021 15:50:04

Veo que ya lo tienes resuelto. Comparto de todas formas el modo en el que resuelvo yo este tipo de tarea por si pudiera resultar interesante. Lo que hago en estos casos es sobrecargar el constructor del formulario que se crea desde un botón para que se le pueda pasar el propio botón "creador" como argumento al constructor del formulario. Un ejemplo sencillo de un formulario con un TEdit y un TButton que al llamar escribir un texto en el edit y pulsar el botón cambia el Caption del botón desde el que se creó ese formulario:
Código Delphi [-]
unit Unit2;

interface

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

type
  TForm2 = class(TForm)
    edt1: TEdit;
    btn1: TButton;
    procedure btn1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    BotonCreador: TButton;
    { Private declarations }
  public
    { Public declarations }
    constructor Create(AOwner: TComponent;aButton:tbutton); overload;
  end;

implementation

{$R *.dfm}

procedure TForm2.btn1Click(Sender: TObject);
begin
   BotonCreador.caption := edt1.text;
end;

constructor TForm2.Create(AOwner: TComponent; aButton: tbutton);
begin
  create(aOwner);
  self.BotonCreador := aButton;
end;

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action:= cafree;
end;

end.

El método que crea formularios y se llamará en el onclick de cada boton creado sería una cosa así:
Código Delphi [-]
procedure TForm1.ClickBotonCreador(Sender: TObject);
begin
  with TForm2.create(self,tButton(Sender)) do
    showmodal;
end;


La franja horaria es GMT +2. Ahora son las 09:02:11.

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