PDA

Ver la Versión Completa : ScrollBox no muestra la scrollBar vertical


jars
08-10-2014, 16:56:12
Hola amigos.
Estoy luchando con una aplicacion que en un ScrollBox voy agregando TFrames a medida que van llegando, pero cuando se supera el tamaño del scrollbox no me aprece la scrollBar y la unica forma es estirar el form pero tambien tiene un limite.
Aclaro que la propiedad VertScrollBar. Visible esta en True.
Este es el c{odigo que utilizo para mostrar cada frame.


with TFrame1.Create(Self) do
begin
name := '';
Parent := ScrollBox1;
edt1.Lines.Clear;
edt1.Lines.Add(msg);
top := nexttop;
anchors := [akLeft, akRight];
nexttop := Top + Height + 10;
end;

Por otro lado hay alguna forma que a medida que agrego frames, se vayan haciendo el scroll en forma automatica, autoscroll esta en True pero no lo hace.
Alguien me puede dar una mano?
Gracias.

ecfisa
08-10-2014, 17:55:43
Hola jars.

El problema lo produce la propiedad Anchors, si comentas la línea,
//anchors := [akLeft, akRight];
verás que el comportamiento vuelve a la normalidad.

Ya existen reportes de problemas relacionados con las ScrollBars y la propiedad Anchors: ScrollBox & Anchors Bug, reproducable in Delphi 2009,2010,XE (http://qc.embarcadero.com/wc/qcmain.aspx?d=98555) y que al parecer aún no han resuelto.

La solución es posicionar manualmente los frames mediante las propiedades Left y Top.

Saludos :)

jars
08-10-2014, 18:04:37
Gracias Ecfisa.
Tenes razón, estuve buscando pero se ve que mal.
De todos modos como puedo solucionar el anchors, porque cuando re dimensionan a lo ancho es que tengo el problema.
Gracias

jars
08-10-2014, 19:39:56
Ahora me encuentro con otro problema.
A medida que se agregan mensajes se va actualizando el ancho del botón del scrollbar pero llega hasta 5 mensajes, los demás no los registra pero si estiro el form los veo.
Me esta volviendo loco.... alguna idea.
Ademas hay alguna forma de que se vaya posicionando solo en el ultimo mensaje recibido?

Gracias

ecfisa
08-10-2014, 20:01:22
Hola jars.

En realidad no tengo en claro de que se trata la cosa, pero te hice este ejemplo muy sencillo que redimensiona los TFrames al ancho del TScrollBox, tanto al crearlos como al estirar o contraer el Form.


...
implementation

var
vf: array of TFrame;

procedure TForm1.FormCreate(Sender: TObject);
const
COLS: array[0..5] of TColor=(clRed,clYellow,clGreen,clBlack,clBlue,clAqua);
var
i: Integer;
begin
for i:= 0 to 5 do
begin
SetLength(vf, Length(vf)+1);
vf[i]:= TFrame.Create(ScrollBox1);
with vf[i] do
begin
Color := COLS[i];
Width := ScrollBox1.Width - GetSystemMetrics(SM_CXVSCROLL) * 2;
Height:= 60;
Left := 10;
Top := 10 + i * 100;
Parent:= ScrollBox1;
end;
end;
end;

procedure TForm1.ScrollBox1Resize(Sender: TObject);
var
i: Integer;
F: TFrame;
begin
for i:= Low(vf) to High(vf) do
begin
vf[i].Width:= ScrollBox1.Width-GetSystemMetrics(SM_CXVSCROLL)*2;
vf[i].Left := 10;
end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var
i: Integer;
begin
for i:= Low(vf) to High(vf) do vf[i].Free;
Finalize(vf);
end;


Saludos :)

jars
08-10-2014, 20:41:34
Gracias Ecfisa me fuiste de gran ayuda.
Lo voy a probar.
Respecto a mi ultima pregunta tenes alguna idea de como hacer que se vaya posicionando en el ultimo frame que recibe?
Gracias

ecfisa
08-10-2014, 21:39:08
Hola jars.

Modifiqué el ejemplo anterior para ver si de ese modo se asemeja lo que estás buscando:

...
implementation

type
TCtrlRec = record
Frame: TFrame;
Edit : TEdit;
end;

var
vf: array of TCtrlRec;
cont: Integer = 0;

procedure TForm1.btnNewFrameClick(Sender: TObject);
const
COLS: array[0..5] of TColor=(clRed,clYellow,clGreen,clBlack,clBlue,clAqua);
begin
if cont < 6 then
begin
SetLength(vf, Length(vf)+1);
with vf[cont] do
begin
Frame := TFrame.Create(nil);
Frame.Name := Format('Frame%d',[cont+1]);
Frame.Color := COLS[cont];
Frame.Height:= 60;
Frame.Left := 10;
if cont = 0 then
Frame.Top := 10
else
Frame.Top := vf[cont-1].Frame.Top+vf[cont-1].Frame.Height + 10 ;
Frame.Parent:= ScrollBox1;

Edit := TEdit.Create(vf[Cont].Frame);
Edit.Name := Format('Edit%d',[cont+1]);
Edit.Left := 10;
Edit.Top := 10;
Edit.Text := vf[cont].Frame.Name;
Edit.Parent:= vf[cont].Frame;
Edit.SetFocus; // <<=== Aqui se le dá foco al último control creado (Edit)
end;
end;
Inc(cont);
end;

procedure TForm1.ScrollBox1Resize(Sender: TObject);
var
i: Integer;
begin
procedure TForm1.ScrollBox1Resize(Sender: TObject);
var
i: Integer;
begin
for i:= Low(vf) to High(vf) do
begin
vf[i].Frame.Width:= ScrollBox1.Width - 2*GetSystemMetrics(SM_CXVSCROLL) *
Integer(ScrollBox1.VertScrollBar.Visible);
vf[i].Frame.Left := (ScrollBox1.ClientWidth - vf[i].Frame.Width) shr 1;
end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var
i: Integer;
begin
for i:= Low(vf) to High(vf) do vf[i].Frame.Free;
Finalize(vf);
end;


Salida:

http://sia1.subirimagenes.net/img/2014/10/08/141008093038822658.jpg

Como se vé en la imágen, el foco está siempre en el último edit creado.

Para redimensionar horizontalmente el ScrollBox agregué un Splitter (que no se vé en la imágen)

Saludos :)

jars
09-10-2014, 19:37:48
Gracias Ecfisa ya lo estoy probando.
Abrazo