Position d'une scrollbar dans une ScrollBox [Résolu]

Messages postés
20
Date d'inscription
jeudi 30 novembre 2000
Dernière intervention
21 mars 2010
- 18 avril 2009 à 16:55 - Dernière réponse :
Messages postés
4304
Date d'inscription
samedi 16 octobre 2004
Dernière intervention
9 mars 2018
- 18 avril 2009 à 18:22
Bonjour à tous :)

J'ai un petit soucis, malgrè que je me soit baladé dans les diverse surjet parlant de ca, j'ai toujours rien trouvé.

Je creer dynamiquement une ScrollBox contenant des TImages pour creer une map. Celle-ci fait 750 x 600.
Le soucis c'est que je veux creer une mape de 40 x 40 par exemple et sachant qu'un TImage fait 25x25 ca fait plus que la taille de la scrollBox ^^

Donc il apparait une scrollBar. C'est bien mignon tout ca, je pensait avoir finit depuis quelques temps mon editeur de map, mais en y revenant aujourd hui, je me rend compte d'un truc facheux, le maximum que je peu avoir en coordonné pour mon tableau de TImages (qui est visible dans ma ScrollBox) va jusqu'a 28 en largeur.
Je me suis penché sur le soucis, en faite, la scrollbar ne sert a rien puisque je calcule la position de la TImage voulue en fonction du bord

 j := round(((Sender As TImage).Left)/25);
 i := round(((Sender As TImage).Top)/25);


Et donc le defilement n'est pas prit en compte.

J'aurai aimé savoir comment faire la même chose mais en additionnant par exemple la position de ma scrollBar de ma scrollBox à la position de I et J. Comme ca je ne suis pas limité dans la taille de ma map :)

Cordialement Florian
Afficher la suite 

Votre réponse

2 réponses

Meilleure réponse
Messages postés
20
Date d'inscription
jeudi 30 novembre 2000
Dernière intervention
21 mars 2010
- 18 avril 2009 à 18:02
3
Merci
Ah, bah à force de testé plein de truc j'ai trouvé :

j := round((((Sender As TImage).Left+Scroll.HorzScrollBar.ScrollPos)/25));
i := round(((Sender As TImage).Top+Scroll.VertScrollBar.ScrollPos)/25);

Voila :)

Merci lp0683 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 87 internautes ce mois-ci

Commenter la réponse de lp0683
Messages postés
4304
Date d'inscription
samedi 16 octobre 2004
Dernière intervention
9 mars 2018
- 18 avril 2009 à 18:22
0
Merci
tu pourrais simplement ne pas couper l'image ni la positionner dans une scrollbox ...

voici un exemple :

unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtDlgs, XPMan, Menus, ExtCtrls, jpeg;

type
  TForm2 = class(TForm)
    PaintBox1: TPaintBox;
    MainMenu1: TMainMenu;
    Files1: TMenuItem;
    Open1: TMenuItem;
    XPManifest1: TXPManifest;
    OpenPictureDialog1: TOpenPictureDialog;
    procedure Open1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure PaintBox1Paint(Sender: TObject);
    procedure PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

var
  BMP : TBitmap;               // Image en cache  BMPOk : boolean false;     // false pas d'image chargée pour l'instant
  BMPPt : TPoint = (X:0; Y:0); // Coordonnées du coin supérieur gauche de BMP dans la paintbox
  ClikPt: TPoint = (X:0; Y:0); // Coordonnées du click souris en vus du déplacement de BMP

procedure TForm2.FormCreate(Sender: TObject);
begin
  DoubleBuffered := true;  // Évite le scintillement quand refresh
  BMP := TBitmap.Create;   // Création du cache pour l'image
end;

procedure TForm2.FormDestroy(Sender: TObject);
begin
  BMP.Free;                // Libération du cache de l'image
end;

procedure TForm2.Open1Click(Sender: TObject);
var PIC : TPicture; // Permet de charger une image BMP, JPG ou PNG
begin
  if OpenPictureDialog1.Execute then
  begin
    PIC := TPicture.Create;             // Création
    try
      PIC.LoadFromFile(OpenPictureDialog1.FileName); // Chargement de l'image
      BMP.Width := PIC.Width;           // Longueur
      BMP.Height := PIC.Height;         // Hauteur
      BMP.PixelFormat := pf32bit;       // Profondeur des couleurs
      BMP.Canvas.Draw(0,0,PIC.Graphic); // Transfert
      BMPOk := true;                    // L'image est chargée
      PaintBox1.Repaint;                // Rafraichissement
    finally
      PIC.Free;                         // Libération
    end;
  end;
end;

procedure TForm2.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  // Quand on clique sur la PaintBox
  ClikPt.X := X - BMPPt.X; // Récupération et calcul en X du clic
  ClikPt.Y := Y - BMPPt.Y; // Récupération et calcul en Y du clic
end;

procedure TForm2.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if ssLeft in Shift then    // Si le bouton gauche est enfoncé
  begin
    BMPPt.X := X - ClikPt.X; // Calcul de la coordonnée en X de BMP dans la paintbox
    BMPPt.Y := Y - ClikPt.Y; // Calcul de la coordonnée en Y de BMP dans la paintbox
    PaintBox1.Repaint;       // on redessine
  end;
end;

procedure TForm2.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  ClikPt.X := 0;  // RAZ
  ClikPt.Y := 0;  // RAZ
end;

procedure TForm2.PaintBox1Paint(Sender: TObject);
begin
  if BMPOk then  // Si une image est chargée
    (Sender as TPaintBox).Canvas.Draw(BMPPt.X, BMPPt.Y, BMP); // on dessine
end;

end.

pour le reste, c'est du calcul primaire du même acabit, simple...


<hr size="2" width="100%" />
Commenter la réponse de f0xi

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.