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

Messages postés
20
Date d'inscription
jeudi 30 novembre 2000
Statut
Membre
Dernière intervention
21 mars 2010
- - Dernière réponse : f0xi
Messages postés
4278
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
- 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

Meilleure réponse
Messages postés
20
Date d'inscription
jeudi 30 novembre 2000
Statut
Membre
Dernière intervention
21 mars 2010
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 :)

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 125 internautes nous ont dit merci ce mois-ci

Commenter la réponse de lp0683
Messages postés
4278
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
2 janvier 2019
26
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