Ver Mensaje Individual
  #1  
Antiguo 09-04-2017
Avatar de mRoman
mRoman mRoman is offline
Miembro
 
Registrado: nov 2003
Posts: 599
Reputación: 21
mRoman Va por buen camino
Crear botones en tiempo de ejecucion

Hola amigos....aqui de nuevo solicitandoles de su apoyo.

Trabajo con: Delphi6, Firebird 2.0

Estoy tratano de hacer un arreglo de botones y que estos se muestren en la pantalla para el usuario. El sistema q estoy desarrollando es uno de comandas, el cliente quiere que por cada comanda se genere un boton en la pantalla, y que estos se ordenen en base a los numeros de mesa. El caso de los numeros de mesas es el siguiente:

1 fila de mesas, serian las mesas 1....y cada mesa seria 1,2,3,4,5, etc., de tal manera que la mesa 11, es un numero compuesto para identificar las mesa 1 de la fila de mesas 1, y para las mesas de la fila 2, seria igual: 21,23,24,25 etc...

Aqui es donde el cliente quiere lo siguiente:

Q en el pantalla se le generen en una primer fila de botones, todos las mesas q correspondan a la fila 1...boton11=mesa11, boton12=mesa12, boton3=mesa13...etc
En una segunda fila de botones, todas las mesas de la fila 2...boton21=mesa21, boton22=mesa22, etc.

Buscando en este foro me encontré este codigo de efcsa, le hice unas modificaciones para hacer lo q requiero, pero me marca un error...aqui mi codigo:
Código Delphi [-]
procedure TForm1.BitBtn1Click(Sender: TObject);
var
  MaxC, MaxR, c, r: Integer;
  iTop, iLeft: Integer;
  iHeight, iWidth , nn: Integer;
begin
  MaxC := StrToInt(edit1.Text);  // Nro columnas
  MaxR := StrToInt(edit2.text);  // Nro filas
  SetLength(v, MaxC+1, MaxR+1);  // Inicializar arreglo

  iWidth  := 75;    // ancho botón
  iHeight := 25;    // alto botón
  iTop    := 100;   // inicio de filas
  nn      := 1;     // contador

  for c := 1 to 30 do
  begin
    if c=StrToInt(Edit2.Text) then
    begin
          iLeft := 100;   // inicio de columnas
          for r := 1 to 30 do
          begin
                if r=StrToInt(Edit1.Text) then
                begin
                      v[c,r]         := TButton.Create(Self);
                      v[c,r].Name    := 'DynButton' + IntTostr(nn);
                      v[c,r].Caption := v[c,r].Name;
                      v[c,r].Width   := iWidth;
                      v[c,r].Height  := iHeight;
                      v[c,r].Top     := iTop;
                      v[c,r].Left    := iLeft;
                      v[c,r].Parent  := Self;
                      Inc(iLeft, iWidth + 15);  // 15: separación horizontal
                      Inc(nn);  // contador
                end;
          end;
          Inc(iTop, iHeight + 25);  // 25: separación vertical
    end;
  end;
end;

Mas arriba defino un array de botones:
Código Delphi [-]
    v: array of array of TButton;

Lo que busco es algo como lo siguiente:

Buscar dentro del array, la CELDA para ahi almacenar el boton, y visualmente dejarlo en esa posicicion, por ejemplo si SE ABRE LA MESA 34, que en la linea 3, columna 4, crear el boton y visualmente que se vea ahi....se podrá hacer esto????

Tambien estoy abierto a mejores ideas....no estoy "casado" con esta q expongo....porq me salta ahoria una idea....crear desde un inicio todos los botones que necesito y q el usuario de click sobre el boton deseado q corresponda a la mesa, para abrirle la cuenta....sería otra opcion....

Aqui les dejo el codigo de mi sistema donde creo los botones en tiempo de ejecución, pero se generan en el orden en que se van creando....
Código Delphi [-]
procedure TfrmMesasAbiertas.CrearBoton();
begin
     n:=n+1;
     Botones[n]:=TBitBtn.Create(Self);
     with Botones[n] do
     begin
         Caption:=nIDMesa+'-'+BD.AliasEmpleado;
//         bCaption:=Caption;
//         IdRegistro:=
         Hint:=nIDMesa;
         Parent:=ScrollBox1;
         Height:=vHeight;
         PosY:=PosY+Height+10;
         if n>1 then
            vLeft:=vLeft+126;
         if vLeft=1270 then
         begin
             vTop:=vTop+87;
             vLeft:=10;
         end;
         Top:=vTop;
         Left:=vLeft;
         Width:=vWidth;
         OnClick:=BitBtn1Click;
         Name:='btn'+IntToStr(n);
         Font.Size:=13;
//         Tag:=n;
         Tag:=BD.n_IDRegistro;
         IDRegistro:=BD.n_IDRegistro;
         ValidarTicketSinDetalle();
         if qryValidarTicketSinDetalle.FieldByName('regs').AsInteger=0 then
            Glyph:=BitBtn2.Glyph
         else
            Glyph:=BitBtn1.Glyph;
         Layout:=blGlyphTop;
     end;
end;

Bueno espero me puedan orientar en lo antes expuesto. Saludos !!!!...(hacia mucho que no los consultaba)...

GRacias!"!!
__________________
Miguel Román

Afectuoso saludo desde tierras mexicanas....un aguachile?, con unas "cetaseas" bien "muertas"?, VENTE PUES !!

Última edición por mRoman fecha: 09-04-2017 a las 04:05:36.
Responder Con Cita