PDA

Ver la Versión Completa : Problemas con botones


LiAnTe-
06-01-2010, 12:23:19
Hola a Tod@s,

a ver si me podeis ayudar estoy creando botones en un panel, pero me hace falta que siga creando en la siguiente colunma y que sepa y siga creando botones hasta terminar el panel y si no caben en ese panel que me los coloque en el siguiente panel al pulsar el boton siguiente....

os pego mi codigo para que veais que ahora actualmente ya estoy visualizando los botones pero me falta como ya os comento que siga en la siguiente columna y que haga tantos botones como grande sea el panel.

begin
vTop := 1;
vInicio := 1;
vPestanyaPersonal := Personal;
vPestanyaProductos := Familias;

BDades.TPersonal.Active := False;
BDades.TPersonal.SelectSQL.Text := 'Select * from Personal where tienda = ' + '''' + BDades.TConfigTIENDA.Text + '''';
BDades.TPersonal.Open;
BDades.TPersonal.Active := True;
BDades.TPersonal.First;

While BDades.TPersonal.Eof = False do
Begin
vPersonalNombre := BDades.TPersonal.FieldByName('NOMBRE').AsString;
vPersonalCodigo := BDades.TPersonal.FieldByName('CODIGO').AsInteger;

vBotonPersonal := TButton.create(self);
vBotonPersonal.Parent := vPestanyaPersonal;
vBotonPersonal.Caption := vPersonalNombre;
vBotonPersonal.Height := 69;
vBotonPersonal.Width := 120;
vBotonPersonal.Left := vInicio; // Inicio
vBotonPersonal.Top := vTop; // Altura
vBotonPersonal.Enabled := True;
vBotonPersonal.visible := True;
vBotonPersonal.Tag := vPersonalCodigo;
vBotonPersonal.OnClick := vPersonalBotonOnClick;
vBotonPersonal.Show;

BDades.TPersonal.Next;
vTop := vTop + 70;

if vTop > 420 Then
Begin
vInicio := 1;
vTop := 1;
end;
end;

cmm07
06-01-2010, 14:25:19
Hola, supongo que lo puedes hacer utilizando la logica:

Creamos 3 variables:
- ParentVarMin, ParentVarMax: TPanel
- TopCount, LeftCount : Integer

ParentVarMin quiere decir el panel de partida, y el ParentVarMax quiere decir el panel final.

entonces configuramos ambas variables ya mensionadas, ahora suponiendo que
el panel tiene un Width de 400 igual que Height y los botones un Width de 40 igual que Height, veriamos por logica que en un panel de esas dimensiones caberían en un total de 100 Botones por Width y Height ¿me entiendo?.

Boton 40x40
Panel 400x400

TopCount, LeftCount = 0

Se puede hacer un for entre la división del Panel con el boton (Width) (400/40 = 10) multiplicado por la división entre el Panel con el Boton (Height)(400/40 = 10) en total da un resultado de (10 * 10 = 100)

y dentro del for lo siguiente:

- un if que dice si ParentVarMin = ParentVarMax entonces Pare STOP pero si no es lo siguiente:

- Creamos otro for entre la división del Panel con el boton (Width) (400/40 = 10) y dentro de este:

- Creamos un botón con un Top multiplicado con el TopCount (40x0 = 0) y un Left multiplicado por su LeftCount(40x0 = 0), luego cuando acabe este proceso(la creación de 1 botón) se le aumentará 1 + al LeftCount para que la proxima dirección de Left sea 40, luego 80, 120, etc...

- Se puede usar la misma logica para la creación de TOP osea hacia abajo....

Es medio complicado pero con un poco de imaginación de seguro que lo logras, te toca convertir lo que dije en lenguaje DELPHI


Espero estar en lo correcto.jajajja

saludos.!

LiAnTe-
06-01-2010, 14:31:00
Hola, supongo que lo puedes hacer utilizando la logica:

Creamos 3 variables:
- ParentVarMin, ParentVarMax: TPanel
- TopCount, LeftCount : Integer

ParentVarMin quiere decir el panel de partida, y el ParentVarMax quiere decir el panel final.

entonces configuramos ambas variables ya mensionadas, ahora suponiendo que
el panel tiene un Width de 400 igual que Height y los botones un Width de 40 igual que Height, veriamos por logica que en un panel de esas dimensiones caberían en un total de 100 Botones por Width y Height ¿me entiendo?.

Boton 40x40
Panel 400x400

TopCount, LeftCount = 0

Se puede hacer un for entre la división del Panel con el boton (Width) (400/40 = 10) multiplicado por la división entre el Panel con el Boton (Height)(400/40 = 10) en total da un resultado de (10 * 10 = 100)

y dentro del for lo siguiente:

- un if que dice si ParentVarMin = ParentVarMax entonces Pare STOP pero si no es lo siguiente:

- Creamos otro for entre la división del Panel con el boton (Width) (400/40 = 10) y dentro de este:

- Creamos un botón con un Top multiplicado con el TopCount (40x0 = 0) y un Left multiplicado por su LeftCount(40x0 = 0), luego cuando acabe este proceso(la creación de 1 botón) se le aumentará 1 + al LeftCount para que la proxima dirección de Left sea 40, luego 80, 120, etc...

- Se puede usar la misma logica para la creación de TOP osea hacia abajo....

Es medio complicado pero con un poco de imaginación de seguro que lo logras, te toca convertir lo que dije en lenguaje DELPHI


Espero estar en lo correcto.jajajja

saludos.!

Todo lo que me comentas lo veo correcto el tema es como lo hago en lenguaje delphi soy algo novato la verdad.

Por cierto el panel no tiene un tamaña fijo ya que aumentan o disminuye segun el tamaño de la pantalla asi que no sabria nunca que tamaño tiene lo tendria que averiguar...

muchas gracias por la explicacion si me pudieras dar un cable con el codigo que es precisamenten mi fallo me harias un favor muy grande.

Gracias de antemano.

Saludos.

cmm07
06-01-2010, 15:00:10
Hola, por lo del código veré que puedo hacer porque es un poquito complejo jejeej, por las dimensiones no te preocupes, recuerda que no vamos a poner valores exactos, si no vamos a poner los valores del panel por ejemplo (Panel1.Width o Panel1.Height) entonces será "AutoAjustable" según el tipo de resolución que sea..

Saludos!

cmm07
06-01-2010, 15:21:40
Hola , pues no era tan complicado como pensaba, te dejo un avance para que ya veas algunos resultados:


var
HeightBut, WidthBut: Integer;
ParentVarCount, ParentVarMax: TPanel;
ID, I, TopCount, LeftCount : Integer;
Boton: TButton;
begin
HeightBut := 20;
WidthBut := 20;
ParentVarCount:= Panel1;
ParentVarMax:= Panel1;
TopCount:= 0;
LeftCount := 0;

for I := 0 to (Round(ParentVarCount.Height / HeightBut)) - 1 do begin
for ID := 0 to (Round(ParentVarCount.Width / WidthBut)) - 1 do begin
Boton := TButton.Create(ParentVarCount);
Boton.Left := LeftCount*WidthBut + ParentVarCount.Left;
Boton.Top := TopCount*HeightBut + ParentVarCount.Top;
Boton.Height := HeightBut;
Boton.Width := WidthBut;
Boton.Parent:= ParentVarCount.Parent;
Boton.Show;
LeftCount:= LeftCount +1;
end;
LeftCount := 0;
TopCount:= TopCount +1;
end;


CRea un panel con dimensiones 200x200

PD: pueden haber otros metodos que ocupe menos recursos....

Ahora solo falta agregar la función de que pase de un panel a otro......pero eso creo que lo haré después, si encuentras algo más no dudes en postearlo...

Utilice la opción ROund(redondeo) asi que la agregación de botones nunca va a ser perfecto a menos que la división entre el Height y Width del boton con el H o W del panel sea un numero entero, como en el ejemplo. 40x40 y 400x400 Número entero 10

54Lu2

LiAnTe-
06-01-2010, 21:37:40
Bien ahora lo voy a probar y te comento, no obstante muchas gracias adelantadas.

un saludo.

LiAnTe-
07-01-2010, 03:48:45
Hola Compañero,

con tu ayuda pude solventar el problema que tenia ya que me guie con tu codigo para poder completar el mio y solventar el tema, la verdad es que fue un gran aporte.

te pego mi codigo para que veas lo que hize, aparte me a servido para poder crear variables configurables y demas.....

HeightBut := 69;
WidthBut := 120;
ParentVarCount := vPestanyaProductos;
ParentVarMax := vPestanyaProductos;
vContadorFilas := 0;
vContadorColunmas := 0;
vNumeroFilas := 6;
vNumeroColunmas := 8;

While vContadorFilas <> vNumeroFilas do // Filas
begin
if BDades.TArticulos.Eof = False Then
begin
While vContadorColunmas <> vNumeroColunmas do // Colunmas.
begin
if BDades.TArticulos.Eof = False Then
Begin
vProductoNombre := BDades.TArticulos.FieldByName('DESCRIPCION').AsString;
vProductoCodigo := BDades.TArticulos.FieldByName('CODIGO').AsInteger;

vBotonProductos := TButton.create(self);
vBotonProductos.Parent := vPestanyaProductos;
vBotonProductos.Caption := vProductoNombre;
vBotonProductos.Height := HeightBut;
vBotonProductos.Width := WidthBut;
vBotonProductos.Left := vContadorColunmas*WidthBut + ParentVarCount.Left;
vBotonProductos.Top := vContadorFilas*HeightBut + ParentVarCount.Top;
vBotonProductos.Enabled := True;
vBotonProductos.visible := True;
vBotonProductos.Tag := vProductoCodigo;
vBotonProductos.OnClick := vPersonalBotonOnClick;
vBotonProductos.Show;

BDades.TArticulos.Next;
vContadorColunmas := vContadorColunmas +1;
end
else
vContadorColunmas := vNumeroColunmas;
end;
vContadorColunmas := 0;
vContadorFilas := vContadorFilas + 1;
end
else
vContadorFilas := vNumeroFilas;
end;


Pero ahora solo me queda un pequeño problema y es el siguiente....

Como veras estoy tirando de una tabla la cual llenando la pantalla con la configuracion que tengo no se termina y me hace falta que al darle a siguiente registro me siga cargando el tema y si vuelvo a la pagina anterior me cargue de nuevo las anteriores...

eso como lo podria hacer????

mi intencion es que en el panel donde he dibujado 8 columnas por 6 filas me rellene esos botones con los productos pero claro cuando lo productos son mas que los botones me hace falta una manera para que se puedan ver en otra pagina....

Aparte si dibujo en otra pagina para hacer borrado del panel y volverlo a dibujar sin que me queden debajo los ya dibujados como lo hago?

Muchas gracias adelantadas.

Un Saludo.

LiAnTe-
08-01-2010, 02:01:24
nadie me puede ayudar con mis ultimas consultas?

gracias!

cmm07
08-01-2010, 02:21:00
Amigo, ayudar no significa obligar a alguien, si nadie te contesta es porqué quizá no sepan hacerlo o no lo entienden, personalmente quizá te pueda dar una solución (no es muy probable) ya que ahorita estoy muuy cansado, pero mañana quizá analize tu problema con calma...

54Lu2

LiAnTe-
08-01-2010, 10:00:53
Amigo, ayudar no significa obligar a alguien, si nadie te contesta es porqué quizá no sepan hacerlo o no lo entienden, personalmente quizá te pueda dar una solución (no es muy probable) ya que ahorita estoy muuy cansado, pero mañana quizá analize tu problema con calma...

54Lu2

muchas gracias te lo agradeceria mucho.

cmm07
08-01-2010, 21:26:56
Hola, lo que quieres hacer es un poco complejo, y la verdad es que no se me ocurre por ahora como hacerlo...........


losiento.......

54Lu2

LiAnTe-
27-04-2010, 19:12:49
Hola, lo que quieres hacer es un poco complejo, y la verdad es que no se me ocurre por ahora como hacerlo...........


losiento.......

54Lu2

se que es complicado llebo tiempo dandole vueltas sin exito!

es que soy algo novato.

Saludos.