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 :

Probleme de resize


Sujet :

Delphi

  1. #1
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut Probleme de resize
    Bonjour,

    J'ai un soucis au niveau de l'étirement d'un control issu d'un autre...
    Je m'explique.

    1) j'ai créé lors d'un clique sur un PANEL, 7 petites poignées

    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
    procedure TFDossierTiers.ControlMouseDown(Sender: TObject;Button: TMouseButton;Shift: TShiftState;X, Y: Integer);
    Var
    //...
      Poignes: Integer;
      MyShape : TMyShape;
    begin
        for Poignes := 0 to 7 do
        begin
          MyShape := TMyShape.Create(self);
          MyListShape.Add(MyShape);
          With MyShape do
          begin
            Parent := sPanelParent;
            Tag := Poignes; // On mémorise chaque indice de poigné
            Case Poignes of
    //...          
              3: // Poigné situé à droite au milieu
              begin
                Cursor := crSizeWE;
                Left := TMysPanel(Sender).Left + TMysPanel(Sender).Width;
                Top  := TMysPanel(Sender).Top + (TMysPanel(Sender).Height div 2) - 2;
              end;
    //...
              7: // Poigné situé à gauche au milieu
              begin
                Cursor := crSizeWE;
                Left := TMysPanel(Sender).Left - 4;
                Top  := TMysPanel(Sender).Top + (TMysPanel(Sender).Height div 2) - 2;
              end;
            end;
            FocusControl := TMysPanel(Sender); // Mémorise à qui sont rattaché ces poignés
            OnMouseDown := PoigneMouseDown;
            OnMouseMove := PoigneMouseMove;
            OnMouseUp   := PoigneMouseUp;
          end;
        end;
    2) Le TMyShape est spécifique après de longue recherche j'ai opté pour un compo perso :
    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
    Type
      TMyShape = Class(TShape)
      private
        FFocusControl: TWinControl;
      protected
        property FocusControl: TWinControl read FFocusControl write FFocusControl;
      public
        constructor Create(AOwner: TComponent); override;
     End;
     
    Constructor TMyShape.Create(AOwner: TComponent);
    begin
      inherited;
      Brush.Style := bsClear;
      Brush.Color := clBlack;
      Width  := 4;
      Height := 4;
    end;
    3) donc une fois qu'on clique sur le composant, les poignéés apparaissent. Ensuite, j'utilise ces 3 procédures pour à la fois déplacer les poignées et à la fois agrandir le composant qui est dans FocusControl.

    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    procedure TFDossierTiers.PoigneMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    Var
      R: TRect;
      sPanel: TsPanel;
    begin
     
      if not Assigned(Sender) then exit;
      if not (Sender is TMyShape) then exit;
      if not Assigned(TControl(Sender).Parent) then exit;
      if not (TControl(Sender).Parent is TsPanel) then exit;
      sPanel := TsPanel(TControl(Sender).Parent);
     
      // Limite de déplacement
      With sPanel do
      Begin
        R.TopLeft     := ClientToScreen(BoundsRect.TopLeft);
        R.BottomRight := ClientToScreen(BoundsRect.BottomRight);
        ClipCursor(@R); // On ne doit pas sortir de cette zone pendant le déplacement ou l'étirement
      End;
     
      GetCursorPos(oldPos);
    end;
     
    procedure TFDossierTiers.PoigneMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    Var
      NewPos: TPoint;
      FocusPoint: TPoint;
      FocusRect: TRect;
    begin
     
      if not Assigned(Sender) then exit;
      if not (Sender is TMyShape) then exit;
      if not Assigned(TControl(Sender).Parent) then exit;
     
      GetCursorPos(NewPos);
      With TMyShape(Sender) do
      begin
        FocusPoint := TMysPanel(FocusControl).Parent.ScreenToClient(Mouse.CursorPos);
        FocusRect  := TMysPanel(FocusControl).BoundsRect;
        Case TMyShape(Sender).Tag of
    //...
         3: // étirement de gauche à droite (sur la poignée de droite)
         begin
           FocusRect.Right := FocusPoint.X;
           Left := Left - oldPos.X + newPos.X; // déplacement de la poignée
         end;
    //...
         7:// étirement de gauche à droite (sur la poignée de gauche)
         begin
           FocusRect.Left := FocusPoint.X;
           Left := Left - oldPos.X + newPos.X;// déplacement de la poignée
         end;
        end;
        TMysPanel(FocusControl).SetBounds(FocusRect.Left,FocusRect.Top,FocusRect.Right - FocusRect.Left,FocusRect.Bottom - FocusRect.Top); // On place le focuscontrol
        oldPos := newPos;
     
      end;
    end;
     
    procedure TFDossierTiers.PoigneMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
     
      if not Assigned(Sender) then exit;
      if not (Sender is TMyShape) then exit;
      if not Assigned(TControl(Sender).Parent) then exit;
     
      ClipCursor(nil); // On libère le clip
    end;
    Mais malheureusement je n'ai pas l'action souhaité !!!

    Lorsque j'utilise la poignée de droite en tout premier ça va, mais après c'est le délire, mes poignées ce barrent , elles deviennent... vivantes !!! mdr quand j'approche la souris elle s'en vont.. trop ptr

    Est-ce quelqu'un peux me dire où je fais pas bien mon calcul ?

    Merci à vous.

  2. #2
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Bon

    J'ai compris pourquoi.

    J'ai créé une variable globale

    FPoignePositioner :Boolean;

    Ensuite dons mes évènements j'ai fais
    DOWN
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TFDossierTiers.PoigneMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    Var
      R: TRect;
      sPanel: TsPanel;
    begin
    //...
      FPoignePositioner := True;
      GetCursorPos(oldPos);
    end;
    MOVE
    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
    procedure TFDossierTiers.PoigneMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    Var
      NewPos: TPoint;
      FocusPoint: TPoint;
      FocusRect: TRect;
    begin
    // ... 
      if FPoignePositioner then
      begin
        GetCursorPos(NewPos);
        With TMyShape(Sender) do
        begin
          FocusPoint := TMysPanel(FocusControl).Parent.ScreenToClient(Mouse.CursorPos);
          FocusRect  := TMysPanel(FocusControl).BoundsRect;
          Case TMyShape(Sender).Tag of
    //...
      end;
    end;
    UP
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TFDossierTiers.PoigneMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
     
      if not Assigned(Sender) then exit;
      if not (Sender is TMyShape) then exit;
      if not Assigned(TControl(Sender).Parent) then exit;
      
      FPoignePositioner := False; 
      ClipCursor(nil); // On libère le clip
    
    end;
    Mais il me reste un problème.

    Lorsque j'utilise celui de gauche c'est nikel, mais lorsque j'utilise en deuxième fois ou troisieme fois celui de droite, la poignée raptissie, disont qu'elle s'enfonce dans le composant, elle se déplace et disparait de plus en plus dans le composant.

    Je vois pas où se décalage peut ce produire...

  3. #3
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    C'est bon j'ai trouvé.

    Pas besoin du
    FocusPoint := TMysPanel(FocusControl).Parent.ScreenToClient(Mouse.CursorPos);

    bye

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XCode] Probleme de resize
    Par Uren dans le forum XCode
    Réponses: 0
    Dernier message: 23/10/2012, 15h56
  2. [GD] fonction resize recadrage mais probleme de transparence
    Par creative69 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 01/10/2008, 19h26
  3. [WIN32][C++] Probleme de resize
    Par krakoss dans le forum Windows
    Réponses: 2
    Dernier message: 30/07/2007, 17h52
  4. Probleme de resizing pour mon JFrame
    Par CaptnB dans le forum NetBeans
    Réponses: 2
    Dernier message: 21/11/2006, 17h36
  5. Probleme de Resize "proportionnel" d'une fenetre
    Par biloute2121 dans le forum MFC
    Réponses: 3
    Dernier message: 24/11/2005, 10h20

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