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

Résolu
Signaler
Messages postés
243
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
28 décembre 2008
-
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
-
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

Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
46
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
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
46
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
Messages postés
436
Date d'inscription
vendredi 7 novembre 2003
Statut
Membre
Dernière intervention
8 octobre 2008
5
Bonjour,
Question triviale : numfen commence à combien ?

Dom
Messages postés
243
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
28 décembre 2008

merci ça marche
je croix que j'ai pas fini d'apprendre des trucs.
Messages postés
243
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
28 décembre 2008

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.
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
46
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
Messages postés
243
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
28 décembre 2008

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.
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
46
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
Messages postés
243
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
28 décembre 2008

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
Messages postés
243
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
28 décembre 2008

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
Messages postés
243
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
28 décembre 2008

apparement le pb viendrait dans la création de mon edit et de monpanel

si je met que le browser ca marche.
Messages postés
243
Date d'inscription
mercredi 22 janvier 2003
Statut
Membre
Dernière intervention
28 décembre 2008

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.
Messages postés
3826
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
10 mai 2021
46
ç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