Dessiner sur un TImage dans un TTabSheet

Résolu
glt0732 Messages postés 17 Date d'inscription mercredi 30 juin 2004 Statut Membre Dernière intervention 29 juillet 2004 - 27 juil. 2004 à 01:10
cs_saib Messages postés 38 Date d'inscription mercredi 12 mars 2003 Statut Membre Dernière intervention 15 mars 2010 - 1 août 2004 à 19:21
Pour dessiner dans un TImage la technique la plus simple reste :

Image1.Canvas.MoveTo(50,50);
Image1.Canvas.LineTo(50,100);

Ok ! jusque la il n'y a pas de probléme, mais quand je créer plusieur TImage a l'éxécution, Comment s'appelle mes différent TImage ?

Parceque franchement je seche, surtout que cela fait 3 jours que j'essaye de dessiner sur mes différent TImages qui sont contenus dans différent TTabSheet, Enfin bref !

Si quelqu'un connait la solution ce serait cool ! Merci a tous

8 réponses

glt0732 Messages postés 17 Date d'inscription mercredi 30 juin 2004 Statut Membre Dernière intervention 29 juillet 2004
27 juil. 2004 à 16:34
Re-Salut a tous c'est encore moi que voila !
J'ai enfin la solution, hé oui et je l'ai trouvé tout seul comme un grand !

Vous rigolez ou quoi !

Franchement je n'en suis pas encore capable, car je ne suis qu'au stade de débutant, et heureusement que des colégue de developpez.com et de Phidels.com mon aider, sinon je n'était pas sortis de l'auberge, je Re-Merci quand même yvemoreau pour son aide, qui malheureusement était légérement hors sujet, mais cela était de ma faute, et oui je pose une question, et j'en oublis le principale, enfin bref, et si on parlais de la solution !

Tout ce que j'ai a dire c'est que le code du dessus est quasiment bon ! Ce n'est pas compliquer, je vais juste vous rajouter les nouvelle ligne en plus du code ci-dessus.
Les nouvelle ligne de code seront en rouge, les anciennent en noir.

Procédure pour créer une TForm2 (MDI Enfant)
Maintenant je fait un appel a la procédure (AddTabSh) Creation de TTabSheet, avant y'en avait pas, et pour cause j'ai déja une TTabSheet a la conception, hors il est inutile de re-creer une TTabSheet alors qu'elle existe déja, non ! Et voila pourquoi j'affecte 1 a Nbr (Nbr = Nombre de TTabSheet ). Vous remarquer aussi qu'il y a un nouveau parametre de type Boolean. Vous verrez plus tard pourquoi.

procedure TForm1.Button1Click(Sender: TObject);
begin
....
......
Form2.PageControl1.Pages[0].Caption: ='Page n°'+IntToStr(1);
Form2.AddTabSh(false,'Page n°');
Nbr:= 1;
 end ;


Maintenant la création des TTabSheet (Conteneur des TImage) Vous voyez la différence peut être ? Et bien a la création de TForm2, AddTabSh <gras>False, tandis que a la création de TTabSheet, AddTabSh</gras> True . Vous comprenez, sinon vous allez voir plus tard ! Bien entendu on laisse le parametre pour le nom du TTabSheet.

procedure TForm1.Button2Click(Sender: TObject);
begin
if (ActiveMDIChild is TForm2) then
(ActiveMDIChild as TForm2).AddTabSh(true,'Page n°');
end;


Passons a la procédure qui créer les TTabSheet et les TImage.
La seule chose qui change comme vous pouvez vous en doutez c'est la déclaration de la procédure elle même, on lui rajoute un parametre Boolean. Mais ce n'est pas tout, il va falloir tester ce parametre, et oui c'est ici que l'on créer nos TTabSheet et les TImage, Mais si c'est la procedure de Création de TForm2 qui appele AddTabSh, et bien il ne faut pas que celle ci créer de nouveau TTabSheet étant donnée que TForm2 en créer automatiquement 1, il faut donc faire une instruction IF au tout début de la procédure, et voici ce que cela donne.

procedure TForm2.AddTabSh(Add: Boolean; const F:String);
begin
if Add then
begin
....
......
On créer le TTabSheet avec le TImage
.....
......
with Image1 do
begin
Parent:  =TabSh;
Align:= alClient;
OnMouseDown:=ImageMouseDown;
 end ;
Act: =PageControl1.TabIndex+1;
end;
end
else
Image1.OnMouseDown:= ImageMouseDown;
 end ;


True = on Créer TTabSheet et Timage dynamiquement
False = on Appelle la procédure ImageMouseDown (précédement créer)

Et maintenant le clous finale, et croyer moi c'est lui qui fais tout !
Vous voyez l'affectation de ImageMouseDown, et bien on dit que l'événement OnMouseDown celui que l'on trouve dans l'inspecteur d'objet, on dit qu'il est = a notre procédure nommé ImageMouseDown, et comme a chaque événement, celui ci se dirigera vers la bonne TImage. Il suffit donc de faire :

Procedure TForm2.ImageMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
   (sender as Timage).canvas.lineTo(x,y);
end;
end.


Et voila, ce n'était pas grand chose, mais quand on connait pas, c'est toujour compliquer.
Maintenant si ça vous dit, faite un copier coller du code que vous avez dans le post précédent, et rajouter y le code ici même en rouge, et bon dev !
3
yvemoreau Messages postés 308 Date d'inscription mardi 11 juin 2002 Statut Membre Dernière intervention 26 septembre 2008
27 juil. 2004 à 07:13
le mieux c'est de creer un tableau puisque l'on connait le nombres d'image requis.

on pourra ainsi nommé ses éléments et ensuite les détruires facilement dans onClose

var
Form1: TForm1;
tableImages:array[1..3]of TImage;
implementation
{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
tableImages[1]:=TImage.Create(TabSheet1);
tableImages[1].Parent:=TabSheet1;
tableImages[1].Width:=TabSheet1.Width;
tableImages[1].Height :=TabSheet1.Height;
tableImages[1].Picture.loadfromFile('1.bmp');

tableImages[2]:=TImage.Create(TabSheet2);
tableImages[2].Parent:=TabSheet2;
tableImages[2].Width:=TabSheet2.Width;
tableImages[2].Height :=TabSheet2.Height;
tableImages[2].Picture.loadfromFile('2.bmp');

tableImages[3]:=TImage.Create(TabSheet3);
tableImages[3].Parent:=TabSheet3;
tableImages[3].Width:=TabSheet3.Width;
tableImages[3].Height :=TabSheet3.Height;
tableImages[3].Picture.loadfromFile('3.bmp');
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FreeAndNil(tableImages[1]);
FreeAndNil(tableImages[2]);
FreeAndNil(tableImages[3]);
end;

{les bmp sont dans le même répertoire que le exe}
tu peux aussi leur donné un nom comme ceci:
tableImages[3].Name:='Imagenum1';
mais dans ce cas ci le numéro du tableau réfère à celui du tab alors ?
yve
0
yvemoreau Messages postés 308 Date d'inscription mardi 11 juin 2002 Statut Membre Dernière intervention 26 septembre 2008
27 juil. 2004 à 07:33
bon je vais complémenter un peu...

(PageControl1.TabIndex);

renvoi le numéro de la page 0 à ...

ici il aurait fallu écrire
tableImages:array[0..3]of TImage;
pour simplifier

ou augmenter de 1
(PageControl1.TabIndex+1);
pour correspondre au tableau !!! :sleepy)

et de n'importe quel procédure tu pourra
dessiner sur le tab actif

var z:Integer;
begin
z:=PageControl1.TabIndex+1;
with tableImages[z].Canvas do
begin
Pen.Color:=ClRed;
Pen.Width:=3;
MoveTo(50,22);
LineTo(44,100);
end;
end;

:question) yve
0
glt0732 Messages postés 17 Date d'inscription mercredi 30 juin 2004 Statut Membre Dernière intervention 29 juillet 2004
27 juil. 2004 à 09:28
Super ! et Merci, je vais essayer ça tout de suite, et bien entendu je vous tient au courant.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
glt0732 Messages postés 17 Date d'inscription mercredi 30 juin 2004 Statut Membre Dernière intervention 29 juillet 2004
27 juil. 2004 à 11:05
Re-Salut si tu est toujour la bien entendu, aprés avoir analyser ton code, je me suis dit que ce ne pourrait pas fonctionner sachant que je peut avoir 50 TTabSheet donc 50 TImage.

Ce que j'ai oublier de préciser c'est que je suis sur une fenêtre MDI Enfant, et qui plus est je peut créer autant de fenêtre MDI contenant des TTabSheet contenant eux même des TImages.

Pour te résumer tout ceci je ne connait pas les nom des TTabSheet ni des fenetre MDI (TForm2), et bien entendus ni des TImage, étant donné que je les créer tous a l'éxécution, mais ceci est une erreur de ma part, car j'aurais du le préciser dans mon premier message. Ou peut être que je dit n'importe quoi sachant que je suis débutant sur Delphi depuis 1 mois a peine.

Enfin bref ! Assez discuter je vais vous fournir le proto sur lequel je suis en train de travailler :

Alors pour commencer nous avons une TForm1 contenant 3 boutons :

- Un Pour créer des TForm2
- Un Pour créer des TTabSheet sur le TPageControl de la Tform2
- Et un autres pour fermer les TTabSheet

Alors voici la procédure de création de TForm2 (Enfant). Cette procédure ne fait rien d'autre que de créer une fenêtre Enfant MDI, Sachant que j'ai un TPageControl contenant un TTabSheet a la conception, le 1er TTabSheet n'a donc pas besoin d'être créer.

procedure TForm1.Button1Click(Sender: TObject);
begin
Form2:= TForm2.Create(Application);
Form2.Caption:=('Dossier n°'+IntToStr(MDIChildCount));
Form2.PageControl1.Pages[0].Caption:='Page n°'+IntToStr(1);
Nbr:=1;
 end ;


Maintenant voici la création des nouveau TTabSheet, en faite j'appelle la procédure AddTabSh qui se trouve sur la 2eme Unités.

procedure TForm1.Button2Click(Sender: TObject);
begin
if (ActiveMDIChild is TForm2) then
    (ActiveMDIChild as TForm2).AddTabSh('Page n°');
end;


Et Maintenant voici la procédure qui le plus gros du travail, c'est a dire la création de TTabSheet et de TImage a l'éxécution. Comme on peut voir j'ai limiter le nombre de TTabSheet a 50. La constante passez en parametre a la procedure n'est autre que le nom du TTabSheet.

procedure TForm2.AddTabSh(const F:String);
begin
if Nbr < 50 then
begin
    TTabSheet.Create(PageControl1).PageControl: =PageControl1;
    Nbr:= PageControl1.PageCount;
    PageControl1.Pages[Nbr-1].Caption:=F+IntToStr(Nbr);
    PIndex:=PageControl1.ActivePageIndex+1;
     if  Nbr-PIndex <> 0 then
        PageControl1.ActivePageIndex: =Nbr-1;
    TabSh:= PageControl1.ActivePage;
    Image1:=TImage.Create(TabSh);
     with  Image1 do
    begin
        Parent: =TabSh;
        Align:= alClient;
     end ;
    Act: =PageControl1.TabIndex+1;
end;
end;


Maintenant j'ai la procédure pour dessiner sur le TImage du TTabSheet actif, qui ne fonctionne pas bien entendus.

procedure TForm2.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
Image1.Canvas.Create;
Image1.Canvas.LineTo(x,y);
end;


Par souci de clarté je me suis dit qu'il serait bien de fournir tout le prototype tant qu'a faire, et vus qu'il reste seulement 2 procédure autant vous les montrez, ce sont les procédure de suppression de TTabSheet, ici j'actualise seulement la variable qui tient a jour la position du TTabSheet Actif.

procedure TForm2.PageControl1Change(Sender: TObject);
begin
Act:= PageControl1.TabIndex+1;
 end ;


Une autre variable va me servir, c'est Nbr qui est le nombre de TTabSheet contenus dans TPageControl, celle ci est actualiser dans la procedure de création de TTabSheet. L'interêt est que quand on supprime un TTabSheet, et même au millieu, tous les autres se renomme automatiquement. Bien entendu le dernier TTabSheet ne peut être supprimer.

procedure TForm1.Button3Click(Sender: TObject);
var
    Z: Integer;
begin
if (ActiveMDIChild is TForm2) then
    with (ActiveMDIChild as TForm2).PageControl1 do
    begin
        if Nbr>1 then
        begin
            ActivePage.Free;
            Nbr: =PageCount;
            Act:= TabIndex+1;
             for  Z: =Act to Nbr do
                Pages[Z-1].Caption:='Page n°'+IntToStr(Z);
        end;
    end;
end;


Quand je créer un 2eme TTabSheet je ne peut plus dessiner, en clair c'est le bordel !

Je suis sur qui doit avoir plus simples, mais étant que je suis débutant je ne connait pas toutes les ficelles, alors excuser moi pour ce brouillon !

Et puis sinon Merci !
0
yvemoreau Messages postés 308 Date d'inscription mardi 11 juin 2002 Statut Membre Dernière intervention 26 septembre 2008
27 juil. 2004 à 17:35
ok, que se passe-t-il à la fin ?
tu ne dois pas oublier de liberer les ressources

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
x:Integer;
begin
for x:=0 to PageControl1.PageCount-1 do
begin
//On libère le Timage du TTabSheet :question)
//On libère le TTabSheet du TPageControl
end;
end;

yve
0
glt0732 Messages postés 17 Date d'inscription mercredi 30 juin 2004 Statut Membre Dernière intervention 29 juillet 2004
29 juil. 2004 à 02:38
Re-Bonjour monsieur yve !

En clair entre mon dernier message et celui la je dormais, et je n'est donc pas pu lire ton message, et je t'avourais que je ne comprend pas trop ton message, j'espere donc que tu lira le miens.

Sinon si c'est pour la fermeture de TForm1, je pensais que les ressource était liberer des que l'on cliquait sur la croix en haut a droite, sinon je sais pas !
0
cs_saib Messages postés 38 Date d'inscription mercredi 12 mars 2003 Statut Membre Dernière intervention 15 mars 2010
1 août 2004 à 19:21
Salut

Tu peut egalement passer par un pointeur, ce qui permet une plus grande souplesse d'utilisation

Il faut savoir que le "nom" d'un controle n'est autre qu'un pointeur vers le controle proprement dit

On peut donc assigner un controle a un pointeur du meme type
par exemple, si j'ai une image TImage1 sur ma Form, je peux l'utiliser et y acceder par un autre nom
il suffit pour cela de declarer une variable de type Timage

Var MonImage : TImage;

Procedure TrucBidule(Sender : TObject)
Begin
MonImage := (Sender as TImage) //on assigne le SEnder a la variable MonImage (il faut bien sur que le Sender soit toujours un TImage)

MonImage.Canvas.LineTo(x,y)
MonImage.Width := MonImage.Width div 2
MonImage.Picture.LoadFromFile('CheminDuFichier');
etc...
end;

de cette maniere, tu peut par exemple recuperer l'image assosiée au TabSheet actif sur l'evenement OnShow des TabSheet ou OnChange du TabControl, soit par le nom, soit par lien de parenté (boucle For jusqu'a ComponentCount - 1 et tu teste Components[i] pour savoir si c'est un TImage, etc...) mais c'est moins propre, et utiliser une variable pour faire des actions specifiques sur l'image quand se produisent des evenements particuliers (appui sur un bouton, changement de contenu d'un TEdit, etc...)

Voila, une p'tite astuce pour se faciliter la vie ;)

SaiB
0
Rejoignez-nous