IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

Faire défiler une image dans un ScrollBox


Sujet :

Delphi

  1. #1
    Membre régulier
    Inscrit en
    Mai 2003
    Messages
    146
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 146
    Points : 116
    Points
    116
    Par défaut Faire défiler une image dans un ScrollBox
    Afin de pouvoir voir l'ensemble d'un TImage (Plus grand que l'écran), je l'ai mis dans un TScrollBox. Je dois sélectionner une partie de cette image (Rectangle de sélection). Jusqu'ici, pas de problème. Où cela se gâte, c'est lorsque la sélection que je veux faire est plus grande que le ScrollBox. Je ne peux pas laisser ma sélection pour activer les scrollbars afin de voir le reste de l'image.

    2 solutions à mon avis:
    La plus simple d'exécution: les ScrollBars s'activent lorsque le curseur arrive aux limites du ScrollBox (gauche, droite, bas, haut).

    La seconde: Un moyen d'arrêter la création du rectangle, activer les ScrollBars et ensuite reprendre le rectangle de sélection sans perte de ce qui a déjà été sélectionner.

    Dans les 2 cas, je sèche, je ne sais même pas si c'est possible. J'ai trouvé quelques codes qui me permettent de déplacer l'image avec la souris mais je perd ma sélection. De l'aide serait apprécié

    Merci

    Duan

  2. #2
    Membre éclairé Avatar de DOLPat®
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2003
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 426
    Points : 790
    Points
    790
    Par défaut
    Bonjour

    Voici une ébauche de ce que tu pourrais faire:
    Fichiers attachés Fichiers attachés
    À +
    Pat.


    Si vous avez trouvé chaussure à votre pied... euh solution à votre problème, n'oubliez pas de clôturer le sujet en le marquant comme:
    ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
    Windows 8.1, Lazarus 1.8.2 SVN 57369 FPC 3.0.4 x86_64-win64-win32/win64

  3. #3
    Membre régulier
    Inscrit en
    Mai 2003
    Messages
    146
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 146
    Points : 116
    Points
    116
    Par défaut
    Je ne peux utiliser les fichiers inclus dans le Zip. J'utilise Delphi 7 édition personnelle. Celui-ci "gèle" en loadant le DPR

  4. #4
    Membre éclairé Avatar de DOLPat®
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2003
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 426
    Points : 790
    Points
    790
    Par défaut
    Bizarre, il n'y a rien de particulier dans cette application créée avec Delphi 2005...
    Bon, alors, il ne te reste plus qu'à créer toi même la fiche:

    Crée un nouveau projet.
    Dans les propriétés de la feuille, modifie la propriété Name en fPrincipale.

    Défini le type suivant dans la section interface:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      TSensDeplacement = Set of (sdHaut, sdDroite, sdBas, sdGauche);
    Défini les variables globales:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    var
      BoutonGPresse:    Boolean;
      BoutonDPresse:    Boolean;
      posDepart:        TPoint;
      BaseImage:        TPoint;
      SensDeplacement:  TSensDeplacement;
    Dans l'événement OnCreate, mets le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TfPrincipale.FormCreate(Sender: TObject);
    begin
      AutoScroll:=False;
      Caption:='Sélection dans TImage (clic-droit pour sélectionner, clic -gauche pour déplacer l''image)';
      imgTest.AutoSize:=True;
      imgTest.Left:=0;
      imgTest.Top:=0;
      shpSelection.BringToFront;
      odOuvrir.Filter:= 'Images [*.bmp, *.jpg]|*.bmp; *.jpg';
    end;
    Dans l'évenement OnShow:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TfPrincipale.FormShow(Sender: TObject);
    begin
      DoubleBuffered:=True;
      if odOuvrir.Execute=True then
        imgTest.Picture.LoadFromFile(odOuvrir.FileName)
      else
        Application.Terminate;
    end;
    Place sur la feuille un TImage nommé imgTest

    Dans l'événement OnMouseDown du TImage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    procedure TfPrincipale.imgTestMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      shpSelection.Width:=0;
      shpSelection.Height:=0;
      GetCursorPos(posDepart);
      case Button of
        mbLeft:
          begin
            BoutonGPresse:=True;
          end;
        mbRight:
          begin
            BoutonDPresse:=True;
            posDepart.X:=X;
            posDepart.Y:=Y;
            shpSelection.Left:=imgTest.Left+X;
            shpSelection.Top:=imgTest.Top+Y;
            posDepart.X:=shpSelection.Left;
            posDepart.Y:=shpSelection.Top;
          end;
      end;
    end;
    Dans l'événement OnMouseMove du TImage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    procedure TfPrincipale.imgTestMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    const
      Delta = 10;
    var
      posCourante:     TPoint;
    begin
      GetCursorPos(posCourante);
      if BoutonGPresse=True then with imgTest do
        begin
          Left:=BaseImage.X+(posCourante.X-posDepart.X);
          Top:=BaseImage.Y+(posCourante.Y-posDepart.Y);
        end;
      if BoutonDPresse=True then with shpSelection do
        begin
          Width:=BaseImage.X+(X-posDepart.X);
          height:=BaseImage.Y+(Y-posDepart.Y);
          SensDeplacement:=[];
          if BaseImage.X+X<Delta then
            SensDeplacement:=[sdGauche];
          if BaseImage.Y+Y<Delta then
            SensDeplacement:=SensDeplacement+[sdHaut];
          if BaseImage.X+X>fPrincipale.ClientWidth-Delta then
            SensDeplacement:=SensDeplacement+[sdDroite];
          if BaseImage.Y+Y>fPrincipale.ClientHeight-Delta then
            SensDeplacement:=SensDeplacement+[sdBas];
          tmrDeplace.Enabled:=SensDeplacement<>[];
        end;
    end;
    Dans l'événement OnMouseUp du TImage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TfPrincipale.imgTestMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      BoutonGPresse:=False;
      BoutonDPresse:=False;
      BaseImage.X:=imgTest.Left;
      BaseImage.Y:=imgTest.Top;
    end;
    Place un TShape sur la feuille et nomme-le shpSelection
    Dans le OnMouseMove du TShape:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TfPrincipale.shpSelectionMouseMove(Sender: TObject;
      Shift: TShiftState; X, Y: Integer);
    begin
      shpSelection.Width:=shpSelection.Left+(X-posDepart.X);
      shpSelection.height:=shpSelection.Top+(Y-posDepart.Y);
    end;
    Place un TTimer sur la feuille et nomme-le tmrDeplace
    Dans l'événement OnTimer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    procedure TfPrincipale.tmrDeplaceTimer(Sender: TObject);
    const
      Delta = 10;
    begin
      if (sdHaut in SensDeplacement) and (imgTest.Top<0) then
        begin
          Inc(BaseImage.Y, Delta);
          Inc(posDepart.Y, Delta);
          imgTest.Top:=imgTest.Top+Delta;
          shpSelection.Top:=shpSelection.Top+Delta;
          shpSelection.Width:=shpSelection.Width+Delta;
        end;
      if (sdDroite in SensDeplacement)
          and (imgTest.Left>(ClientWidth-imgTest.Width)) then
        begin
          Dec(BaseImage.X, Delta);
          Dec(posDepart.X, Delta);
          imgTest.Left:=imgTest.Left-Delta;
          shpSelection.Left:=shpSelection.Left-Delta;
          shpSelection.Width:=shpSelection.Width+Delta;
        end;
      if (sdBas in SensDeplacement)
          and (imgTest.Top>(ClientHeight-imgTest.Height)) then
        begin
          Dec(BaseImage.Y, Delta);
          Dec(posDepart.Y, Delta);
          imgTest.Top:=imgTest.Top-Delta;
          shpSelection.Top:=shpSelection.Top-Delta;
          shpSelection.Width:=shpSelection.Width-Delta;
        end;
      if (sdGauche in SensDeplacement) and (imgTest.Left<0) then
        begin
          Inc(BaseImage.X, Delta);
          Inc(posDepart.X, Delta);
          imgTest.Left:=imgTest.Left+Delta;
          shpSelection.Left:=shpSelection.Left+Delta;
          shpSelection.Width:=shpSelection.Width+Delta;
        end;
    end;
    Pour terminer, place un TOpenDialog sur la feuille en le nommant odOuvrir

    Enregistre l'unité sous uPrincipale et le projet sous un nom quelconque. Si je n'ai rien omis, tu devrais pouvoir l'exécuter...
    À +
    Pat.


    Si vous avez trouvé chaussure à votre pied... euh solution à votre problème, n'oubliez pas de clôturer le sujet en le marquant comme:
    ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
    Windows 8.1, Lazarus 1.8.2 SVN 57369 FPC 3.0.4 x86_64-win64-win32/win64

  5. #5
    Membre régulier
    Inscrit en
    Mai 2003
    Messages
    146
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 146
    Points : 116
    Points
    116
    Par défaut
    Je te remercie beaucoup, je dois pouvoir faire quelque chose avec cet example.

Discussions similaires

  1. Faire glisser une image dans un cadre avec la souris
    Par fab76000 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 08/11/2008, 12h38
  2. Faire apparaitre une image dans une fenetre.
    Par kilrou dans le forum GTK+ avec C & C++
    Réponses: 3
    Dernier message: 23/05/2008, 13h13
  3. Faire afficher une image dans un axe ?
    Par blanchonvincent dans le forum MATLAB
    Réponses: 2
    Dernier message: 29/04/2007, 12h11
  4. Comment faire défiler une image dans un DBImage
    Par kolac dans le forum Bases de données
    Réponses: 1
    Dernier message: 08/04/2006, 13h45
  5. Faire pivoter une image dans TImage
    Par Bourak dans le forum Langage
    Réponses: 4
    Dernier message: 17/03/2006, 08h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo