2010-01-18 11 views
1

Quelle serait la manière la plus simple de créer une vue miniature, où vous avez un panneau avec une barre de défilement verticale et une matrice d'images décrivant leur image associée? Je voudrais aussi que si la trame parent est redimensionnée horizontalement, la matrice rétrécisse à autant de colonnes que nécessaire pour afficher les vignettes sans une barre de défilement horizontale. J'aimerais pouvoir faire glisser et réorganiser ces vignettes aussi. La boîte à outils dans laquelle cela est écrit n'a pas vraiment d'importance. Si vous connaissez un bon moyen de le faire avec MFC, c'est génial, le constructeur Delphi/C++ est vraiment cool aussi. Juste une sorte de cadre d'application native.Vue de vignette/vue de Windows

Wow, ça sonne beaucoup comme si je suppliais pour l'aide aux devoirs. Je jure que c'est pour un logiciel pour piloter un projecteur laser.

Répondre

3

Jetez un oeil à TMS AdvSmoothImageListBox:

alt text

AFAIK, les clients enregistrés Delphi peuvent télécharger TMS Composants lisses gratuitement sur le site Embarcadero. Si vous n'êtes pas un utilisateur Delphi enregistré, vous pouvez acheter la collection sur le site Web de TMS.

+0

Je suppose que je suis plus intéressé à la façon dont on pourrait construire une telle chose plutôt que comment trouver le composant lui-même. – Evan

+0

Je suis récemment tombé sur du code (Delphi) en faisant cela. Recherchez "Démo de vignettes fileté" sur http://rmklever.com/ –

+0

Génial! C'est plus ou moins ce que je cherche ... maintenant j'ai juste besoin de comprendre comment faire le glisser/déposer ... – Evan

0

Voici le code que j'utilise pour afficher une collection d'une variable numImages nombre de webcams.

const MaxImages = 24; 

type 
TForm1 = class(TForm) 
    ... 
    images: array[1..MaxImages] of TWebcamImage; 
    numImages: integer; 
    .... 
end; 

TWebCamImage est un descendant de TImage avec quelques attributs supplémentaires comme l'url origine de la webcam, le nom de l'image enregistrée, et un gestionnaire pour le double clic pour ouvrir l'image dans un panneau secondaire.

Voici le code utilisé pour organiser les images dans un panneau.

procedure TForm1.ArrangeImages; 
var i, numh, numv : integer; 
const margin=2; 
begin 
    case numImages of 
    1: begin numh:=1; numv:=1; end; 
    2: begin numh:=2; numv:=1; end; 
    3: begin numh:=3; numv:=1; end; 
    4: begin numh:=2; numv:=2; end; 
    5,6: begin numh:=3; numv:=2; end; 
    7,8: begin numh:=4; numv:=2; end; 
    9: begin numh:=3; numv:=3; end; 
    10: begin numh:=5; numv:=2; end; 
    11,12: begin numh:=4; numv:=3; end; 
    13,14,15: begin numh:=5; numv:=3; end; 
    16: begin numh:=4; numv:=4; end; 
    17,18,19,20: begin numh:=5; numv:=4; end; 
    else begin numh:=6; numv:=4; end; 
    end; 
    for i:=1 to numImages do 
    begin 
    images[i].Width := (panel2.Width div numh) - margin * 2; 
    images[i].Height := (panel2.Height div numv) - margin * 2; 
    images[i].Top := (((i-1) div numh) * (panel2.Height div numv)) + margin; 
    images[i].Left := (((i-1) mod numh) * (panel2.Width div numh)) + margin; 
    end; 
end; 

cette méthode est appelée lors de l'initialisation de la forme, accroché dans le cas oncreateonresize et l'événement.

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    ... 
    numImages:=0; 
    for i:=1 to maxImages do 
    begin 
    imageURL:=ini.ReadString('images','imageURL'+intToStr(i),imageURLDefault); 
    if imageURL<>'' then 
     begin 
     inc(numimages); 
     images[numImages]:=TWebCamImage.create(self,panel2,imageURL); 
     end; 
    .... 
    end; 
    .... 
    ArrangeImages; 
    .... 
end; 

procedure TForm1.FormResize(Sender: TObject); 
begin 
    ArrangeImages; 
end; 
0

Je ne suis pas sûr que je vous comprends bien, mais j'aurais commencé avec un cadre de support de l'image et sa description. J'utiliserais alors un TFlowPanel pour tenir des instanciations du cadre. Il ne devrait pas y avoir beaucoup de travail pour implémenter le glisser-déposer, je pense. Jamais essayé, cependant.

S'il y a beaucoup d'images, vous devriez opter pour une solution propriétaire et une solution double-tampon, je pense.

En fin de compte, vous devez simplement laisser tomber dans le composant de projection laser et de le raccorder à l'unité de pilotage du projecteur laser ...