Bonjour à tous,
En testant la création de compo visuel, je rencontre un problème que je n'avais pas en VCL.
Contexte : création à la volée d'un objet visuel comportant un bouton pour se "détruire" . 1 gridpanellayout (addrow) contenant 2 Ttext, sur le premier TText un bouton en alignement haut/droit
Le composant est hérité d'un TPanel, oui pourquoi? bah pourquoi pas...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 TTickerMeteo = class(TPanel) private GridPanelLayout1: TGridPanelLayout; TextTownName: TText; TextTempValue: TText; Button1: TButton; FTempValue: string; FTownName: string; procedure SetTownName(const Value: string); procedure SetTempValue(const Value: string); //procedure ClickButton(Sender : TObject); public constructor Create(AOwner: TComponent); override; destructor destroy();override; property TownName : string read FTownName write SetTownName; property TempValue : string read FTempValue write SetTempValue; procedure ClickButton(Sender : TObject); end;
le create :
Sur la form principal 2 panel, 1 button, le bouton associé au panel en align top et le 2ème panel en align client.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78 constructor TTickerMeteo.Create(AOwner: TComponent); var I: Integer; begin //init des objets inherited create(nil); Align := TAlignLayout.Client; Parent := TFMXObject(Aowner); //GridPanelLayout GridPanelLayout1 := TGridPanelLayout.Create(self); GridPanelLayout1.RowCollection.Clear; GridPanelLayout1.ColumnCollection.Clear; GridPanelLayout1.Margins.Left := 10; GridPanelLayout1.Margins.Top := 10; GridPanelLayout1.Margins.Right := 10; GridPanelLayout1.Margins.Bottom := 10; GridPanelLayout1.Align := TAlignLayout.Client; GridPanelLayout1.Parent := TFMXObject(AOwner); GridPanelLayout1.ExpandStyle := TGridPanelLayout.TExpandStyle.AddRows; TextTownName := TText.Create(self); TextTownName.Stretch := false; //TextCoinName.Width := 200; TextTownName.TextSettings.HorzAlign := TTextAlign.Center; TextTownName.TextSettings.VertAlign := TTextAlign.Center; TextTownName.Text := 'Town Name'; TextTownName.Align := TAlignLayout.Client; TextTempValue := TText.Create(self); TextTempValue.Stretch := false; //TextCoinValue.Width := 200; TextTempValue.TextSettings.HorzAlign := TTextAlign.Center; TextTempValue.TextSettings.VertAlign := TTextAlign.Center; TextTempValue.Text := 'Temp Value'; TextTempValue.Align := TAlignLayout.Client; //TextCoinValue.Parent := GridPanelLayout1; GridPanelLayout1.ColumnCollection.BeginUpdate; GridPanelLayout1.RowCollection.BeginUpdate; //Ajout TText with GridPanelLayout1 do begin ColumnCollection.Add; ColumnCollection.Items[0].SizeStyle := TGridPanelLayout.TSizeStyle.Percent; ColumnCollection.Items[0].Value := 100; RowCollection.Add; RowCollection.Items[0].SizeStyle := TGridPanelLayout.TSizeStyle.Percent; RowCollection.Items[0].Value := 50; RowCollection.Add; RowCollection.Items[1].SizeStyle := TGridPanelLayout.TSizeStyle.Percent; RowCollection.Items[1].Value := 50; end; TextTownName.Parent := GridPanelLayout1; TextTempValue.Parent := GridPanelLayout1; GridPanelLayout1.RowCollection.EndUpdate; GridPanelLayout1.ColumnCollection.EndUpdate; Button1 := TButton.Create(self); Button1.Align := TAlignLayout.None; Button1.Anchors := [TAnchorKind.akTop,TAnchorKind.akRight]; Button1.Size.Height := 35; Button1.Size.Width := 35; Button1.parent := TextTownName; Button1.Position.X := TextTownName.Width-35; Button1.Position.y := 0; Button1.Text := 'X'; Button1.OnClick := ClickButton; end;
Sur le click du bouton :
et la procédure ClickButton :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 tempTicker := TTickerMeteo.create(Panel2); tempTicker.Button1.OnClick := MyClick;
Voilà tout semble fonctionner, mais après avoir créé un objet puis l'avoir détruit je perd le control sur la form (déplacer la fenêtre, agrandir, réduire, fermer) pour reprendre le control il faut recliquer sur le bouton...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 self.BeginUpdate; TControl(Sender).Parent.Parent.DisposeOf; self.EndUpdate;
Merci d'avance.
Pour Info Delphi 10.4.2 / Win10 64bits
Partager