何月豪 發表於 2022-7-8 11:00:00

【Delphi 】StyleControls组件 学习笔记

<p><span style="font-size: 18px"><strong>一.TscGPButton按钮</strong></span></p>
<p>1.按钮外观基本上都在options里设置.</p>
<p>  Normal开头的属性: 按钮常态下的效果设置;</p>
<p>  HOT开头(或包含)的属性: 鼠标停在按钮上时的效果设置;</p>
<p>  Frame开头的属性: 边框设置;</p>
<p>  pressed开头(或包含)的属性: 与点击有关的效果设置;</p>
<p>  Font开头的属性: 字体效果设置;</p>
<p>  Disabled开头(或包含)的属性: 按钮失去焦点时的效果设置;</p>
<p>  Focused开头的属性:按钮获取焦点时的效果设置;</p>
<p>  带Alpha的属性: 与透明度有关,255为不透明,0为透明;</p>
<p>  shap开头的属性:设置按键的样式;</p>
<p>  <img src="https://img2022.cnblogs.com/blog/981841/202207/981841-20220707160126515-983293772.png"></p>
<p>渐变设置:</p>
<p><img src="https://img2022.cnblogs.com/blog/981841/202207/981841-20220707162653399-1361176948.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>如果按钮参与分组设置,需要设置ShapeStyle属性中的 scgpSegmentedLeft&nbsp; /&nbsp;&nbsp; scgpSegmentedRight &nbsp; /&nbsp; scgpSegmentedMiddle(可以有0个以上)</p>
<p>&nbsp;</p>
<p><img src="https://img2022.cnblogs.com/blog/981841/202207/981841-20220707160238479-1904972424.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>2.多个按钮设置了GroupIndex分组,则popupmenu属性无效.只能通过代码触发.另外,当按钮处于激活状态时,无法再次触发click指令.</p>
<p>3.如果设置了图标,spacing 可以设置图标与caption之间的距离.Layout可以设置图标展示的位置;</p>
<p><img src="https://img2022.cnblogs.com/blog/981841/202207/981841-20220707163836521-1543578733.png"></p>
<p>&nbsp;4.badge属性可以做出角标效果<img src="https://img2023.cnblogs.com/blog/981841/202212/981841-20221207150410602-1255498870.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><img src="https://img2023.cnblogs.com/blog/981841/202212/981841-20221207150243410-1455794869.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 18px"><strong>二.TscGPEdit文本输入框</strong></span></p>
<p>1.设置好ButtonImages后,可同以时设置LeftButton和RightButton,可用对应的OnLeftClick和OnRightClick进行事件处理.</p>
<p><img src="https://img2022.cnblogs.com/blog/981841/202207/981841-20220707164107326-684780817.png"></p>
<p>&nbsp;</p>
<p>如果没有设置images,也可以设置LeftButton和RightButton属性下的Kind属性,使用系统自带的图标.</p>
<p><img src="https://img2022.cnblogs.com/blog/981841/202207/981841-20220707165100367-443897106.png"></p>
<p>&nbsp;</p>
<p>&nbsp;2.如果嫌弃图标过大,可以设置以下几个属性.一般只设置 bottom 和 top 这两个属性.</p>
<p><img src="https://img2022.cnblogs.com/blog/981841/202207/981841-20220707170359734-733873559.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>3.同样的,大部分效果设置,都包含在了Options里.设置方法与按钮的设置方法大同小异</p>
<p>&nbsp;<img src="https://img2022.cnblogs.com/blog/981841/202207/981841-20220707165606137-1482110660.png"></p>
<p>&nbsp;</p>
<p>4.PrompTtext可以设置输入框的默认文本:</p>
<p><img src="https://img2022.cnblogs.com/blog/981841/202207/981841-20220707170126746-237262084.png"></p>
<p>&nbsp;</p>
<p><span style="font-size: 18px"><strong>&nbsp;5.自定义图标的方法如下:</strong></span></p>
<p><span style="font-size: 18px"><strong>1.设置TscGPEdit - ButtonImages关联图标集.</strong></span></p>
<p><span style="font-size: 18px"><strong>2.以RightButton为例,设置Kind属性为scgpebCustom</strong></span></p>
<p><span style="font-size: 18px"><strong>3.按需求,设置</strong></span></p>
<p><span style="font-size: 18px"><strong><img src="https://img2023.cnblogs.com/blog/981841/202303/981841-20230308092658802-700733298.png"></strong></span></p>
<p>&nbsp;</p>
<p><span style="font-size: 18px"><strong></strong></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-size: 18px"><strong>三.TscPasswordEdit密码框</strong></span></p>
<p>1.与TscGPEdit文本输入框差不多,但是它没有LeftButton和RightButton属性,有的只是PasswordBotton,它<span style="background-color: rgba(255, 0, 0, 1)"><strong>不能自定义图标</strong></span>.其效果是 : 临时把密文显示为明文,当鼠标左键弹起时,恢复密文状态</p>
<p><img src="https://img2022.cnblogs.com/blog/981841/202207/981841-20220707170951470-1030255432.png"></p>
<p>&nbsp;</p>
<p>效果如图:</p>
<p><img src="https://img2022.cnblogs.com/blog/981841/202207/981841-20220707171116604-993265388.png"></p>
<br>
<p>&nbsp;2.其他设置请参考TscGPEdit文本框设置</p>
<p><span style="font-size: 18px"><strong>四.TscStyledForm窗体UI类,不可见控件.作用是在标题栏上加一些按钮和tabs标签</strong></span></p>
<p><span style="background-color: rgba(255, 255, 255, 1); color: rgba(255, 0, 0, 1)">重要声明:新项目默认是windows样式,这个样式是无法体现出<span style="font-size: 18px"><strong>TscStyledForm</strong>&nbsp;</span>效果的,要在选项里,更改为非<span style="color: rgba(255, 0, 0, 1)">windows样式</span>才行(列表里随便勾几个你喜欢的)</span></p>
<p><span style="background-color: rgba(255, 0, 0, 1)"><img src="https://img2022.cnblogs.com/blog/981841/202207/981841-20220707181034329-1901733842.png"></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>1.ButtonImages设置图标集</p>
<p>ButtonFont设置字体</p>
<p>CaptionAlignment 设置标题栏 标题的对齐方式,如果使用默认的向左对齐,标题会紧随在按钮组或者标签组后面,很不美观.</p>
<p><img src="https://img2022.cnblogs.com/blog/981841/202207/981841-20220707175816398-1011675982.png"></p>
<p>&nbsp;</p>
<p>2.show设置如图,这里说一下ShowStylesMenu,勾选后,当程序运行时,可以通过右键标题栏,展现 Style --&gt; 皮肤列表 . 中给程序切换皮肤.如果你觉得不方便,请往下看第五点.</p>
<p><img src="https://img2022.cnblogs.com/blog/981841/202207/981841-20220707181920753-2068518577.png"></p>
<p>&nbsp;</p>
<p>3.Buttons: 双击弹出按钮列表.所有的按钮增删与属性设置都在这里操作.如果要动态创建按钮,记得声明<span style="color: rgba(255, 0, 0, 1)"> var b1:TscNCButtonItem;</span></p>
<p>主要设置caption,position,imageIndex,spacing这几个属性.</p>
<p><img src="https://img2022.cnblogs.com/blog/981841/202207/981841-20220707180306805-873398210.png"></p>
<p>如果你想设置按钮间的距离,可以设置</p>
<p><img src="https://img2022.cnblogs.com/blog/981841/202207/981841-20220707182915607-632501075.png"></p>
<p>&nbsp;</p>








&nbsp;效果如图:
<p>一共设置了四个按钮,其中第一个设置了PopupMenu菜单,第四个设置了右对齐,无文本.</p>








<br>
<p><img src="https://img2022.cnblogs.com/blog/981841/202207/981841-20220707180622919-1303025070.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;4.Tabs: 和Buttoms一样,双击出现列表.所有的标签增删与属性设置都在这里操作.</p>
<p>tabsPosition : 标签的对齐方式.默认是靠左对齐.如果同时设置有按钮组,则按钮组在最左,标签组紧跟在按钮组后面出现</p>
<p><span style="color: rgba(255, 0, 0, 1)"><img src="https://img2022.cnblogs.com/blog/981841/202207/981841-20220707183246079-1440883364.png"></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="color: rgba(0, 0, 0, 1)">tab的属性设置非常简单:</span></p>
<p><span style="color: rgba(0, 0, 0, 1)">如果有多个标签,可以设置统一的width性,不然会出现宽度不一致的情况</span></p>
<p>&nbsp;</p>
<p><span style="color: rgba(255, 0, 0, 1)"><span style="color: rgba(255, 0, 0, 1)"><img src="https://img2022.cnblogs.com/blog/981841/202207/981841-20220707183855421-1504714237.png"></span></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="color: rgba(255, 0, 0, 1)"><span style="color: rgba(255, 0, 0, 1)">效果图:<br></span></span></p>
<p><span style="color: rgba(255, 0, 0, 1)"><span style="color: rgba(255, 0, 0, 1)"><span style="color: rgba(0, 0, 0, 1)"><img src="https://img2022.cnblogs.com/blog/981841/202207/981841-20220707183812629-2001843970.png"></span></span></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>动态创建标签:</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
t1: TscNCTabItem;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
t1 :</span>=<span style="color: rgba(0, 0, 0, 1)"> scstyldfrm1.Tabs.Add;
t1.Caption :</span>= <span style="color: rgba(128, 0, 0, 1)">'</span>Sheet<span style="color: rgba(128, 0, 0, 1)">' + IntToStr(<span style="color: rgba(0, 0, 0, 1)">scstyldfrm1.Tabs</span>.Count)</span><span style="color: rgba(0, 0, 0, 1)">;
t1.Width :</span>= <span style="color: rgba(128, 0, 128, 1)">60</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span>;</pre>
</div>
<p>5.接下来这个特效很酷:让父级窗体显示为毛玻璃透明模式(<span style="color: rgba(0, 0, 0, 1)">ShowModal</span>模式下)</p>
<p>新建一个窗体form2,设置为可用窗体.</p>
<p><img src="https://img2022.cnblogs.com/blog/981841/202207/981841-20220707190446787-512596537.png"></p>
<p>&nbsp;</p>
<p>form1里加个按钮,加事件.</p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">uses unit2;<br>procedure</span><span style="color: rgba(0, 0, 0, 1)"> TForm1.btn4Click(Sender: TObject);
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
form2 :</span>= TForm2.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">(self);
scstyldfrm1.ShowClientInActiveEffect;    //<span style="color: rgba(255, 0, 0, 1)">这里是重点.要在窗体显示前,设置特效</span>
Form2.ShowModal;
scstyldfrm1.HideClientInActiveEffect;    //<span style="color: rgba(255, 0, 0, 1)">窗体显示后,隐藏特效</span><br> Form2.free;
</span><span style="color: rgba(0, 0, 255, 1)">end</span>;</pre>
</div>
<p>TscStyledForm中的 InActiveClienColor属性,用来设置特效颜色.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;效果如图:</p>
<p><img src="https://img2022.cnblogs.com/blog/981841/202207/981841-20220708085830328-1496051188.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;五.TscCombobox.做一个可以更改皮肤的下拉框.<span style="color: rgba(255, 0, 0, 1)">这个功能,用系统自带的控件就可以实现,不是非得要用第三方.</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">uses Vcl.Themes;  //皮肤单元<br>procedure</span><span style="color: rgba(0, 0, 0, 1)"> TForm1.FormCreate(Sender: TObject);
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
i: Integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 0, 255, 1)">for</span> i := Low(TStyleManager.StyleNames) <span style="color: rgba(0, 0, 255, 1)">to</span> High(TStyleManager.StyleNames) <span style="color: rgba(0, 0, 255, 1)">do    //TStyleManager样式管理器,不用声明.TStyleManager.StyleNames 返回一个皮肤数组.</span><span style="color: rgba(0, 0, 0, 1)">
    scGPComboBox1.ListBox.Add(TStyleManager.StyleNames);
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TForm1.scGPComboBox1Change(Sender: TObject);
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
TStyleManager.TrySetStyle(scGPComboBox1.Items.Caption );    //<span style="color: rgba(0, 0, 0, 1)">TrySetStyle</span>:设置皮肤
</span><span style="color: rgba(0, 0, 255, 1)">end</span>;</pre>
</div>
<p>效果如图:</p>
<p><img src="https://img2022.cnblogs.com/blog/981841/202207/981841-20220708105900185-1968884227.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;六.TscGPPageControl</p>
<p>1.在TscGPPageControl 控件空白处右键,可新增和删除标签.也可以双击tabs属性,调出tab管理器进行设置.</p>
<p>2.切换页面 : scGPPageControl1.ActivePage := 直接写页面Name;</p>
<p>3.TscGPPageControl全局设置,大部分在TabOption里进行,还有很多个性化的设置,你可以慢慢去摸索.这里有个技巧:</p>
<p>先确定你需要的样式是全局的属性,还是标签里的属性,如果是全局,就找tabOption,标签就找tabs -&gt; page</p>
<p><img src="https://img2022.cnblogs.com/blog/981841/202207/981841-20220708162202464-2036417377.png"></p>
<p>4.如何隐藏TscGPPageControl控件的标签头?分两步来:</p>
<p>  1.设置FrameWidth为0</p>
<p><img src="https://img2023.cnblogs.com/blog/981841/202302/981841-20230218171703087-1243231266.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>  2.设置TabHeight为0.完成!</p>
<p><img src="https://img2023.cnblogs.com/blog/981841/202302/981841-20230218171749079-1388156683.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>3.动态创建标签(基于Frame)</p>
<p>在此之前,请先了解一下Frame的Create原理&nbsp; 后半部分</p>
<p>先看运行图:</p>
<p><img src="https://img2022.cnblogs.com/blog/981841/202207/981841-20220728104552153-312141705.png"></p>
<p>&nbsp;</p>
<p>&nbsp;主窗体设计图:</p>
<p><img src="https://img2022.cnblogs.com/blog/981841/202207/981841-20220728104659024-1330645947.png"></p>
<p>&nbsp;</p>
<p>Frame设计图:</p>
<p>&nbsp;<img src="https://img2022.cnblogs.com/blog/981841/202207/981841-20220728105855774-976557137.png"></p>
<p>&nbsp;</p>
<p>&nbsp;下面是Frame的代码:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">unit</span><span style="color: rgba(0, 0, 0, 1)"> Unit6;

</span><span style="color: rgba(0, 0, 255, 1)">interface</span>

<span style="color: rgba(0, 0, 255, 1)">uses</span><span style="color: rgba(0, 0, 0, 1)">
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
Vcl.StdCtrls, scControls, scGPControls;

</span><span style="color: rgba(0, 0, 255, 1)">type</span><span style="color: rgba(0, 0, 0, 1)">
TFrame6 </span>= <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">(TFrame)
    scGPPanel1: TscGPPanel;
    Button1: TButton;
</span><span style="color: rgba(0, 0, 255, 1)">private</span>
    <span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> Private declarations </span><span style="color: rgba(0, 128, 0, 1)">}</span>
<span style="color: rgba(0, 0, 255, 1)">public</span>
    <span style="color: rgba(0, 0, 255, 1)">constructor</span> <span style="color: rgba(0, 0, 255, 1)">Create</span>(AOwner: TComponent); <span style="color: rgba(0, 0, 255, 1)">override</span>;    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">上面链接有介绍Frame的Create原理&nbsp; </span>
<span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">implementation</span>

<span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)">$R *.dfm</span><span style="color: rgba(0, 128, 0, 1)">}</span>
<span style="color: rgba(0, 0, 255, 1)">uses</span><span style="color: rgba(0, 0, 0, 1)">
Unit5;    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">引用主窗体</span>

<span style="color: rgba(0, 0, 255, 1)">constructor</span> TFrame6.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">(AOwner: TComponent);
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 0, 255, 1)">inherited</span> <span style="color: rgba(0, 0, 255, 1)">Create</span>(AOwner);    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">上面链接有介绍Frame的Create原理&nbsp; </span>
Self.Align := alClient;   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">如果没有这一句,frame嵌进去之后,会保持原有大小.</span>
Button1.Caption := <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Frame</span><span style="color: rgba(128, 0, 0, 1)">'</span> + inttostr(Length(ArrayFrames) + <span style="color: rgba(128, 0, 128, 1)">1</span>);   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">修改Btn属性</span>
<span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">end</span>.</pre>
</div>
<p>主窗体的代码:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">unit</span><span style="color: rgba(0, 0, 0, 1)"> Unit5;

</span><span style="color: rgba(0, 0, 255, 1)">interface</span>

<span style="color: rgba(0, 0, 255, 1)">uses</span><span style="color: rgba(0, 0, 0, 1)">
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,<br>&nbsp; System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,<br>&nbsp; Vcl.StdCtrls, scControls, scGPPagers, Unit6, cxGraphics, cxControls,<br>&nbsp; cxLookAndFeels, cxLookAndFeelPainters, cxStyles, cxEdit, cxInplaceContainer,<br>&nbsp; cxVGrid, cxOI;

</span><span style="color: rgba(0, 0, 255, 1)">type</span><span style="color: rgba(0, 0, 0, 1)">
TArrayFrames </span>= <span style="color: rgba(0, 0, 255, 1)">array</span> <span style="color: rgba(0, 0, 255, 1)">of</span> TFrame;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">设置动态数组的数据类型</span>
<span style="color: rgba(0, 0, 0, 1)">
TForm5 </span>= <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">(TForm)
    scGPPageControl1: TscGPPageControl;
    sheet1: TscGPPageControlPage;
    Button1: TButton;
    Memo1: TMemo;
    Frame61: TFrame6;
    Label1: TLabel;
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> Button1Click(Sender: TObject);
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span> scGPPageControl1Close(Sender: TObject; <span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)"> CanClose: Boolean);
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> FormCreate(Sender: TObject);
    </span><span style="color: rgba(0, 0, 255, 1)">procedure</span> DeleteArrItem(<span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)"> arr: TArrayFrames; Index: Integer);
</span><span style="color: rgba(0, 0, 255, 1)">private</span>
    <span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)"> Private declarations </span><span style="color: rgba(0, 128, 0, 1)">}</span>
<span style="color: rgba(0, 0, 255, 1)">public</span>
<span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
Form5: TForm5;
ArrayFrames: TArrayFrames;</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">全局数组</span>

<span style="color: rgba(0, 0, 255, 1)">implementation</span>

<span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)">$R *.dfm</span><span style="color: rgba(0, 128, 0, 1)">}</span>


<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建新标签</span>
<span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TForm5.Button1Click(Sender: TObject);
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
NewTap: TscGPPageControlTab;
NewFrame: TFrame6;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span>
<span style="color: rgba(0, 0, 255, 1)">with</span> scGPPageControl1 <span style="color: rgba(0, 0, 255, 1)">do</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    NewTap :</span>= Tabs.Add;       <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">新增标签</span>
    NewTap.Caption := <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">sheet</span><span style="color: rgba(128, 0, 0, 1)">'</span> + Tabs.Count.ToString; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">设置标签名称</span>
<span style="color: rgba(0, 0, 0, 1)">
    NewFrame :</span>= TFrame6.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">(scGPPageControl1);
   </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">设置Frame名称,这里一定要写,因为它每次新增都默认是Frame的Name, 会报错</span>
    NewFrame.Name := <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Frame</span><span style="color: rgba(128, 0, 0, 1)">'</span> +<span style="color: rgba(0, 0, 0, 1)"> IntToStr(NewFrame.Handle);
    NewFrame.Parent :</span>= NewTap.Page; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">把frame嵌进标签里</span>
    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">把 NewFrame记录进数组里,当关闭标签时,从数组里取出,并free.数组的Index值与标签的index值相同</span>
    SetLength(ArrayFrames, Length(ArrayFrames) + <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
    ArrayFrames :=<span style="color: rgba(0, 0, 0, 1)"> NewFrame;
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">监测数组</span>
    Memo1.Lines.Add(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">ArrayFrames增加:</span><span style="color: rgba(128, 0, 0, 1)">'</span> +<span style="color: rgba(0, 0, 0, 1)"> Length(ArrayFrames).ToString);
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">procedure</span> TForm5.DeleteArrItem(<span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)"> arr: TArrayFrames; Index: Integer);
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
len: Integer;
tempFrame: TFrame;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
len :</span>=<span style="color: rgba(0, 0, 0, 1)"> Length(arr);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">不用考虑 Index =1 ,因为不能删除</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> Index = len <span style="color: rgba(0, 0, 255, 1)">then</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    SetLength(arr, len </span>- <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
    Exit;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">其它情况</span>
tempFrame := arr;
tempFrame.Free;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">把将要删除的元素移到最后,然后重新设置它的长度,以实现删除的目的</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">关于Move与sizeOf请看下面聊天记录</span>
Move(arr, arr, (len - Index) * SizeOf(arr[<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">]));
SetLength(arr, len </span>- <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);

</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TForm5.FormCreate(Sender: TObject);
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
setLength(ArrayFrames, </span><span style="color: rgba(128, 0, 128, 1)">1</span>);   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">自带一个主页且不能删除</span>
ArrayFrames[<span style="color: rgba(128, 0, 128, 1)">0</span>] := Frame61;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">把主页加进数组</span>
<span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;


</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">标签的关闭事件</span>
<span style="color: rgba(0, 0, 255, 1)">procedure</span> TForm5.scGPPageControl1Close(Sender: TObject; <span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)"> CanClose: Boolean);
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
i, j: integer;
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
CanClose :</span>= False;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">设置成False才能删除</span>
<span style="color: rgba(0, 0, 255, 1)">with</span> scGPPageControl1 <span style="color: rgba(0, 0, 255, 1)">do</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
    i :</span>=<span style="color: rgba(0, 0, 0, 1)"> GetPageIndex(ActivePage);
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">删除元素半释放free</span>
    DeleteArrItem(ArrayFrames, i + <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">监测数组</span>
    Memo1.Lines.Add(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">ArrayFrames删除:</span><span style="color: rgba(128, 0, 0, 1)">'</span> +<span style="color: rgba(0, 0, 0, 1)"> Length(ArrayFrames).ToString);
    tabs.Delete(i);    </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">删除标签</span>
    FindPriorTab;    <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">激活上一个标签</span>
<span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;

</span><span style="color: rgba(0, 0, 255, 1)">end</span>.</pre>
</div>
<p>&nbsp;</p>
<p>关于move函数与sizeOf函数,感谢群里大佬的指点:</p>
<p><img src="https://img2022.cnblogs.com/blog/981841/202207/981841-20220728112121870-1678273212.png"></p>
<p>&nbsp;</p>
<p><img src="https://img2022.cnblogs.com/blog/981841/202207/981841-20220728112245805-1830891694.png"></p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/yoooos/p/16457540.html
頁: [1]
查看完整版本: 【Delphi 】StyleControls组件 学习笔记