2009-04-15 6 views
0

J'ai un descendance TFrame qui contient un panneau de taille importante qui est un composant tiers (TLMDSimplePanel)). Le dimensionnement de ce panneau fonctionne très bien, mais je souhaite que le cadre qu'il contient soit redimensionné dynamiquement lorsque l'utilisateur modifie la taille du panneau. (Le panneau a une petite prise sur le pouce que l'utilisateur peut simplement cliquer et faire glisser avec la souris).Redimensionnement dynamique des cadres et des formulaires dans Delphi

Le code de ce cadre est ci-dessous:

unit SizeableFrame; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, TcmBaseFrameFrame, LMDCustomControl, LMDCustomPanel, LMDCustomBevelPanel, 
    LMDSimplePanel, StdCtrls; 

type 
    TcmSizeableFrame = class(TcmBaseFrame) 
    LMDSimplePanel1: TLMDSimplePanel; 
    Memo1: TMemo; 
    Memo2: TMemo; 
    procedure LMDSimplePanel1Resize(Sender: TObject); 
    procedure FrameCanResize(Sender: TObject; var NewWidth, NewHeight: Integer; 
     var Resize: Boolean); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    cmSizeableFrame: TcmSizeableFrame; 

implementation 

{$R *.dfm} 

procedure TcmSizeableFrame.FrameCanResize(Sender: TObject; var NewWidth, 
    NewHeight: Integer; var Resize: Boolean); 
begin 
    inherited; 
    Resize := True; 
end; 

procedure TcmSizeableFrame.LMDSimplePanel1Resize(Sender: TObject); 
const 
    ExpandByPixels = 60; 
var 
    MyFrame : TFrame;   
begin 
    inherited; 
    Self.Height := LMDSimplePanel1.Height + ExpandByPixels; 
    Self.Width := LMDSimplePanel1.Width + ExpandByPixels; 
end; 

end. 

Il fonctionne à merveille, si l'utilisateur est rétrécissement la taille du cadre, mais s'ils tentent de l'étirer plus grand que ses limites d'origine, ils peuvent seulement l'étendre à ce que apparaît pour être sa taille d'origine + ExpandByPixels, après quoi l'utilisateur ne peut pas continuer à le faire glisser de manière fluide vers une taille plus grande. S'ils s'arrêtent, puis cliquez à nouveau sur la poignée de taille et faites-la glisser, ils peuvent la faire glisser vers une taille plus grande, mais de nouveau, elle est contrainte de la même manière (taille actuelle + ExpandByPixels = limite externe). Ils peuvent répéter ce cycle sans fin, en élargissant le cadre à n'importe quelle taille, mais pas de manière fluide dans un mouvement de la souris, ce qui est ce que je veux.

J'ai aussi testé ce même problème contre les descendants de TForm et j'ai les mêmes symptômes.

Qu'est-ce qui me manque ici?

Merci d'avance pour toute aide. :-)

Répondre

4

Avez-vous essayé de définir Frame.Autosize sur true?
Ou vous auriez besoin de redimensionner le cadre lorsque la souris se déplace. De sorte que l'objet contenu puisse s'étendre tout en restant dans les limites du conteneur.

Mise à jour: un code simple qui fonctionne avec un TPanel régulier pour redimensionner horizontalement ...

type 
    TFrame5 = class(TFrame) 
    Panel1: TPanel; 
    procedure Panel1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); 
    procedure Panel1Resize(Sender: TObject); 
    end; 

implementation 

{$R *.dfm} 

procedure TFrame5.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); 
begin 
    with Sender as TPanel do 
    if ssLeft in Shift then 
    begin 
    Width := X; 
    end; 
end; 

procedure TFrame5.Panel1Resize(Sender: TObject); 
begin 
    with Sender as TPanel do 
    begin 
    (Parent as TFrame).Width := Width + 2*Left; 
    end; 
end; 
+0

Oui, je l'ai fait essayer. Ce que j'ai trouvé, c'est que pendant que le panneau était dimensionné, la fonctionnalité d'auto-dimensionnement de la trame ne se mettait pas en marche (peut-être attendait-elle que le panneau soit redimensionné), donc cela ne fonctionnait pas. De plus, cependant, j'ai besoin d'une "bordure tampon" autour du panneau; ne pas affleurer. – Jamo

+0

Essayez avec mon code d'exemple, cela fonctionne avec un TPanel standard. Cependant, vous devrez peut-être modifier votre composant TLMDSimplePanel. –

+1

De plus, pour la "bordure tampon", vous pouvez jouer avec la propriété de remplissage du cadre ou des marges du panneau ... –

Questions connexes