Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Lazarus, FreePascal, Kylix, etc. (https://www.clubdelphi.com/foros/forumdisplay.php?f=14)
-   -   Acceder a un TButton por su nombre (https://www.clubdelphi.com/foros/showthread.php?t=68008)

Firewind 19-05-2010 14:01:06

Acceder a un TButton por su nombre
 
Hola.
Despues de 7 años sin programar en delphi, he tenido que retomar la programacion de escritorio. El problema que tengo es que hay 60 botones y dependiendo de las acciones del usuario, debo cambiar el estado de un boton en concreto.Por ejemplo si uso la llamada MarcaBoton(boton:integer) , en la funcion tengo 60 IF, lo cual es una burrada, por lo que me gustaria saber si puedo hacer un BtnX.disabled, donde X es el valor pasado al procedimiento.
Uso Lazarus + FireBird para el proyecto.
Un saludo.

cecam 19-05-2010 14:22:27

Asignales a todos la misma funcion clik y los discriminas/diferencias de uno u otro por el Sender
Código:

procedure TfrmMain.Button1Click(Sender: TObject);
begin
  If    sender=Button1
  then
  else
  If    sender=Button2
  then
  [...]
end;

Saludos!!

Caro 19-05-2010 14:32:10

Hola Firewind y bienvenido, para acceder por su nombre puedes hacerlo con FindComponent:

Código Delphi [-]
var
 Control : TComponent;
begin
 Control := FindComponent('Btn'+X);
 if Assigned(Control) then
  TButton(Control).Enabled := False;

Saluditos

Firewind 19-05-2010 14:46:48

Gracias a los dos por vuestras respuestas, al final he usado la opcion de Caro y funciona a la perfección.
Un saludo.
PD.- es mi primer mensaje despues de muchos años sin usar pascal, entre el 199x y 2002 si estaba por aqui a menudo :)

maeyanes 19-05-2010 15:47:28

Hola...

Otra opción sería que guardes los botones en una lista al crear la forma, así los buscas por medio de su index:

Código Delphi [-]
type
  TForm1 = class(TForm)
  private
    FBtnList: TObjectList;
  end;

implementation

procedure TForm1.FormCreate(Sender: TObject);
var
  I: Integer;

begin
  FBtnList := TObjectList.Create(False);
  for I := 0 to Pred(ComponentCount) do
    if Components[i] is TButton do
      FBtnList.Add(Components[i])
end;

procedure TForm1.MarcaBoton(Index: Integer);
begin
  TButton(FBtnList[Index]).Enabled := False
end;

Aquí lo único es que el rango sería de 0 a n - 1...


Saludos...

Faust 19-05-2010 16:44:21

Se me ocurre otra que he usado en estos casos:

Lla función:

Código Delphi [-]
function FindCompByName(AContainer: TForm; AName: TComponentName):TComponent;
var
  i: Integer;
begin
  Result:= nil;
  for i:= 0 to AContainer.ComponentCount - 1do
    if AContainer.Components[i].Name = AName then
      Result:= AContainer.Components[i]
end;

Recibe como parámetros el nombre de un contenedor, en este caso un Form, y un nombre de un componente, te devuelve ese componente.

Este es un ejemplo de como usarlo:

Código Delphi [-]
procedure TForm1.btnTestClick(Sender: TObject);
begin
  with TStringGrid(FindCompByName(Self, 'grdAquiEstoy')) do
  begin
    DefaultColWidth:= 60;
    DefaultRowHeight:= 20;
//  Aqui puedes poner código para manipular el componente
  end;
end;

Para realizar este ejemplo pon varios controles en un formulario, además un botón llamado btnTest y un stringgrid llamado grdAquiEstoy, en el OnClick del botón btnTest inserta este código y afectará las columnas y filas del stringgrid, espero te sirva.

NOTA: Este no verifica si existe o no el componente, tal y como lo hace el ejemplo de Caro, el control debe existir o debes escribir código para manejar la situación en caso de que no exista.

maeyanes 19-05-2010 17:09:34

Hola...

Faust, siento que estás reinventando la rueda con tu función FindCompByName, ya que la función FindComponent hace exactamente lo mismo...


Saludos...

Faust 19-05-2010 17:15:56

Cita:

Empezado por maeyanes (Mensaje 364611)
Hola...

Faust, siento que estás reinventando la rueda con tu función FindCompByName, ya que la función FindComponent hace exactamente lo mismo...


Saludos...

Ja ja ja... ya me había pasado con otras funciones... :D :D :D

ALguna vez hice una parecia a TryStrToInt... era igualita, gracias por el dato...


La franja horaria es GMT +2. Ahora son las 21:53:15.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi