Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 21-07-2010
Kandorf Kandorf is offline
Miembro
 
Registrado: may 2007
Posts: 38
Poder: 0
Kandorf Va por buen camino
Simular evento OnScroll para ScrollBox

Antes de nada plantearé mi problema.
Estoy creando un programa en el que tengo que crear muchos objetos y los muestro en un ScrollBox, el problema está en que cuando creo demasiados me da un error de Violación de acceso de memoria, así que lo que se me ha ocurrido es crear sólo los objetos que deverían verse en el ScrollBox en ese momento, para ello he pensado que sería necesario utilizar el evento OnResize, del que dispone el objeto ScrollBox, y el evento OnScroll, que no lo tiene, este es el más importante, ya que habrá que mostrar los nuevos objetos y borrar los que no se tengan que ver al mover la posición del scrollbox.
Explico el problema y el programa más detalladamente en el siguiente post: http://www.clubdelphi.com/foros/showthread.php?p=370790

He encontrado un post (http://www.mandacojones.com/foros/sh...ad.php?t=34990) en el se explican cómo hacer algo así, pero yo creo un procedimiento llamado:
Código Delphi [-]procedure TFrmPrincipal.ScbMapaWndProc(var Msg: TMessage);

Pero no me captura en evento, y si intento poner un breakpoint en el código lo marca como si fuera un comentario

Un saludo y gracias por vuestro tiempo.
Responder Con Cita
  #2  
Antiguo 21-07-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Kandorf.

Revisá esto: http://wall.riscom.net/books/delphi/del_faqs/779.html

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 21-07-2010
Kandorf Kandorf is offline
Miembro
 
Registrado: may 2007
Posts: 38
Poder: 0
Kandorf Va por buen camino
Hola, muchas gracias por la respuesta, por la descripción parece ser que solucionaría mi problema, el caso es que no sé dónde meter ese código, ¿Hay que redefinir la clase ScrollBox?
He probado a copiarlo después de los uses y también después de la definición del tipo del formulario y en ambos sitios me da errores, ¿Dónde tendría que copiarlo?

Saludos.
Responder Con Cita
  #4  
Antiguo 21-07-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Kandorf.

Lo hubiqué así y no da error:
Código Delphi [-]
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
type
{$IFDEF WIN32}
  WParameter = LongInt;
{$ELSE}
  WParameter = Word;
{$ENDIF}
  LParameter = LongInt;
  TForm1 = class(TForm)
    ScrollBox1: TScrollBox;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
 OldWindowProc : Pointer;
implementation
{$R *.dfm}
function NewWindowProc(WindowHandle : hWnd;
                        TheMessage   : WParameter;
                        ParamW       : WParameter;
                        ParamL       : LParameter) : LongInt
                        {$IFDEF WIN32} stdcall;
                        {$ELSE} ; export; {$ENDIF}
var
  TheRangeMin : integer;
  TheRangeMax : integer;
  TheRange : integer;
begin
  if TheMessage = WM_VSCROLL then
  begin
    {Get the min and max range of the horizontal scroll box}
    GetScrollRange(WindowHandle,
                   SB_HORZ,
                   TheRangeMin,
                   TheRangeMax);
    {Get the vertical scroll box position}
    TheRange := GetScrollPos(WindowHandle,
                             SB_VERT);
    {Make sure we wont exceed the range}
    if TheRange < TheRangeMin then
      TheRange := TheRangeMin else
    if TheRange > TheRangeMax then
      TheRange := TheRangeMax;
    {Set the horizontal scroll bar}
    SetScrollPos(WindowHandle,
                 SB_HORZ,
                 TheRange,
                 true);
  end;
  if TheMessage = WM_HSCROLL then begin
  {Get the min and max range of the horizontal scroll box}
    GetScrollRange(WindowHandle,
                   SB_VERT,
                   TheRangeMin,
                   TheRangeMax);
  {Get the horizontal scroll box position}
    TheRange := GetScrollPos(WindowHandle,
                             SB_HORZ);
  {Make sure we wont exceed the range}
    if TheRange < TheRangeMin then
      TheRange := TheRangeMin else
    if TheRange > TheRangeMax then
      TheRange := TheRangeMax;
  {Set the vertical scroll bar}
    SetScrollPos(WindowHandle,
                 SB_VERT,
                 TheRange,
                 true);
  end;
  { Call the old Window procedure to }
  { allow processing of the message. }
  NewWindowProc := CallWindowProc(OldWindowProc,
                                  WindowHandle,
                                  TheMessage,
                                  ParamW,
                                  ParamL);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
{ Set the new window procedure for the control }
{ and remember the old window procedure.       }
  OldWindowProc := Pointer(SetWindowLong(ScrollBox1.Handle,
                                         GWL_WNDPROC,
                                         LongInt(@NewWindowProc)));
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
{ Set the window procedure back }
{ to the old window procedure.  }
  SetWindowLong(ScrollBox1.Handle,
                GWL_WNDPROC,
                LongInt(OldWindowProc));
end;
end.

Nota: Para probarlo agregué un TScrollBox con varios botones.

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Simular evento de ratón beerman C++ Builder 1 30-12-2007 15:09:22
Evento VertScrollBar entre un DBGrid y un ScrollBox ludan508 OOP 0 05-06-2007 22:12:10
Componente para simular señal periodica andiget Varios 2 28-03-2007 10:44:37
Evento de DBGrid para insertar. marial Conexión con bases de datos 1 04-07-2004 21:56:22
Mejor evento para B.D. emeritos Conexión con bases de datos 1 08-06-2004 14:26:49


La franja horaria es GMT +2. Ahora son las 16:13:11.


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
Copyright 1996-2007 Club Delphi