Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   ScrollBox1.HorzScrollBar.Visible := true howto (https://www.clubdelphi.com/foros/showthread.php?t=73301)

arrayman 13-04-2011 18:45:51

ScrollBox1.HorzScrollBar.Visible := true howto
 
Hola, no consigo que un TScrollBox muestre la barra horizontal.
ScrollBox1.HorzScrollBar.Visible := true;

la situacion el la siguiente:
un frame (visor_fra) contiene el scrollbox1
en tiempo de ejecucion se añaden obtetos del Tframe_item
el cual contiene dos paneles uno alineado a la izq con 2 labels que
representan hora desde hora hasta. y otro panel para el contenido align alclient.
en el panel contenido de cada frame_item se cargan objetos frame_entity que representan las reservas de unas pistas de padel de modo que consiguo
que visorfrm muestre el estado de las pistas. pero no consiguo que se muestre
la barra de scrooll horizontal del tscrollbox1 ¿? alguna idea o alternativa?

gracias

ecfisa 13-04-2011 20:28:21

Hola arrayman.

Código Delphi [-]
...
type
  TScrollBox = class(Forms.TScrollBox)
  private
    procedure WMNCCalcSize(var Message: TMessage); message WM_NCCALCSIZE;
  end;
  
  TForm1 = class(TForm)
    ScrollBox1:  TScrollBox;
  ...

implementation

procedure TScrollBox.WMNCCalcSize(var Message: TMessage);
var
  Style: Integer;
begin
  Style:= GetWindowLong(Handle, GWL_STYLE);
  SetWindowLong(Handle, GWL_STYLE, Style or WS_HSCROLL ); // agrega: or WS_VSCROLL); para ver ambas 
  inherited;
end;
...


Un saludo.

arrayman 14-04-2011 18:09:37

hola ecfisa
ante todo muchas gracias por tu respuesta, justo acabo de probarla, y si,el scrool horizontal aparece, pero no, no soluciona mi problema. perdona si mi delphi esta oxidado, primero pense que tenia que modificar en la unidad forms de la vcl. (ya dije lo de oxidado? ). en fin despues probe a poner el codigo en el form donde tengo el frame del visor pero no salta el evento, asi que me lo lleve al frame visor y alli si que funciona el problema es que la barra horizontal ocupa todo scrollbox con lo que no hace scrooll pongo una imagen para que te hagas una idea.

pongo tambien el codigo que he puesto, por si algo hice mal.
Código Delphi [-]
......
type
  TScrollBox = class(Forms.TScrollBox)
  private
    procedure WMNCCalcSize(var Message: TMessage); message WM_NCCALCSIZE;
  end;

  TVisorFra = class(TFrame)
    ScrollBox1: TScrollBox;
.......


{ TScrollBox }

procedure TScrollBox.WMNCCalcSize(var Message: TMessage);
var
  Style: Integer;
begin
  Style:= GetWindowLong(Handle, GWL_STYLE);
  SetWindowLong(Handle, GWL_STYLE, Style or WS_HSCROLL or WS_VSCROLL); // agrega: or WS_VSCROLL); para ver ambas
  inherited;
end;

supongo que me falta algo para indicar al scrollbox que el tamaño es diferente, y la barra se adapte .

un saludo y gracias otra vez

ecfisa 14-04-2011 19:17:24

Hola.

Realmente no entiendo ese comportamiento, de hecho he utilizado ese código sin ningún tipo de inconveniente.

No ví ningún parámetro de la función que lo maneje, pero podés revisar aqui: SetWindowLong Function, por si algo se me escapó.

Además el texto en: About Scroll Bars, denota lo irregular del comportamiento que mencionás.
Cita:

If most of the object is visible, the scroll box occupies most of the scroll bar shaft. Similarly, if only a small portion of the object is visible, the scroll box occupies a small part of the scroll bar shaft.
Quizá el problema lo esté generando el uso de frames...

Un saludo.

arrayman 14-04-2011 22:17:04

Bueno casi que me da verguenza decir esto. en fin el asunto es que al estar los componente internos con align alclient(o altop) nunca llegan a ser mas grandes que la superficie del scrollbox (upss)

al final quedo sin hacer uso el codigo ecfisa (muchisimas gracias)
y aunque es un poco ñapa hago esto.

Código Delphi [-]
procedure TVisorFra.ScrollBox1Resize(Sender: TObject);
var
  i:integer;
  oResItem:TResItemFra;
begin
  for i := 0 to ScrollBox1.ControlCount - 1 do
  begin
    if ScrollBox1.Controls[i] is TResItemFra  then
    begin
      oResItem := TResItemFra(ScrollBox1.Controls[i]);
      oResItem.Align := alNone;
      oResItem.Top := i*oResItem.Height;
      oResItem.Width := 1980;
      //oresItem.Width := ScrollBox1.Width+ 2;
    end;
  end;
end;


nuevamente gracias, he aprendido de ti.

ecfisa 14-04-2011 22:58:00

Hola arrayman.

No tenés por que disculparte. Me alegra mucho que hayas resuelto el problema y te agradezco que nos hayas presentado la solución.

Un saludo.:)


La franja horaria es GMT +2. Ahora son las 08:04:42.

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