Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Probleme de Parent [ Divers / Débutant(e) ] (anisb)

mardi 5 septembre 2006 à 10:27:49 | Probleme de Parent

anisb

Bonjour à tous,

Je vais essayer d'être clair...
1) Mon projet contient une Form: dans le formCreate, j'instancie un certain nombre de Panel dont le Owner et le Parent est la Form. Dans le Create des Panels, j'utilise des fonctions qui font appels au canvas du Panel et tout ce passe bien (car le Parent est bien positionné avant l'utilisation de ces fonctions ).

2) J'ai changé certaines choses : maintenant, j'ai décidé de placer tous les composants qui étaient sur la Form dans un Panel. Ce Panel Englobant est instancié dans le FormCreate de la Form. Le Parent et le Owner de ce Panel est la Form. Les Panels Englobés sont instanciés dans le Panel Englobant, leur Owner et leur Parent seront donc le Panel Englobant. Mais maintenant, ça plante à l'éxecution lorsque j'arrive sur des instructions qui font appels au Canvas des Panels Englobés. Et je ne comprends pas ce qui se passe...

N.B : Toutes les créations sont éffectuées en Run Time (à l'éxécution) et non en Design Time (Conception)

Quelqu'un pourrait-il m'aider?
Amicalement,

Anis B.


mardi 5 septembre 2006 à 11:02:56 | Re : Probleme de Parent

Loda

Membre Club
salut, t'as posé ta question de manière très clair. bravo. Et, pour moi du moins, tu instancies correctement tes panels. Ca devrait marcher. Pourrais tu nous indiquer l'erreur (message et emplacement)? une AV? Pour contourner le problème, peut-être pourrais-tu executer ton code sur le canvas dans le formShow et non le form create. (vu que de toute façon le canevas ne serra pas visible avant et redessiner au pèremier affichage) un test qui marche chez moi (pas d'erreur au runtime): unit CanvasTest_frm; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type TPanelACESS = class (TPanel); // to access to protected .Canvas type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } pnl1, pnl2 : TPanelACESS; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var r : trect; begin pnl1 := TPanelACESS.Create(self); pnl1.Parent := self; pnl1.SetBounds(10,10,200,200); pnl2 := TPanelACESS.Create(pnl1); pnl2.Parent := pnl1; pnl2.SetBounds(10,10,100,100); r.Left := 10; r.right := 20; r.top := 10; r.bottom := 20; pnl1.Canvas.Brush.Color := clRed; pnl1.Canvas.FillRect(r); end; end. bon code,

mardi 5 septembre 2006 à 11:10:55 | Re : Probleme de Parent

anisb

Bonjour et merci pour la rapidité de ta réaction.

Le code que tu viens de poster est effectivement le cas que nous avions auparavant, et ça marchait bien.
C'est lors de l'appel d'une fonction de Canvas sur le sous panel pnl2 que ça ne fonctionnerait pas.

Voici un exemple de ce qui ne marche pas:

Form.FormCreate( Sender : TObject );
begin
   Panel1 := TMonPanel.Create( Self );
   Panel1.Parent := Self;
   Panel1.PanelCreate;
end;

TMonPanel.PanelCreate;
begin
   SousPanel := TMonSousPanel.Create( Self );
   SousPanel.Parent := Self;
   SousPanel.PanelCreate;
end;

TMonSousPanel.PanelCreate;
var
  h : integer;
begin
  h := Canvas.TextWidth('Test'); // Plantage à l'appel de cette instruction
end;


L'erreur est une violation d'accès lorsqu'on utilise les fonctions du Canvas : mais le Canvas n'est pas nil.


mardi 5 septembre 2006 à 11:56:45 | Re : Probleme de Parent

Loda

Membre Club
ho, désolé, j'ai mis pnl1 dans le test.... *sleepy* notes que si ton seul problème est des trucs genre TextWidth, tu peux appeler ces methode depuis un autre canvas. si la font est la même, t'aurras le même resultat. avec ton exemple: pnl2.Canvas.Brush.Color := clRed; pnl2.Canvas.FillRect(r); ShowMessage('[Debug] ' + inttostr(pnl2.Canvas.TextWidth('Test'))); fonctionne aussi. "21" si tu veux savoir ;-) pourrais tu essayer ce code chez toi? as-tu essayer de mettre un break point sur l'appel et de faire du "trace into"? si tu trouve ou ça crash exactement, ça pourrait aider.

mardi 5 septembre 2006 à 18:16:12 | Re : Probleme de Parent

Delphiprog

Administrateur CodeS-SourceS
Je suis d'accord avec Loda, pour une fois, la question est bien posée

Le problème ne se situerait-il pas ici ?
TMonPanel.PanelCreate;
begin
   SousPanel := TMonSousPanel.Create( Self );
   SousPanel.Parent := Self;
   SousPanel.PanelCreate;
end;


Chaque composant visuel créé sur une fiche a comme propriétaire la fiche.
Par conséquent, tout en gardant une souplesse dans le code, tu peux donc écrire :

TMonPanel.PanelCreate;
begin
   SousPanel := TMonSousPanel.Create( Self.Owner );
   SousPanel.Parent := Self;
   SousPanel.PanelCreate;
end;

Ce qui a pour effet de ne pas rendre ton composant TMonPanel dépendant d'une classe nommée TForm1.

May Delphi be with you !

Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.

mardi 5 septembre 2006 à 21:17:32 | Re : Probleme de Parent

f0xi

Membre Club Administrateur CodeS-SourceS



Deja separe les Classe TMonPanel et TMonSousPanel de l'unitée de la fiche ce serat 100 fois mieux.

Ensuite, tu devrais lister les tpanel pour pouvoir y acceder plus facilement.
Sois en utilisant une TList, sois avec les TCollection, TCollectionItem.
De plus cela faciliteras les creations/liberations, avec des fonctions Add et Delete, sans parler de l'indexation des TPanel qui faciliteras l'accés a ces derniers, comme cela on obtient un contenant principal et des objet pouvant contenir a leurs tours des objets, un peu dans l'esprit d'un TTreeView.

aprés tout depend des besoins.


Croc (click me)

mercredi 6 septembre 2006 à 09:09:15 | Re : Probleme de Parent

Loda

Membre Club
une précision: Si tu veux faire une liste de tes Instance de panel, utilise TComponentList. C'est plein de truc très pratique. Si t'as des gros besoins au niveau de la list des panels, crée une class descendant de TComponentList. Comme dit F0xi, ça dépend de tes besoins

mercredi 6 septembre 2006 à 17:16:56 | Re : Probleme de Parent

anisb

En fait il s'agit d'une erreur de ma part ... le plantage ne se situe pas au niveau du Canvas (j'ai dit qu'elle n'était pas Nil ) mais en fait parce que ces appels declenchent un évenement de Resize. Or ayant reimplémenté cette méthode pour resizer tous les composants de ce panel elle me fait planter... Voici ce qui se passe :
MonPanel.Create --> TMonSousPanel.Create dans ce create je fais appel au fonction de canvas
---> Resize Appelée (je ne sais pas pk) --> Dans Resize j'ai des opérations sur d'autres Panels et de composants non encore crées ... donc plantage

J'espère que la solution est aussi claire que la question et vous remercie pour votre aide et votre réactivité
Vive DelphiFR
   

jeudi 7 septembre 2006 à 08:56:29 | Re : Probleme de Parent

Loda

Membre Club
essai d'ajuter ça (sans garanti) CanvasResize: begin if csLoading in self.ComponentState then exit; // reste du code au pire, tu te fait ton propre flag.



Cette discussion est classé dans : form, panel, parent, owner, panels


Répondre à ce message

Sujets en rapport avec ce message

panel en canvas? [ par lupoo ] salut à tous,g un prog qui dessine une ligne elastique sur la Form, avec deux cliques de la souris, mais lorsque je rajoute un Panel, les cliques ne f défilement dans un panel [ par apoke ] Salut à tous,J'ai un panel sur ma form et j'aimerai mettre un certain nombre d'objet dans ce panel mais voilà j'ai trouvé aucun moyen pour intégré une StatusBar et largeur Panel [ par apz ] Salut,Comment, dans un StatusBar, definir la largeur des Panels selon leurs continue ?par exemple pour affichier le jour de la date, lundi n'a pas la Personnalisation de la barre de titre [ par holomina ] Bonjour à tous!Faisant mes premiers pas en delphi, j'aimerais personnaliser la barre de titre de mon application (notamment la couleur). Pour cela, j' Comment bouger un form avec un Panel [ par skrypterz ] salut !!!!Il y a une facon de faire bouger le form en cliquan sur un panel ????mon form : BorderStyle := bsNoneSkrypterZ Impossible de focaliser une fenêtre désactivée ou invisible [ par Guillemouze ] bien le bonjour, me revoila pour une question un peu bete mais je ne trouve pas de solution.j'ai une form qui contient plusieurs panels, qu'on peut as Comment faire tourner un pps (Powerpoint) à l'intérieur d'un panel d'une form delphi mais pas en plein écran ? [ par malerba ] Bonjour à tous, je voudrais savoir comment intégrer un diaporama Powerpoint dans une appli delphi de façon à ce qu'il occupe qu'une seule partie d'une [TMediaplayer] Problème d'affichage dans un PANEL sous XP ? [ par SunOf ] Bonjour à tous, Refresh d une form [ par mimimou ] Bonjour a tous,   Au lancement de mon exe, j ai un OpenDialog1 qui s execute avant la fin de l affichage de ma form principale.Comment je peux faire e


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



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
Temps d'éxécution de la page : 0,359 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.