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

lp0683 20 Messages postés jeudi 30 novembre 2000Date d'inscription 21 mars 2010 Dernière intervention - 18 avril 2009 à 16:55 - Dernière réponse : f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention
- 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 

2 réponses

Répondre au sujet
lp0683 20 Messages postés jeudi 30 novembre 2000Date d'inscription 21 mars 2010 Dernière intervention - 18 avril 2009 à 18:02
+3
Utile
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 :)
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de lp0683
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 18 avril 2009 à 18:22
0
Utile
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.