Pb dans mon code au niveau de la création de composants en dynamique. POuvez-vou

Résolu
Bestdoud Messages postés 243 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 28 décembre 2008 - 31 janv. 2006 à 00:37
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 - 1 févr. 2006 à 22:11
Pouvez vous me dire ce qui cloche la dedans.
si je met maform.WindowState := wsmaximized;
ca me met une erreur comme quoi le composants existe déja.lorsque je crée la deuxième fenêtre.

Si je met en fenetre bureau normal ca marche

Ce code permet de créer des formes avec un panel à droite, un edit en bas et un webbrowser et de redimenssionner à chaque appuis sur un bouton de la fenetre principale.


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, OleCtrls, SHDocVw_TLB, ComCtrls;

type
TForm1 = class(TForm)
Panel1: TPanel;
Button1: TButton;
StatusBar1: TStatusBar;
Panel2: TPanel;
procedure Button1Click(Sender: TObject);
procedure FormResize(Sender: TObject);
private
{ Déclarations privées }
public
{ Déclarations publiques }
end;

var
maform : Tform;
numfen : integer;
Monpanel:Tpanel;
Monedit:Tedit;
monwebwrowser:Twebbrowser_V1;
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
maform := Tform.create(self);
maform.name := 'fenetre' + inttostr(numfen);
maform.FormStyle := fsMDIchild;
maform.visible:= true;
inc(numfen);
maform.WindowState := wsmaximized;
maform.OnResize := formresize;

MonPanel := Tpanel.Create(self);
monpanel.name := 'panel' + maform.name;
MonPanel.Parent := maform;
MonPanel.Align := alright;
Monpanel.Width := 160;

Monedit := Tedit.Create(self);
monedit.name := 'edit' + maform.name;
Monedit.Parent := maform;
Monedit.Align := albottom;
Monedit.height := 20;
monedit.color:= clcream;

monwebwrowser := Twebbrowser_V1.Create(self);
monwebwrowser.name := 'browser' + maform.name;
monwebwrowser.ParentWindow := maform.handle;
monwebwrowser.top := 0;
monwebwrowser.left := 0;
monwebwrowser.width:= maform.Clientwidth - MonPanel.Width;
monwebwrowser.height:= maform.ClientHeight - Monedit.Height;

end;

procedure TForm1.FormResize(Sender: TObject);

begin
maform := tform(sender);
monpanel := Tpanel(FindComponent('panel' + maform.name));
monedit := Tedit(FindComponent('edit' + maform.name));
monwebwrowser := Twebbrowser_V1(FindComponent('browser' + maform.name));
monwebwrowser.width := maform.ClientWidth - monpanel.Width;
monwebwrowser.height := maform.Clientheight - monedit.height;
end;

end.

13 réponses

Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
31 janv. 2006 à 11:25
Salut,
l'erreur est tout à fait normal puisque tu déclare MaForm, MonPanel, MonEdit Etc.
et ensuite tu fais
MaForm := TForm.Create(Self);
....
MonPanel := TPanel.Create(Self)
MonPanel.Name := 'Panel' + MaForm.name;
Jusque la ça va mais dès que tu veux crée une deuxième Form l'erreur se produit puisque
même si tu lui change de nom Maform existe quand même déjà donc dès l'instant ou
MaForm := TForm.Create(Self); est à nouveau appelé l'erreur se produit.

Pour éviter ce genre d'erreur il te faut passer par un tableau genre :

Var
MesForm : Array of TForm;
MesPanel : Array of TPanel;

Procedure TForm1.Button1Click(Sender: TObject);
Begin
SetLength(MesForm, Length(MesForm) + 1);
MesForm[High(MesForm)] : = TForm.Create(Self);
With MesForm[High(MesForm)] Do
Begin
Name := 'Fenetre' + IntToStr(High(MesForm));
Tag := High(MesForm);
OnResize := FormResize;
.....
End;
.....
End;

Procedure TForm1.FormResize(Sender: TObject);
begin
If TForm(Sender).Tag > Heigh(MesForm) Then Exit;
With MesForm[TForm(Sender).Tag ] Do
Begin
....
End;
End;

Il faudrait aussi penser à libérer les composants à la fermeture de la Form même si normalement Delphi s'en charge ça fait plus propre. J'éspère avoir été assé claire si non n'hésite pas à demander.

@+
Cirec
3
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
31 janv. 2006 à 11:30
Oups une petite erreur c'est glissé dans le code :
Procedure TForm1.FormResize(Sender: TObject);
begin
If TForm(Sender).Tag > High(MesForm)Then Exit;
With MesForm[TForm(Sender).Tag ] Do
Begin
....
End;
End;

@+
Cirec
3
dominique.stock Messages postés 436 Date d'inscription vendredi 7 novembre 2003 Statut Membre Dernière intervention 8 octobre 2008 7
31 janv. 2006 à 09:17
Bonjour,
Question triviale : numfen commence à combien ?

Dom
0
Bestdoud Messages postés 243 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 28 décembre 2008
31 janv. 2006 à 18:32
merci ça marche
je croix que j'ai pas fini d'apprendre des trucs.
0

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

Posez votre question
Bestdoud Messages postés 243 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 28 décembre 2008
31 janv. 2006 à 20:30
Par contre j'essaye de faire afficher une fenetre en particulier quand je clique sur un bouton

j'utilise la commnde show
ca amrche mais qd je clique ca me met une erreur ca me me impossible de créer la fiche.
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
31 janv. 2006 à 21:01
il va me faloir plus d'informations si le code n'est pas trop long poste le ici ce sera plus facile pour trouver le problème

@+
Cirec
0
Bestdoud Messages postés 243 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 28 décembre 2008
31 janv. 2006 à 21:26
Var
MesForm : Array of TForm;
MesPanel : Array of TPanel;
MesEdit : Array of Tedit;
MesBrowser : Array of Twebbrowser_V1;
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.dffdffClick(Sender: TObject);
Begin
SetLength(MesForm, Length(MesForm) + 1);
MesForm[High(MesForm)] := TForm.Create(Self);
With MesForm[High(MesForm)] Do
Begin
Name := 'Fenetre' + IntToStr(High(MesForm));
Tag := High(MesForm);
formstyle := fsmdichild;
windowstate := wsmaximized;
onresize := FormResize;
visible := true;
SetLength(MesEdit, Length(MesEdit) + 1);
MesEdit[High(MesEdit)] := Tedit.Create(Self);
With MesEdit[High(MesEdit)] Do
Begin
Name := 'edit' + IntToStr(High(MesEdit));
Tag := High(MesEdit);
Align := albottom;
Parent := MesForm[High(MesForm)];
End;
SetLength(MesBrowser, Length(MesBrowser) + 1);
MesBrowser[High(MesBrowser)] := Twebbrowser_V1.Create(Self);
With MesBrowser[High(MesBrowser)] Do
Begin
Name := 'Browser' + IntToStr(High(MesBrowser));
ParentWindow := MesForm[High(MesForm)].Handle;
Tag := High(MesBrowser);
top := 0;
left := 0;
End;
SetLength(MesPanel, Length(MesPanel) + 1);
MesPanel[High(MesPanel)] := Tpanel.Create(Self);
With MesPanel[High(MesPanel)] Do
Begin
Name := 'panel' + IntToStr(High(MesPanel));
Tag := High(MesPanel);
Align := alright;
Parent := MesForm[High(MesForm)];
bevelouter := bvnone;
End;
formresize(MesForm[High(MesForm)]);
End;
End;

Procedure TForm1.FormResize(Sender: TObject);
begin
If TForm(Sender).Tag > High(MesForm) Then Exit;
With MesForm[TForm(Sender).Tag ] Do
Begin
With MesBrowser[TForm(Sender).Tag ] Do
Begin
width := MesForm[TForm(Sender).Tag].Clientwidth - MesPanel[TForm(Sender).Tag].Width;
height:= MesForm[TForm(Sender).Tag].ClientHeight - Mesedit[TForm(Sender).Tag].Height;
End;
End;
End;

procedure TForm1.Button1Click(Sender: TObject);
//pour afficher la fenetre 2 devant les autres
begin
with MesForm[2] do
begin
show;
end;

end;

end.
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
1 févr. 2006 à 01:25
Bon alors part manque de temps je n'ai pas tout controlé je suis allé au plus rapide voici ce que ça donne :

Les lignes en vert sont retirée
Les lignes en rouge sont modifiée
Les lignes en bleu sont ajoutée

procedure TForm1.dffdffClick(Sender: TObject);
Begin
SetLength(MesForm, Length(MesForm) + 1);
MesForm[High(MesForm)] := TForm.Create(Self);
With MesForm[High(MesForm)] Do
Begin
Name := 'Fenetre' + IntToStr(High(MesForm));
Tag := High(MesForm);
Parent := Self; // si tu met cette ligne les fenêtres reseteront à l'intérieur de Form1 à tester
// formstyle := fsmdichild; // fsmdichild pose encore un problème je ne sais pas pourquoi
windowstate := wsNormal; // je l'ai mis à WSNormal pour voir quelque chose
visible := true;
SetLength(MesEdit, Length(MesEdit) + 1);
MesEdit[High(MesEdit)] := Tedit.Create(Self);
With MesEdit[High(MesEdit)] Do
Begin
Name := 'edit' + IntToStr(High(MesEdit));
Tag := High(MesEdit);
Align := albottom;
Parent := MesForm[High(MesForm)];
End;
SetLength(MesBrowser, Length(MesBrowser) + 1);
MesBrowser[High(MesBrowser)] := Twebbrowser_V1.Create(Self);
With MesBrowser[High(MesBrowser)] Do
Begin
Name := 'Browser' + IntToStr(High(MesBrowser));
ParentWindow := MesForm[High(MesForm)].Handle;
Tag := High(MesBrowser);
top := 0;
left := 0;
End;
SetLength(MesPanel, Length(MesPanel) + 1);
MesPanel[High(MesPanel)] := Tpanel.Create(Self);
With MesPanel[High(MesPanel)] Do
Begin
Name := 'panel' + IntToStr(High(MesPanel));
Tag := High(MesPanel);
Align := alright;
Parent := MesForm[High(MesForm)];
bevelouter := bvnone;
End;
onresize := FormResize; // celle ci à été déplacé ici quand tous les composants ont étés crées
//formresize(MesForm[High(MesForm)]); // et celle ci je l'ai retirée puisque la ligne précedente appel déjà FormResize
End;
End;


procedure TForm1.Button1Click(Sender: TObject);
//pour afficher la fenetre 2 devant les autres
begin
with MesForm[2] do
showWindow(handle, SW_SHOWNORMAL); // et la j'utilise ShowWindow ce qui permet de restituer la taille et la position de la fenêtre même si elle est réduite où fermer
end;

Attention il te faut crée 3 Form pour pouvoir utiliser la procedure Button1Click puisque la première fenêtre crée porte le N°0 et non 1. Bien sur il faudrai encore étoffé le code il est fonctionnel mais pas achevé.

@+
Cirec
0
Bestdoud Messages postés 243 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 28 décembre 2008
1 févr. 2006 à 18:10
j'ai essayé tes modifs et marche moins bien

je te met le lien de mon appli pour que tu voit mieuxce que je veux faire

http://amigagaamp.free.fr/divers/testform2.zip

tout fonctionne: création, redimensionnement, activer fenetre mais ca plante à la fermeture de l'application
0
Bestdoud Messages postés 243 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 28 décembre 2008
1 févr. 2006 à 18:14
showWindow(handle, SW_SHOWNORMAL); ne faisait aucun effet. alors j'ai mis 3 à la place de SW_SHOWNORMAL. ca met la fenetre devant mais toujours le même pb à la fermeture
0
Bestdoud Messages postés 243 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 28 décembre 2008
1 févr. 2006 à 19:28
apparement le pb viendrait dans la création de mon edit et de monpanel

si je met que le browser ca marche.
0
Bestdoud Messages postés 243 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 28 décembre 2008
1 févr. 2006 à 19:47
apres des essaies il y a uniqement l'edit qui fait planter

j'ai essayé de le remplacer par un combo ou un labelededit et ca fait pareil.
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
1 févr. 2006 à 22:11
ça y est j'ai tout bon mais le code est trop long pour être posté ici
si tu me passes ton Mail par Message privé je te donne la source en retour

@+
Cirec
0
Rejoignez-nous