begin process at 2010 03 18 22:21:55
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Delphi

 > 

Système

 > 

Exécution

 > 

Question sur fonction assigned()


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Question sur fonction assigned()

samedi 11 juillet 2009 à 08:47:49 | Question sur fonction assigned()

solilog

Bonjour à tous,
Comment savoir si une fenêtre est créée / affichées, je m'explique:
Quand je crée une fenêtre avec
      form1 := tform1.create(self) - self étant une fenêtre parent, je crée ma fenêtre bien
si dans mon code je teste assigned(form1), j'aurai True, bien.
si dans l'évenement OnClose de Form1 il y a Action := cafree pour détruire la fenêtre, celle-ci sera détruite, mais  la valeur du pointeur Form1 ne sera pas mise à nil, et dans ce cas, si je teste assigned(Form1) j'aurai True alors que la fenetre n'existe plus. En fait la procedure free détruit l'objet et libère l'expace mais ne met pas le pointeur à nil.

En fait, je veux enabler/disabler des actions (boutons, menus, ...)  dans une forme si d'autres forms sont présentes (Action1.enabled := True/False), mais comment être sûr que les fenetres sont présentes assigned(xxx) peut me retourner une valeur fausse.
Une solution serait de renseigner une variabl dans form1.create : form1_aff = true et dans form1.destroy : form1_aff=false, et je pourrais faire action1.enabled := not form1_aff, ... et ainsi de suite pour les autres forms, mais ce n'est pas très élégant.
L'autre solution serait de boucler sur toutes les forms de l'application, ça ne me plait pas non-plus.
Avez-vous une idée ?
Bonne journée à tous.

samedi 11 juillet 2009 à 12:10:42 | Re : Question sur fonction assigned()

cirec

Membre Club Administrateur CodeS-SourceS
sinon  à la place de Composant.Free
tu peux utiliser FreeAndNil(Composant)

 
@+
Cirec

samedi 11 juillet 2009 à 13:25:20 | Re : Question sur fonction assigned()

cantador

Membre Club
tu peux tester la visibilité de la forme après sa présence

if Assigned(Form1) then
 if Form1.visible then

nb : pas testé

cantador
samedi 11 juillet 2009 à 15:13:26 | Re : Question sur fonction assigned()

solilog

Merci à tous les deux mais ça ne m'aide pas car:
  - Cirec - je ne veux pas utiliser xxx.Free ni xxx.FreeAndNil, je reste sur un close pour les forms et le close automatique pour les modals, (tu m'as quand même appris le freeandnill que je ne connaissait pas, merci)
  - cantador - je fais ton test et button1.enabled est false malgré que Form2 soit détruite. assigned(form2) retourne true et form2.visible aussi.

procedure TForm1.Button2Click(Sender: TObject);
begin
   form2:=tForm2.create(self);
   form2.show;
   // normalement le close est dans une autre proc
   // mais pour le test c'est pareil
   // je précise qu'il y a "Action:=caFree"
   // dans form2.onclose
   form2.close;
   if assigned(form2) then
      button1.enabled := not form2.visible;
end;

En plus il est possible que ça plante, car propriétés d'un objet détruit peuvent taper n'importe où en mem ...
 
Je vais mettre une variable dans chaque unit concernées genre Form1_vis : boolean, mise à true dans onCreate et false dans onclose, c'est moche mais au moins ça marche.
Si qq'1 a mieux à me proposer ...
Tcho à tous.
solilog

samedi 11 juillet 2009 à 15:18:18 | Re : Question sur fonction assigned()

f0xi

Membre Club Administrateur CodeS-SourceS

dans la fiche parent :

type
  TFormParent = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    fFormChild : TForm;
  public
    procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  end;

var
  FormParent: TFormParent;

implementation

procedure TFormParent.FormCreate(Sender: TObject);
begin
  fFormChild := TForm.Create(Self);
  fFormChild.FreeNotification(Self);
end;

procedure TFormParent.Notification(AComponent: TComponent; Operation: TOperation);
begin
  if (AComponent = fFormChild) and (Operation = OpRemove) then
    fFormChild := nil
  else
    inherited;
end;





samedi 11 juillet 2009 à 15:45:33 | Re : Question sur fonction assigned()

f0xi

Membre Club Administrateur CodeS-SourceS
ou encore :

type
  TFormParent = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    fFormChilds : TList;
  public
    function RegisterFormChild(AFormChild: TForm): integer;
    function UnregisterFormChild(AFormChild: TForm): integer;
  end;

var
  FormParent: TFormParent;

implementation

{$R *.dfm}

procedure TFormParent.FormCreate(Sender: TObject);
begin
  fFormChilds := TList.Create;
end;

procedure TFormParent.FormDestroy(Sender: TObject);
var N : integer;
begin
  for N := fFormChilds.Count-1  downto 0 do
    RemoveFreeNotification(TForm(fFormChilds.Items[N]));

  fFormChilds.Free;
end;

function TFormParent.RegisterFormChild(AFormChild: TForm): integer;
begin
  result := fFormChilds.IndexOf(pointer(AFormChild));

  if result = -1 then
  begin
    result := fFormChilds.Add(pointer(AFormChild));
    FreeNotification(AFormChild);
  end;
end;

function TFormParent.UnregisterFormChild(AFormChild: TForm): integer;
begin
  result := fFormChilds.IndexOf(pointer(AFormChild));

  if result <> -1 then
  begin
    RemoveFreeNotification(AFormChild);
    fFormChilds.Delete(result);
  end;
end;




samedi 11 juillet 2009 à 15:54:50 | Re : Question sur fonction assigned()

f0xi

Membre Club Administrateur CodeS-SourceS

en gros :

creation de l'objet ->
  doit notifier de sa liberation (Objet.FreeNotification(parent))

liberation de l'objet ->
  appel de notification automatique du parent avec operation OpRemove

exemple de code pour notification :

  if (AComponent = objetA) and (operation = OpRemove) then
  begin
    ButtonObjetA.visible := false;
    RemoveFreeNotification(fObjetAInstance);
    fObjetAInstance := nil;
  end
  else
  if (AComponent = objetB) and (operation = OpRemove) then
  begin
    ButtonObjetB.visible := false;
    RemoveFreeNotification(fObjetBInstance);
    fObjetBInstance := nil;
  end
  else
    inherited;

 


samedi 11 juillet 2009 à 18:04:05 | Re : Question sur fonction assigned()

cantador

Membre Club
- cantador - je fais ton test et button1.enabled est false malgré que Form2 soit détruite. assigned(form2) retourne true et form2.visible aussi.
ce n'est pas possible...
si form2 est détruite (et son pointeur à nil) et que tu testes

button1.enabled := Assigned(form2);
 
ça doit marcher

cantador
samedi 11 juillet 2009 à 19:53:30 | Re : Question sur fonction assigned()

solilog

Non cantador, c'est parce que button1créer.
La réponse de .enabled := Assigned(form2) retourne toujours True si Form2 a été une fois une fois créée.
La réponse de f0xi est la bonne, quoique lourde pour enabled sur des actions.
Mais je ne vois rien d'autre.
Problème clos, mous.
solilog


samedi 11 juillet 2009 à 19:59:01 | Re : Question sur fonction assigned()

solilog

Non cantador, c'est parce que button .enabled := Assigned(form2) retourne toujours True si Form2 a été une fois une fois créée.

La réponse de f0xi est bonne, quoique lourde pour enabler des actions.
Mais je ne vois rien d'autre.
Problème clos, Tcho
solilog



1 2

Cette discussion est classée dans : forms, true, fenêtre, form1, assigned


Répondre à ce message

Sujets en rapport avec ce message

Non réversibilité dans l'ouverture de deux forms sous Delphi [ par Francky23012301 ] Salut à tous Bon j'explique je suis nouveau sous Delphi avant je travaillais sous C++ donc la conversion est dure. Voila j'ai deux forms Form1 avec Fenêtre "on top" [ par sebastienbro ] Bonjours à tous,Voilà mon application comporte deux forms. Ces deux forms doivent rester visible (donc au dessus de toutes les autres) quelque soit la Fenêtre [ par racing66 ] Bonjour,Comment faire pour que lorsque j'ouvre une form, elle soit inclu dans la form principale ?Merci d'avance... PB de Newbie à propo des conditions. aidezzzz moi ! [ par Swop ] Bon c'est simple :procedure TForm1.Timer1Timer(Sender: TObject);beginif label1.visible := True thenlabel1.Visible := False;label2.Visible := False;els comment mettre un arrière plan a une fenêtre? [ par cricri_b34 ] j'aime que ma fenetre aie un arriere plan alors j'ai un controle image, mais ya t'il un moyen plus simple et efficace?? Pépin avec un stop et un thread... [ par manu00 ] Hello les pros :-)J'ai un soucis que je n'arrive pas a resoudre...Dans un thread, j'ai ceci...procedure Mythread.Execute;var i:integer;begin repeatbe fermer une form [ par Adidas2 ] Salut à tous,J'explique mon problème :Je lance une application grâce à mon propre programme seulement l'application fraichement lancée ouvre une fenêt ListBox -> sendmessage avec message : LB_INSERTSTRING [ par coopertel ] Bonjour,J'ai mis dans les pièces joints le source de mon programme.En fait je voudrais tout simplement utiliser la fct sendmessageavec le message LB_I Afficher Form Secondaire dans Barre des tâches [ par Emandhal ] Bonjour, Quelqu'un aurait une source ou une solution qui permetterai à une fenêtre secondaire d'une application d'avoir son propre bouton dans la barr Fenêtre windows quelconque ! [ par yvessimon ] Bonjour,La fonction FindWindow(nil,s) permet de récupérer le handler d'une fénêtre quelconque DELPHI ou non DELPHI.Je souhaite maintenant connaître


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,983 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales