ListBox
ComboBox构件
Label构件
按钮VCL
BitBTn构件
SpeedButton构件
单选钮与复选框
ScrollBar构件
File Open
File Save对话框
Color对话框
Find和Replace
ListBox和ComboBox构件的用途很广的构件。表示标准Windows列表框,用户可以从它的选项清单中选择选项。假如列表框中的项目太多,无法一次显示完,则会出现滚动条,以便访问列表框中的其它项目。新术语 有些列表框是所有者绘制的列表框。在所有者绘制的列表框中,编程人员要负责绘制列表框中的项目。假如需要,可以生成所有者绘制的列表框。所有者绘制的列表框很常见,只是你不一定熟悉到了而已。介绍定制C++ Builder工具条,其中介绍了C++ Builder工具条编辑器对话框,其中包含两个列表框,左边的列表框是普通列表框,列出可以选择的按钮组,而右边的列表框则是个所有者绘制的列表框,显示工具条上会显示的实际按钮和按钮功能的文字说明。组合框是个专门列表框。实际上,组合框是列表框与编辑控件的组合。用户可以在列表框中选择,也可以在编辑部分输入数值。用户在列表框中选择时,该项目即放在编辑控件中。组合框有三种,具体类型取决于Style属性。表8.5列出了组合框类型及其说明。合框类型项目说明Simple只是在列表框上面放一个编辑控件。用户可以在列表框中选择,也可以在编辑部分输入数值Drop-down类似于简单样式,只是列表框部分最初不显示,而是提供一个下拉按钮,让用户浏览清单和选择选项。用户也可以在编辑部分输入数值Drop-down list这种组合框限制更多。和下拉样式一样,列表框部分最初不显示。用户可以单击下拉按钮浏览清单和选择选项,但不能在编辑部分输入文本。用这个样式时只能在预定选项中选择图8.4显示了ComboBox测试程序运行的情况,从中可以体会每种组合框的特点。
ColumnsListBox包含列表框中的列数,让这个属性大于1可以生成多列。缺省为0ExtendedSelectionListBox确定是否答应扩展选择。扩展选择使用户能用Shift+单击和Ctrl+单击选择项目。MultiSelect设置为false时无效。缺省为true
IntegralHeightListBox设置为true时,调整列表框高度以确保显示部分行。设置为false时列表框可以显示部分行。缺省为falseItemHeight两者设置控件中项目的高度。用户所有者绘制的列表框和组合框。缺省为13Items两者包含列表框中的项目表,是个TStrings实例(具体属性和方法见本章前面介绍TStrings的部分)MaxLengthComboBox用户可以在组合框编辑部分输入的最大字符数。同于编辑控件的MaxLength。缺省为0(无限)MultiSelectListBox设置为true时,列表框中可以选择多个项目。缺省为falseSorted两者设置为true时,列表框项目按升序排列,设置为false时不排序缺省为false
StyleComboBox提供组合框的样式选项:
Cssimple,
csDropDown
csDropDownList,
lbOwnderDrawFixed,
csOwnerDrawVariable,缺省为csDropDownListBox提供列表框的样式选项:lbStandard,lbOwnderDrawFixed,和csOwnerDrawVariable,缺省为lbStandardTabWidthListBox设置列表框中标签的宽度(像素),缺省为0TextComboBox包含组合框编辑部分的文本。运行属性ItemIndexListBox包含当前所选项目的索引,0和第一个项目,1表示不选项目。写入时,选择指定的索引SelCountListBox包含多项选择列表框中选择的项目个数SelectedListBox选择指定项目时返回true,否则返回falseSelLengthComboBox包含组合框编辑部分当前所选文本的长度SelStartComboBox包含组合框编辑部分当前所选文本的起点,编辑控件中第一个字符为0SelTextComboBox包含编辑控件中当前所选文本TopIndexListBox返回列表框顶部的项目,可以将顶部项目设置为某个列表框项目和前面介绍的编辑构件一样,列表框与组合框的方法不多。Clear()方法清
除控件的所有数据,ItemAtPos()方法返回指定x、y坐标处的列表框项目,SelectAll()方法选择组合框编辑部分的文本。列表框与组合框中最常用的事件是OnClick事件,可以确定列表框中何时进行了选择。说明 单击组合框编辑部分或下拉按钮不会触发OnClick事件,只有单击组合框的列表部分时才会触发OnClick事件。OnChange事件可以和编辑控件中一样触发组合框编辑部分的变化。OnDropDown事件检测是否单击了组合框下拉按钮。OnMeasureItem和OnDrawItem事件用于所有者绘制的列表框和所有者绘制的组合框。
按钮VCL包含几个可以在应用程序中运用的按钮,尽管它们不全是基于标准Windows按钮控件,但都放在这里介绍。介绍具体按钮构件之前,先要介绍一些基本知识。说明 设置按钮的Caption属性时,象设置菜单项目的Caption属性一样使用和号(&),和号后面的字符会加上下划线,可以作为按钮的加速键。
况下,ModalResult属性设置为mrNone(即0)。这个值用于窗体上的普通按钮,不关闭窗体。假如ModalResult属性使用非0值,则按下按钮时窗体关闭,并返回ModalResult属性值。例如,假如将按钮放在窗体上并将ModalResult属性设置为mrOK,则按下按钮时窗体关闭,并返回ModalResult属性值mrOK(1)。这样就可以编制下列代码:
int result = MyForm>ShowModal();
if (result == mrOK) DoSomething();
if (result == mrCancel) return;
mrNone0mrOk1
mrCance2
mrAbort3mrRetry4
mrIgnore5
mrYes6
mrNo7
mrAll8
mrNoToAll9
mrYesToAll10说明 按钮不一定要使用预定义ModalResult属性常量,也可以用其它数值。例如,假设有个自定义对话框可以用各种按钮关闭,则可以对每个按钮赋予不同的ModalResult值(例如100、150、200),然后就知道是哪个按钮关闭了对话框。任何非0的值都有效,只要不超过int的取值范围。DefaultDefault属性是按钮的另一重要属性。Windows具有处理对话框的标准机制,其中一个特点如下:假如焦点在按钮以外的控件上而用户按键盘上的Enter键,则对话框的表现和用户单击缺省按钮时一样,缺省按钮就是设置了BS_DEFPUSHBUTTON样式的按钮(通常是OK按钮)。这个特性是编程人员的克星,数据输入人员抱怨已久。Default属性可以将窗体上的一个按钮设置为缺省按钮。这个属性的缺省值为false。为了将窗体上的一个按钮设置为缺省按钮,将其Default属性设置为true。假如不将任何按钮的Default属性设置为true,则用户按Enter键时窗体不关闭。说明 用户按Enter键关闭窗体时,先调用缺省按钮(如有)的OnClick处理器再关闭窗体。
Cancel属性与Esc键配合,就象Default属性与Enter键配合。用户按Esc键关闭窗体时,ShowModal()返回值为Cancel属性设置为true的按钮的ModaResult值。假如没有按钮的Cancel属性设置为true,则用户按Esc关闭窗体时返回mrCancel。说明 单击系统关闭框或按Alt+F4关闭窗体时ShowModal()也会返回mrCancel。但按Esc键时ShowModal()返回值为Cancel属性设置为true的按钮的ModaResult值,先调用Cancel按钮的OnClick处理器再关闭窗体。假如用户单击系统关闭框或按Alt+F4关闭窗体,则不调用OnClick处理器。必须考虑用户使用窗体的不同方法。说明 多个按钮的Default属性可以设置为true,同样,多个按钮的Cancel属性也可以设置为true。但是,用户按键盘上的Enter键时,调用Default属性设置为true的按钮中跳表顺序为最先的按钮,同样,用户按键盘上的Esc键时,ShowModal()返回Cancel属性设置为true的按钮中跳表顺序为最先的按钮的ModalResult值。Enabled前面介绍一般构件时曾介绍过Enabled属性。这个属性用于根据程序当前状态或特定窗体当前状态打开或关掉按钮。按钮关掉时,Enabled属性设置为false,按钮不起作用,上面的文字变灰,对于带位图的按钮,位图也自动变灰。Button构件只有一个有趣的方法:Click()方法,模拟鼠标单击调用按钮的Click()方法时,就象单击按钮时一样,执行按钮的OnClick事件。和事件一样,通常只用OnClick事件。下面要介绍C++ Builder提供的各种按钮构件。Button构件8.6.4Button构件标准Button构件并不漂亮,但做了大量工作。标准Button构件自身已很完备,缺省Height属性值为25像素,缺省Width属性值为75像素。通常只要将按钮放在窗体上并响应其OnClick事件即可。
BitBtn构件BitBtn构件是扩展构件以增加功能的范例。这里扩展标准Button构件以便在按钮表面上显示位图。BitBtn构件比Button构件多几个属性,这些属性共同治理按钮上的位图和位图与按钮文本之间的布置,将在下面几节介绍。GlyphGlyph属性表示按钮上的位图,其数值是一个图形。新术语 Glyph图形通常是Windows位图文件(.BMP)。Glyph本身由一个或几个位图构成,表示按钮的四种状态:起、落、关掉和按住。假如生成自己的按钮,可能只要提供一个Glyph,然后由BitBtn构件修改成表示另外三种状态。单击按钮时,位图向右下方移动;关掉按钮时,位图变灰。按下状态的位图与平常一样,只是按钮表面变成按下状态。假如提供多个位图,则每个位图的高度和宽度应相同,并包含在位图带中。C++ Builder所带的位图提供了两个Glyph。
SpeedButton构件SpeedButton构件和Panel构件一起用于建立工具条,它与Button和BitBtn构件不同,不是窗口化构件,即不能跳表也不能接受输入焦点。另一方面,SpeedButton构件又与BitBtn构件有一些共同之处,例如Glyph属性的处理方式在SpeedButton构件中和BitBtn构件中完全一样,这里不再一一重述。但这里要介绍它们间的两个主要差别。缺省情况下,快速按钮是方形的,是25×25像素。快速按钮可以取任何尺寸,也可以包含文本,但通常不包含文本。快速按钮有一些特定的属性,将在下面几节一一介绍。说明 C++ Builder 1.0中生成工具条的方法用Panel构件并在上面放各种构件(主要是SpeedButton构件)。C++ Builder 3.0提供了Toolbar构件,能更好地生成工具条。Toolbar构件有一些优点,但用起来更复杂。GroupIndex快速按钮可以组合成象单选钮一样(单选钮框”中介绍)。按下组中一个按钮时,它保持按下状态,原先按下的按钮弹起来。为了组合快速按钮,只要对组中所有按钮赋予相同GroupIndex属性值(缺省值为0,表示不在组中)。试举例如下:1. 生成空白窗体并在窗体上放五个快速按钮(我不想在这个简单例子中放上按钮位图,但读者也可以这么干)。2. .选择所有按钮并将GroupIndex属性值变为1,这样所有按钮的GroupIndex属性都变成1。3. 可选:将一个按钮的Down属性变为true。4. 单击Run按钮编译和运行程序。程序运行时,单击几个按钮。注重一次只有一个按钮显示按下状态。GroupIndex属性赋予非0值时,可以看出快速按钮的表现有所改变。GroupIndex属性值为0的按钮单击时会弹回,而快速按钮组中的快速按钮单击时保持按下状态。AllowAllUp缺省情况下,组中随时要有一个按钮处于按下状态,但也可以将AllowAllUp属性设置为true以改变这点,将一个按钮的AllowAllUp属性设置为true时,组中所有按钮的AllowAllUp属性设置为true。这样就可以选择组中一个按钮或一个都不选。
GroupIndex属性一定要用窗体上其它构件不用的值。用户单击按钮时,它保持按下状态,再次单击时,它弹起来。Down读取Down属性时,假如按钮保持按下状态则返回true,否则返回false。写入Down属性时,可以在按钮按与不按之间拔动。假如快速按钮不是组中成员,则写入Down属性无效果。
单选钮与复选框尽管单选钮与复选框是专门的按钮,但最终还是按钮。这里不想花大量时间介绍这些构件,因为它们很轻易实现。RadioButton和CheckBox构件都有个Checked属性,可以设置核选状态和读取当前核选状态。单选钮通常用在按钮组中,通常表示选项组中一次只能选择一个选项(如前面介绍的快速按钮组)。尽管单选钮可以单独使用,但通常不提倡这么用,以免让用户费解。想把单选钮单独使用时,应当改用复选框。窗体上的任何按钮均被自动当作同一组中的一部分。假如有多组单选钮,每组需要独立操作,则应当使用RadioGroup构件。这个按钮可以在一组单选钮四周加上三维帧和标题,建立单选钮组。试举例说明如下:1. 生成空白窗体或用上一练习中生成的窗体,放上一个RadioGroup构件。2. 找到Items属性并双击Value列。3.出现字串清单编辑器,在字串清单编辑器中输入下列语句:Redtailed Hawk Peregrine FalconGyrfalconNorthern Goshawk4.单击OK关闭字串清单编辑器。组框中产生包含所输入文本的单选钮。5.将单选钮组的Caption属性变为Apprentice Falconers Can Legally Posses:6.单击Run编译和运行程序。单击一个单选钮时,前面选择的按钮如期弹出。利用RadioGroup构件可以在一个窗体上放多组单选钮。和前面介绍的列表框与组合框一样,RadioGroup构件也有ItemIndex属性,可以在运行时用于确定组中选择了哪个项目。说明 也可以用GroupBox构件放单选钮,GroupBox构件不如RadioGroup构件方便,但更加灵活。组框中可以放任何类型的控件。放在组框中的控件和组框本身可以在设计时作为一个单元移动。CheckBox构件可以打开和关掉选项或向用户表示项目当前打开或关掉。复选框最多有三种状态:打开、关掉和变灰。假如复选框的AllowGrayed属性设置为false,则只能复选或不选,而AllowGrayed属性设置为true时则可以取三种状态中任何一种。变灰状态是由程序处理的。换句话说,你可以确定应用程序中变灰的含义。假如AllowGrayed属性为false(缺省),则可以用Cheched属性确定复选框是否核选。AllowGrayed属性为true,则要用State属性确定或设置复选框状态。这个属性的取值为cbChecked、cbUnckecked和cbGrayed。提示 有时要用复选框表示某个特性的开关状态而又不能让用户单击复选框改变其开关状态,这时复选框要关掉而又正常显示。为了让复选框不变灰而又只能读取,要放上一个面板,并将面板的Enabled属性变为false
Label构件Label构件显示窗体上的文本。有时标题文本在设计时确定,此后不再改变,而有时则会在运行时动态改变。利用标题的Caption属性可以在运行时改变标题文本。Label构件没有专门的方法和事件。表8.8列出了Label构件特有的属性。表8.8Label构件特有的属性属性说明AutoSize设置为true时,标题根据Caption属性中包含的文本调整尺寸。设置为false时,文本在标题右边剪取FocusControl标题为非窗口化构件,所以无法跳表和接受输入焦点。但有时标题是编辑控件等控件中的文本,这时可以给标题指定和速符(用和号&),然后将FocusControl属性变为按标题加速键时要接受输入焦点的控件名ShowAccelChar设置为true时,显示标题中的实际和号,而不是把和号作为加速键Transparent这个属性设置为true时,Color属性忽略,显示标题底下的一切,例如可用于将标题放在位图背景中WordWrap这个属性设置为true时,标题中的文本到达标题边沿时会换到新行中
ScrollBar构件ScrollBar构件表示独立滚动条,即不与编辑控件、列表框、窗体等相联系。我很少用到独立滚动条,有些应用程序可能大量使用独立滚动条,但日常应用程序中用得不多。ScrollBar构件的性能通过Min、Max、Large Change和SmallChange属性设置,滚动条位置可以通过Position属性取得。Kind属性可以指定垂直或水平滚动条。
公用对话框在构件板的Dialogs标签中,这些构件不是可视构件,因为没有图形设计接口。下面几节介绍这些公用对话框,但Print和Printer Setup对话框要留到后面介绍打印时再介绍。
8.8.1Execute方法公用对话框的一个共同之处是都有Execute方法,用于生成和显示对话框。Find和Replace对话框是无模态对话框,其余都是模态对话框。用户单击OK按钮、双击文件名(对于文件对话框)或按键盘上的Enter键时,Execute方法返回true。用户单击Cancel按钮、按Esc键或用系统关闭框关闭对话框时,Execute方法返回false。公用对话框通常实现如下:if(OpenDialog>Execute()) { // user pressed OK so use the filenameMemo>Lines>LoadFromFile(OpenDialog>FileName);}return;这个代码显示File Open对话框并向用户请求文件名。假如用户单击OK按钮,则执行if块内的代码,文件装入Memo构件。假如不按OK按钮,则忽略if块内的代码,不发生动作。说明 上例中的代码是C++快捷语法的又一个例子。第一行:if(OpenDialog>Execute()) {等于if(OpenDialog>Execute() == true) {两种方法都可以,但第一种更好。
File Open和File Save对话框File Open和File Save对话框有几个共同属性。File Open对话框让用户打开应用程序中的文件,包装成OpenDialog构件。File Save对话框用于从用户那里取得文件名以保存文件,也用作Save As对话框。File Save对话框包装成SaveDialog构件。
DefaultExt属性DefaultExt属性设置对话框使用的缺省扩展名。缺省扩展名是用户不提供扩展名时自动添加到文件名后面的扩展名。FileName属性FileName属性是最明显的文件对话框属性,用于放用户所选文件的文本。假如文件对话框初始显示时要让文件名出现在文件对话框的编辑部分,则要在调用文件对话框时先设置这个属性。用户单击OK关闭文件对话框后,这个属性中包含所选文件的完整路径和文件名。Files属性Files属性是只读属性,是启用多文件选择时包含所选文件清单的TStrings实例。Filter属性Filter属性包含一列用户可以选择的文件类型清单。文件类型放在文件对话框的File of type:组合框中。可以设置Filter属性以反映应用程序所针对的文件类型。例如,简单文字编辑程序的过滤器可以设置成显示文件类型.TXT、.INI和.LOG等。过滤器可以在设计时通过Filter Editor对话框设置。为了打开FilterEditor对话框,双击对象观察器FIlter属性旁边的Value列。Filter Name列中包含文件类型的文本说明,Filter列中是用于显示该类型文件的实际文件掩膜。尽管可以直接在对象观察器Value列中输入过滤器字串,但使用Filter Editor对话框更方便。假如只用一个过滤器,则可以直接在value列中输入Filter属性,说明和过滤器之间管道分开。例如,为了用一个过滤器对付所有文件类型,可以输入如下过滤器:All Files (*.*) *.*FilterIndex属性FilterIndex属性设置对话框初始显示时使用的过滤器,但索引不是以0为基数,而是从1开始。InitialDir属性InitialDir属性指定文件对话框显示时作为初始目录的目录。假如没有指定InitialDir属性值,则采用Windows确定的当前目录。提示 一流的Windows程序能跟踪打开文件和保存文件时使用的目录。这个信息通常放在注册表中。显示File Open或File Save对话框之前,将InitialDir属性设置为用户上次使用的目录。用户选择文件之后,可以更新注册表以反映新的目录。
Options属性Options属性控制使用文件对话框的方法。选项很多,最常见的有是否答应生成新文件或目录、对话框中是否显示Help按钮、是否答应长文件名、是否答应选择多个文件,等等。详见C++ Builder中关于OpenDialog和SaveDialog构件的联机帮助。Title属性Title属性设置或读取文件对话框的标题。不指定标题时,OpenDialog缺省用Open,SaveDialog构件缺省用Save。提示 Save As对话框就是Title属性设置为Save As的SaveDialog构件。文件对话框没有相关联的事件。提示 也可以不放OpenDialog构件到窗体上而在运行时实现File Open对话框或其它公用对话框。为此,生成TOpenDialog类的实例,然后调用Exeate方法:TOpenDialog* openDlg = new TOpenDialog(this);if (openDlg>Execute()) {// do something here}delete openDlg;假如需要,还可以在调用Execute之前设置OpenDialog构件的属性。
File Open Picture和File Save Picture对话框这两个对话框是在File Open和File Save对话框中增加了一个特性,用预览窗口显示当前所选的图形。这些对话框也有Filter属性,预设成常用Windows图形格式,此外,它们与File Open和File Save对话框完全一样。 Color对话框Color对话框可以用于选择颜色。单击OK按钮时,Color属性会包含颜色信息。Color对话框和文件对话框一样,没有要响应的事件。
Font对话框Font对话框让用户从系统提供的字体清单中选择字体。通过Device属性可以选择要屏幕字体、打印字体还是两者都显示。通过修改MaxFontSize和MinFontSize属性可以限定用户可选的最大和最小字体尺寸。和文件对话框一样,Options属性包含各种控制Font对话框功能的选项。假如用户单击OK,则Font属性包含实现新字体所要的全部信息。Font对话框有个OnApply事件,在用户单击Font对话框的Apply按钮时触发。必须生成OnApply事件在有效事件处理器之后,Font对话框中才会显示Apply按钮。
Find和Replace对话框Find和Replace对话框让用户输入搜索文本和替换文本,并提供了各种搜索和替换选项。Find对话框包装在FindDialog构件中,Replace对话框包装在ReplaceDialog构件中。Replace对话框具有Find对话框的一切,并增加了替换功能。FindDialog和ReplaceDialog构件的主要属性有FindText(要找的文本)、ReplaceText(要替换成的文本)和Options。显然,FindDialog构件不会有ReplaceText属性。Options属性包含单击Find Next、Teplace或Replace All按钮时用户设置的各种选项信息。FindDialog和ReplaceDialog构件的Execute()方法与其它Dialog构件稍有不同。首先,Find和Replace对话框是无模态对话框,只要对话框显示,Execute()方法就返回。由于这些对话框是无模态对话框,所以Execute()方法的返回值没有意义(总是true)。这些对话框用OnFind、OnReplace事件和Options属性确定对话框中发生的情况。OnFind事件在单击Find Next时发生,ReplaceDialog构件有OnFind事件,但也有OnReplace事件,在单击Replace或Replace All按钮时发生。利用这些事件可以确定用户何时请求了寻找或替换动作。程序应读取Options属性以确定用户希望如何进行寻找或替换动作。