Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   funcion para no repetir codigo:( (https://www.clubdelphi.com/foros/showthread.php?t=75293)

ivantj24 11-08-2011 06:55:51

funcion para no repetir codigo:(
 
Holas que tal comunidad, espero en este tema si me puedan ayudar ya que con los remobjects de plano nadie me ha respondido nada :(, bueno expongo el siguiente tema:

lo que sucede es que ya que ando metido de lleno en delphi y en la programacion, estoy buscando alternativas para ahorrarme codigo y de paso que sea mas profesional, si alguien me pudiera ayudar de antemano como siempre mucha sgracias.

lo que intento es que tengo 8 botones ocultos, quiero que al hacer click en un menu, se visualice una pestania del pagecontrol, en este caso al seleccionar 1 si esta visible otra que se oculte para darle paso a la que acabo de clickear, para dar una idea hice este codigo con solo 4 botones:
Código Delphi [-]
if button1.enabled = True then
 begin
  button1.visible:= true;
  button2.visible:= False;
  button3.visible:= False;
  button4.visible:= false;
 end
else if button2.enabled = true then
 begin
  button1.visible:= False;
  button2.visible:= True;
  button3.visible:= False;
  button4.visible:= false; 
 end
else if button3.enabled = true then
 begin
  button1.visible:= False;
  button2.visible:= False;
  button3.visible:= True;
  button4.visible:= false; 
 end
else if button4.enabled = tue then
 begin
  button1.visible:= False;
  button2.visible:= False;
  button3.visible:= False;
  button4.visible:= True; 
 end

este codigo funciona y siempre lo he hecho para este tipo de casos pero me doy cuenta que es demasiado codigo para 4 botones, y yo tengo 8 :S aparte despues haria lo mismo para diferentes pagecontrol :S, lo que requiero es una funcion, que al clickear envie un parametro y segun el parametro este solo sea el visible y todos los demas, en mi caso los 7 botones restantes se oculten, pero como lo mostre hace un momento no quiero repetir todo el codigo mencionando todos los botones ocultos y solo el que sera visible,

intente hacer un arreglo :S:S:S en donde meto todo el codigo de los componentes, pero es obvio que nunca funcionaria por que un componente creo, no puede ser colocado como un string, y despues hacer que funcione como un objeto :S

Código Delphi [-]
procedure TfrmPrincipal.PestaniaVisible(NoPestania : Integer);
var
  i : integer;
  Pestania : array[0..7] of Variant;
begin
  Pestania[0]:= dxRibbonPrincipalTab3.Visible;
  Pestania[1]:= dxRibbonPrincipalTab4.Visible;
  Pestania[2]:= dxRibbonPrincipalTab5.Visible;
  Pestania[3]:= dxRibbonPrincipalTab6.Visible;
  Pestania[4]:= dxRibbonPrincipalTab7.Visible;
  Pestania[5]:= dxRibbonPrincipalTab8.Visible;
  Pestania[6]:= dxRibbonPrincipalTab9.Visible;
  Pestania[7]:= dxRibbonPrincipalTab10.Visible;
  i:= 0;
  while i <= 7  do
    begin
      if i <> NoPestania then
        begin
          Pestania[i]:= False;
        end
      else
        Pestania[i]:= True;
      i:= i +1;
    end;
end;

era algo asi en donde en un arreglo guardaba las declaraciones de los botones, en mi caso son pestanias, de un pagecontrol, y segun el parametro que enviaba, esa pestanaia que estaba almacenada en el arreglo, lo pondria despues en True, si es que coincidia, sino pues se pondria en False, es obvio que nunca haria nada pro que primero lo pongo en string y despues lo pongo en True, sobreescribiendo el valor de un string a true, pero bueno esa fue un intento fallido y algo tonto, :S pero por lo menos lo intente, espero me puedan ayudar en esto por que no se como hacerle o si es que se puede hacer de esa forma, o si me tengo que conformar con todo el codigo de los if, o case :S que es lo mismo :(, espero me puedan ayudar o orientar se los agradeceria, saludos :(

olbeup 11-08-2011 07:52:56

Respecto a visualizar los botones que quieres, la solución es poner a cada botón en la variable Tag un número 1..4 y con éste procedimiento hacerlo todo.
Código Delphi [-]
procedure ShowButtonVisible(btn: ShortInt);
begin
  Button1.Visible := (Button1.Tag = btn);
  Button2.Visible := (Button2.Tag = btn);
  Button3.Visible := (Button3.Tag = btn);
  Button4.Visible := (Button4.Tag = btn);
end;
Espero que te sirva.
Un saludo.

olbeup 11-08-2011 07:56:27

Respecto a las pestañas seria de la misma forma que los botones.
Un saludo.

ElDioni 11-08-2011 08:14:31

Hola, por si quieres otra opción o por si te sirve para otras cosas también podrías hacer lo siguiente, pasando como parametro el número del botón que quieres hacer visible podrías hacer lo siguiente:

Código Delphi [-]
procedure mostrarboton(numero:string);
var
x:integer;
begin
for x:=1 to 8 do
  begin
    TButton(FindComponent('Button'+inttostr(x))).Visible:=false;
  end;
TButton(FindComponent('Button'+numero)).Visible:=true;
end;

Espero te sirva.
Saludos.

ivantj24 11-08-2011 08:18:19

hola que tal olbeup muchas gracias por la respuesta, y te mentiria si es que le he entendido, creo que si en parte pero quisiera aclararlo, ok entonces a las pestanias, les pongo un numero diferente en su propiedad TAG como me has dicho, que por cierto si lo traen, una vez que estan puestos los numeros, supongo que al dar click en un boton eligiendo que pestania quiero que se vea, tengo que enviar el numero del TAG que pertenece a la pestania que quiero visualizar, algo asi, este es en realidad el nombre del procedimiento y asi enviare el numero
Cita:

procedure TfrmPrincipal.dxBarLargeButton1Click(Sender: TObject);
begin
PestaniaVisible(0);
end;
con esto envio el numero de la pestania, que tien el TAG, el procedimiento entonces recibe el numero, lo carga en la variable btn que tu declaraste y lo asigna segun corresponda el boton, es lo que entiendo, pero en que momento digo o menciono que 'Visible:= True;' creo que es esa la parte en la que no entiendo y la parte en la que los demas botones los pongo en False, espero no dar mucha molestia con el tema, y sorry si no entendi, sera que como son las 11:42 PM ya por hoy no doy mas, entendi muy bien lo que mencionas en cierta parte, pero no en donde te digo como poner a los demas en False, y al boton que elijo en True, muchas gracias pro la ayuda que me has dado y espero me puedas aclarar ese punto , gracias

ivantj24 11-08-2011 08:21:19

ElDioni andale eso es lo que estaba intentando con el array en tipo variant xD pero estaba cometiendo ese gran error xDDDD de despues cargar los datos con TRUE, probare tu procedimiento al igual que el procedimiento de olbeup, muchisimas gracias a ambos por tomarse la molestia de responder a mi pregunta, de antemano gracias enserio, siempre es un gusto saber que hay personas que se toman el tiempo para ayudar a otros :) gracias

Neftali [Germán.Estévez] 11-08-2011 09:44:38

Cita:

Empezado por ivantj24 (Mensaje 409143)
lo que intento es que tengo 8 botones ocultos, quiero que al hacer click en un menu, se visualice una pestania del pagecontrol, en este caso al seleccionar 1 si esta visible otra que se oculte para darle paso a la que acabo de clickear, para dar una idea hice este codigo con solo 4 botones,....


Para la prrimera yo hubiera hecho algo así (funciona con cualquier número de botones que pases como parámetro, ya sean 4, 8,...)

Código Delphi [-]
procedure TForm1.MostrarOcultarBotones(btnArray: array of TButton);
var
  i, j:integer;
begin
  for j := Low(btnArray) to High(btnArray) do begin
    if btnArray[j].Enabled then begin
      for i := Low(btnArray) to High(btnArray) do begin
        btnArray[i].Visible := (i = j);
      end;
    end;
  end;
end;

La segunda no me ha quedado muy clara, pero supongo que puedes hacer algo similar.

olbeup 11-08-2011 14:02:38

Código Delphi [-]
procedure TfrmPrincipal.ShowButtonVisible(btn: ShortInt);
begin
  Button1.Visible := (Button1.Tag = btn);
  Button2.Visible := (Button2.Tag = btn);
  Button3.Visible := (Button3.Tag = btn);
  Button4.Visible := (Button4.Tag = btn);
end;

procedure TfrmPrincipal.ShowTabSheetVisible(ts: ShortInt);
begin
  TabSheet1.Visible := (TabSheet1.Tag = ts);
  TabSheet2.Visible := (TabSheet2.Tag = ts);
  TabSheet3.Visible := (TabSheet3.Tag = ts);
  TabSheet4.Visible := (TabSheet4.Tag = ts);
end;

Sustituye éste
Cita:

procedure TfrmPrincipal.dxBarLargeButton1Click(Sender: TObject);
begin
PestaniaVisible(0);
end;
Por éste
Código Delphi [-]
procedure TfrmPrincipal.dxBarLargeButton1Click(Sender: TObject);
begin
  ShowButtonVisible((Sender as TButton).Tag);
  ShowTabSheetVisible((Sender as TButton).Tag);
end;

ecfisa 11-08-2011 14:36:12

Hola ivantj24.

Otra opción más para ocultar los botones:
Código Delphi [-]
procedure TForm1.ButtonsClick(Sender: TObject);
var
  i: Integer;
begin
  for i:= 0 to ComponentCount-1 do
   if(Components[i] is TButton) and (TButton(Components[i]).Name <> TButton(Sender).Name) then
     TButton(Components[i]).Visible:= False;
end;

Saludos.

cloayza 11-08-2011 15:21:42

Creo que este código te servira para lo que requieres...

Debes considerar lo siguiente:
El ejercicio consta de:

Un Menu con los siguientes items:

mnuPage0.Caption:='Pagina 0';
mnuPage0.Tag:=0; //COrresponde al indice de la página a mostrar

mnuPage1.Caption:='Pagina 1';
mnuPage1.Tag:=1;

mnuPage2.Caption:='Pagina 2';
mnuPage2.Tag:=2;

En el evento del mnuPage0 escribe este código:

Código Delphi [-]

Procedure TForm1.ShowPage(Index:Integer);
var
   i:Integer;
begin
       //Se asegura de ocultar todas las paginas.
       For i:=0 to PageControl1.PageCount-1 do
            PageControl1.Pages[i].TabVisible:=False;

     //Activa la pagina correspondiente
     PageControl1.Pages[Index].TabVisible:=True;
end;

procedure TForm1.mmuPage0Click(Sender: TObject);
begin
       ShowPage(TMenuItem(Sender).Tag);
end;

Y asocialo a los otros menuitem (mnuPage1, mnuPage2);

Eso seria todo.

ivantj24 11-08-2011 18:05:52

Muchisimas gracias a todos en verdad los que ayudan con las dudas que tenemos quienes comenzamos o tenemos poco tiempo en delphi, en verdad gracias a todos y cada uno :) probe los codigos y si sirven, espero que pueda servir a mas de uno con todas las referencias que me dieron, gracias y saludos comunidad

rpgr 18-10-2012 18:59:17

Activar O Dsactivar Botones
 
procedure TFRMVehiculo.boton(Btn1,Btn2,Btn3,Btn4: Boolean);
begin
// BtnGrabar.Enabled :=Btn1;
// BtnEliminar.Enabled :=Btn2;
// BtnCancelar.Enabled :=Btn3;
// BtnSalida.Enabled :=Btn4;
end;


procedure boton(Btn1,Btn2,Btn3,Btn4: Boolean);
public
{ Public declarations }
end;



y cuando quieras activas o desactiva

boton(false,false,false,true);

Casimiro Noteví 18-10-2012 22:27:45

Recuerda poner los tags al código fuente, ejemplo:



Gracias :)


La franja horaria es GMT +2. Ahora son las 22:16:52.

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