Este artículo presenta el método para implementar el cambio de desplazamiento de imágenes en Delphi con un ejemplo. Este programa puede realizar la transmisión de desplazamiento de imágenes y, a través de este código, se puede controlar que la imagen en la ventana se desplace hacia arriba. Al ajustar el valor de la barra de desplazamiento de velocidad, también se puede ajustar la velocidad de desplazamiento; y la imagen dejará de desplazarse.
El código de función completo es el siguiente:
unidad Unidad1; interfaz utiliza Windows, clases, gráficos, formularios, controles, menús, cuadros de diálogo, StdCtrls, ExtCtrls, SysUtils, ComCtrls, botones; tipoTForm1 = clase(TForm)MainMenu1: TMainMenu;Archivo1: TMenuItem;Open1: TMenuItem;N1: TMenuItem;Salir1 : TMenuItem;Ayuda1: TMenuItem;AboutImageViewer1: TMenuItem;OpenDialog1: TOpenDialog;Options1: TMenuItem;ColorDepth1: TMenuItem;ScrollPanel1: TMenuItem;Panel1: TPanel;TrackBar1: TTrackBar;BitBtn2: TBitBtn;BitBtn1: TBitBtn;Label1: TLabel;Imagen1: TImage;N2: TMenuItem;procedimiento Open1Click(Remitente: TObject);procedimiento Exit1Click(Remitente: TObject);procedimiento AboutImageViewer1Click(Remitente: TObject);procedimiento ColorDepth1Click(Remitente: TObject);procedimiento ScrollPanel1Click(Remitente : TObject); procedimiento TrackBar1Change (Remitente: TObject); procedimiento BitBtn1Click (Remitente: TObject); procedimiento BitBtn2Click (Remitente: TObject); procedimiento FormCreate (Remitente: TObject); fCancelar: booleano;implementación{$R *.DFM}procedimiento TForm1.Open1Click(Sender: TObject);beginif OpenDialog1.Execute luegobeginImage1.Picture.LoadFromFile (OpenDialog1.FileName);//Importar archivo de imagen Caption := 'Controlar el movimiento dinámico de la imagen - ' + OpenDialog1. FileName;/ /Cambiar el título del formularioend;end;procedimiento TForm1.Exit1Click(Sender: TObject);beginClose; //Salir del formulario;procedimiento TForm1.AboutImageViewer1Click(Sender: TObject);//Acerca de beginMessageDlg ('Controlar el movimiento dinámico de imágenes para'+ #13'Delphi Graphics Studio', mtInFormation,[mbOk], 0);fin;procedimiento TForm1.ColorDepth1Click(Sender: TObject);varstrDepth: String;begincase Image1.Picture.Bitmap.PixelFormat of //Obtener la profundidad de color de la imagen pfDevice: strDepth := 'Sin imagen';pf1bit: strDepth := '1-bit'; pf4bit: strDepth:= '4 bits';pf8bit: strDepth:= '8 bits';pf15bit: strDepth := '15 bits';pf16bit: strDepth := '16 bits';pf24bit: strDepth := '24 bits';pf32bit: strDepth := '32 bits'; pfCustom: strDepth := 'Personalizado';end;MessageDlg ('Profundidad de color de la imagen:' + strDepth,mtInFormation, [mbOK], 0);//Da información sobre la profundidad del color de la imagenend;procedure TForm1.ScrollPanel1Click(Sender: TObject);beginPanel1.Visible := not Panel1.Visible;ScrollPanel1.Checked := Panel1.Visible / /Cambiar la visibilidad del panel de controlfin;procedimiento TForm1.TrackBar1Change(Remitente: TObject);beginnLines := TrackBar1.Position;TrackBar1.Hint := IntToStr (TrackBar1.Position);//Da una pista del speedend actual;procedimiento TForm1.BitBtn1Click(Sender: TObject);varW, H, I, J, LineBytes: Integer;Line: PByteArray; //Definir variable de tipo de puntero Bmp: Tbitmap;R: TRect;beginif Image1.Picture.Bitmap.PixelFormat=pfDevice then //Cuando la imagen no está abierta beginMessageDlg ('¡La imagen no está abierta! ', mtInFormation, [mbOk], 0); //Dar un mensaje de error exit; //Salir endelsefCancel := False;BitBtn1.Enabled := False //Cambiar las propiedades de los dos botones BitBtn2.Enabled := True; Bmp := Image1.Picture.Bitmap; //Obtener la imagen BMP y definir el tamaño de la imagen W := Bmp.Width;H := Bmp.Height;LineBytes := Abs (Integer (Bmp.ScanLine [1]) -Integer (Bmp.ScanLine [0]));Line := AllocMem (LineBytes);para I := 0 a H - 1 dobeginif fCancel luego //Verifique la bandera de interrupción antes de cada bucle (es decir, determine si el botón de detener está presionado) Break //Haga clic en el botón "Detener" para dejar de desplazarse por la imagen Move; ((Bmp.ScanLine [0]), Line, LineBytes); //Copia la primera línea de la imagen para J := 1 a H - 1 dobeginMove ((Bmp.ScanLine [J]), (Bmp.ScanLine [J] - 1]), LineBytes); si (J mod nLines = 0) entonces comienzaR := Rect (0, Panel1.Height + J-nLines,W, Panel1.Height + J);InvalidateRect (Handle, @R, False);UpdateWindow (Handle);end;end;Mover (Línea, (Bmp.ScanLine [Bmp.Height - 1]), LineBytes);R := Rect (0, Panel1.Alto + H - nLines,W, Panel1.Alto + H);InvalidateRect (Handle, @R, False);UpdateWindow (Handle);Application.ProcessMessages; //Permitir que el bucle se detenga inmediatamente para poner el programa en el estado inicialend;BitBtn1.Enabled := True //Activar el botón "Inicio" BitBtn2.Enabled := False; El "botón" de parada no es válido; procedimiento TForm1.BitBtn2Click(Sender: TObject);beginfCancel := True //Cambiar indicador Fcancel; valor, detener el desplazamiento de la imagenend;procedimiento TForm1.FormCreate(Sender: TObject);beginTrackBar1Change (self); //Llamar a la función TrackBar1Changeend;end.