按一下按钮,在网页中加一行文字,怎样做?

bmzhao 2006-03-08 08:50:56
按一下按钮,在网页中加一行文字,怎样做?
我是初学者,代码越短越好。
今日结贴。
...全文
156 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
SuperBJack 2006-03-08
  • 打赏
  • 举报
回复
<table width="600" border="1" align="center" cellpadding="0" cellspacing="0" bordercolorlight="#FFFFFF" bordercolordark="#000000" id="tab1">
<tr bgcolor="#000099">
<td width="57" height="25"> <div align="center"><font color="#FFFFFF"><strong>aa</strong></font></div></td>
<td width="385"> <div align="center"><font color="#FFFFFF"><b>aa</b></font></div></td>
<td width="130"> <div align="center"><font color="#FFFFFF"><strong>aaa</strong></font></div></td>
<td > <div align="center"><font color="#FFFFFF"><strong>aa</strong></font></div></td>
</tr>
<tr bgcolor="#FFFFFF" onmouseover="this.style.backgroundColor='#FFFFdd';" onmouseout="this.style.backgroundColor='#f8f8f8'">
<td align="center"><div align="center">1</div></td>
<td align="center"><div align="center">VBscriptss</div></td>
<td align="left"><div align="center">2004-3-5</div></td>
<td width="53" align="left"><div align="center">ss</div></td>
</tr>
</table>
<p align="center">
<input type="button" name="Button" value="增加" onClick="insertRow()">
</p>
<script language="JavaScript">
function insertRow()
{
var y = tab1.rows.length
var row = tab1.insertRow(y);
var cell;
for(i=0;i<tab1.rows[y-1].cells.length;i++)
{
cell = row.insertCell(i);
cell.innerHTML=i+1;
}
}
</script>
另存为.htm自己体验下
DeluxWorld 2006-03-08
  • 打赏
  • 举报
回复
<input type="button" value="add" onclick="document.writeln('这是增加的')"/>
ice_berg16 2006-03-08
  • 打赏
  • 举报
回复
<body>
<input type="button" value="加字" onclick="document.body.innerHTML+='<p>this is a test</p>'"/>
</body>
字幕制作软件 Popsub   Popsub是漫游字幕组的kuti开发的一个字幕时间轴制作和辅助翻译软件,具有功能强大,容易上手的特点。目前最新的版本是0.74稳定版和0.75测试版。修改记录如下:   0.74版的修正   (2004-10-31)   为配合使用其他音频工具的功能(选项菜单里设置):   1.允许自动检测剪贴板内容,当剪贴板中有新的时间值时,把它复制到时间轴窗口中   2.允许把PopSub设定为置顶窗口   (2005-04-09)   字体窗口的文字编码可以自由输入   修正字体窗口的一个错误: 按了应用按钮后,不仅前面的改动会生效,以后的改动即使不按应用按钮也会生效   0.75版的修正 (2005-04-17)   播放器由WMP6.4改为WMP9   赶在光棍节发布0.76版,祝广大奋斗在字幕第一线的单身同好早日脱光   变更点:   1.时间轴窗口加入回退(Ctrl+Z),前进(Ctrl+Y)功能   2.提高时间轴的自动保存速度   3.修正时间点计算上的一个取整错误   4.增加根据动画来平移当前时间点后所有时间点的功能   >>注意,这个版本检查时间轴功能失效!   于是,就打个补丁吧,修正了上面的问题,   另外顺便给检查窗口加了个右键菜单,可以直接设定不需要检查的行   0.77版变更点:   1. 重点还是安全问题   在设置窗口中加了个选项,可以把时间轴窗口的操作保存在   AutoSave/AutoSaveAction(YYYY-MM-DD-HH-MI-SS).log中   如果程序异常终了,可以在打开时间轴时,选择这个Log文件,   就能恢复前面的工作,不过不能恢复字体的设置。   所以如果没有选自动保存,那么至少要选择这个选项以防万一   至于翻译窗口,还是选自动保存吧,反正也不是很费时间   2. 时间轴窗口中,回车键如果没有定义为各种快捷键,则按回车键进入下一行   这样设置的话,其实可以在时间轴窗口中翻译了,不知道效果如何   3. 一些没啥用的功能:   可以显示所有的无对白时间段,位置在检查时间轴按钮的右边的一个按钮(单击列标题可以排序)   播放窗口中可以指定循环播放时间   4. 顺便加了个制作美剧的时候使用的一个小功能:   时间轴窗口的查找替换功能中,可以预定义替换以及删除的字符   (1) popsub目录下的Replace.lst中,   输入Replace/替换前的文字/替换前的文字   查找替换窗口中就可以选择这个文件中定义的替换项目   (2) popsub目录下的Delete.lst中   输入Delete Inside/文字1/文字2   或Delete Before/文字3   或Delete After/文字4   查找替换窗口中就可以选择这个文件中定义的删除项目   分别表示删除文字1和文字2之间的文字   删除文字3之前的文字   删除文字4之后的文字   以上两个文件中的每行开头如果加上*,表示缺省需要变换,否则需要在查找替换窗口中自己选择。   另外,如果想要表示"/",和通常一样,用"//"就可以了   替换或者删除的范围:时间轴窗口中如果选了多行,范围就是所选择行的对白   时间轴窗口中如果没有选多行,范围就是全体对白   问题点:   1. vista下, wmv mp4 无法外挂字幕>>据说用AVS可以解决   2. 双音轨会同时播放>>据说用AVS可以解决   3. 有时插入时间点快捷键会失效>>调查中   4. 文件关联
一、Qt Creator 的安装和hello world 程序的编写(原创) 1.首先到Qt 的官方网站上下载Qt Creator,这里我们下载windows 版的。 下载地址:http://qt.nokia.com/downloads 如下图我们下载:Download Qt SDK for Windows* (178Mb) 下载完成后,直接安装即可,安装过程中按默认设置即可。 2.运行Qt Creator,首先弹出的是欢迎界面,这里可以打开其自带的各种演示 程序。 3.我们用File->New 菜单来新建工程。 4.这里我们选择Qt4 Gui Application。 5.下面输入工程名和要保存到的文件夹路径。我们这里的工程名为helloworld。 6.这时软件自动添加基本的头文件,因为这个程序我们不需要其他的功能,所以 直接点击Next。 7.我们将base class 选为QDialog 对话框类。然后点击Next。 8.点击Finish,完成工程的建立。 9.我们可以看见工程中的所有文件都出现在列表中了。我们可以直接按下下面的 绿色的run 按钮或者按下Ctrl+R 快捷键运行程序。 10.程序运行会出现空白的对话框,如下图。 11.我们双击文件列表的dialog.ui 文件,便出现了下面所示的图形界面编辑界 面。 12.我们在右边的器件栏里找到Label 标签器件 13.按着鼠标左键将其拖到设计窗口上,如下图。 14.我们双击它,并将其内容改为helloworld。 15.我们在右下角的属性栏里将字体大小由9 改为15。 16.我们拖动标签一角的蓝点,将全部文字显示出来。 17.再次按下运行按钮,便会出现helloworld。 到这里helloworld 程序便完成了。 Qt Creator 编译的程序,在其工程文件夹下会有一个debug 文件夹,其中有程序的.exe 可执行文件。但Qt Creator 默认是用动态链接的, 就是可执行程序在运行时需要相应的.dll 文件。我们点击生成的.exe 文件,首 先可能显示“没有找到mingwm10.dll,因此这个应用程序未能启动。重新安装 应用程序可能会修复此问题。”表示缺少mingwm10.dll 文件。 解决这个问题我们可以将相应的.dll 文件放到系统 中。在Qt Creator 的安装目录的qt 文件下的bin 文件夹下(我安装在了D 盘, 所以路径是D:\Qt\2009.04\qt\bin),可以找到所有的相关.dll 文件。在这里 找到mingwm10.dll 文件,将其复制到C:\WINDOWS\system 文件夹下,即可。下 面再提示缺少什么dll 文件,都像这样解决就可以了。 二、Qt Creator 编写多窗口程序(原创) 实现功能: 程序开始出现一个对话框,按下按钮后便能进入主窗口,如果直 接关闭这个对话框,便不能进入主窗口,整个程序也将退出。当进入主窗口后, 我们按下按钮,会弹出一个对话框,无论如何关闭这个对话框,都会回到主窗口。 实现原理: 程序里我们先建立一个主工程,作为主界面,然后再建立一个对 话框类,将其加入工程中,然后在程序中调用自己新建的对话框类来实现多窗口。 实现过程: 1.首先新建Qt4 Gui Application 工程,工程名为nGui,Base class 选为QWidget。 建立好后工程文件列表如下图。 2.新建对话框类,如下图,在新建中,选择Qt Designer Form Class。 3.选择Dialog without Buttons。 4.类名设为myDlg。 5.点击Finish 完成。注意这里已经默认将其加入到了我们刚建的工程中了。 6.如下图,在mydlg.ui 中拖入一个Push Button,将其上的文本改为“进入主 窗口”,在其属性窗口中将其objectName 改为enterBtn,在下面的Signals and slots editor 中进行信号和槽的关联,其中,Sender 设为enterBtn,Signal 设为clicked(),Receive 设为myDlg,Slot 设为accept()。这样就实现了单击 这个按钮使这个对话框关闭并发出Accepted 信号的功能。下面我们将利用这个 信号。 7.修改主函数main.cpp,如下: #include #include "widget.h" #include "mydlg.h" //加入头文件 int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; myDlg my1; //建立自己新建的类的对象my1 if(my1.exec()==QDialog::Accepted) //利用Accepted 信号判 断enterBtn 是否被按下 { w.show(); //如果被按下,显示主窗口 return a.exec(); //程序一直执行,直到主窗口 关闭 } else return 0; //如果没被按下,则不会进入主窗口,整个程 序结束运行 } 主函数必须这么写,才能完成所要的功能。 如果主函数写成下面这样: #include #include "widget.h" #include "mydlg.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); myDlg my1; if(my1.exec()==QDialog::Accepted) { Widget w; w.show(); } return a.exec(); } 这样,因为w 是在if 语句里定义的,所以当if 语句执行完后它就无效了。这样 导致的后果就是,按下enterBtn 后,主界面窗口一闪就没了。如果此时对程序 改动了,再次点击运行时,就会出现error: collect2: ld returned 1 exit status 的错误。这是因为虽然主窗口没有显示,但它只是隐藏了,程序并没有 结束,而是在后台运行。所以这时改动程序,再运行时便会出错。你可以按下调 试栏上面的红色Stop 停止按钮来停止程序运行。你也可以在windows 任务管理 器的进程中将该进程结束,而后再次运行就没问题了,当然先关闭Qt Creator, 而后再重新打开,这样也能解决问题。 如果把程序改为这样: #include #include "widget.h" #include "mydlg.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); myDlg my1; Widget w; if(my1.exec()==QDialog::Accepted) { w.show(); } return a.exec(); } 这样虽然解决了上面主窗口一闪而过的问题,但是,如果在my1 对话框出现的时 候不点enterBtn,而是直接关闭对话框,那么此时整个程序应该结束执行,但 是事实是这样的吗?如果你此时对程序进行了改动,再次按下run 按钮,你会发 现又出现了error: collect2: ld returned 1 exit status 的错误,这说明程 序并没有结束,我们可以打开windows 任务管理器,可以看到我们的程序仍在执 行。 因为return a.exec();一句表示只要主窗口界面不退出,那么程 序就会一直执行。所以只有用第一种方法,将该语句也放到if 语句中,而在else 语句中用else return 0; ,这样如果enterBtn 没有被按下,那么程序就会结 束执行了。 到这里,我们就实现了一个界面结束执行,然后弹出另一个 界面的程序。下面我们在主窗口上加一个按钮,按下该按钮,弹出一个对话框, 但这个对话框关闭,不会使主窗口关闭。 8.如下图,在主窗口加入按钮,显示文本为“弹出一个对话框”,在其上点击鼠 标右键,在弹出的菜单中选择go to slot。 9.我们选择单击事件clicked()。 10.我们在弹出的槽函数中添加一句: my2.show(); my2 为我们新建对话框类的另一个对象,但是my2 我们还没有定义,所以 在widget.h 文件中添加相应代码,如下,先加入头文件,再加入my2 的定义语 句,这里我们将其放到private 里,因为一般的函数都放在public 里,而变量 都放在private 里。 #ifndef WIDGET_H #define WIDGET_H #include #include "mydlg.h" //包含头文件 namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent = 0); ~Widget(); private: Ui::Widget *ui; myDlg my2; //对my2 进行定义 private slots: void on_pushButton_clicked(); }; #endif // WIDGET_H 到这里,再运行程序,便能完成我们实验要求的功能了。整个程序里,我们用两 种方法实现了信号和槽函数的关联,第一个按钮我们直接在设计器中实现其关 联;第二个按钮我们自己写了槽函数语句,其实图形的设计与直接写代码效果是 一样的。 这个程序里我们实现了两类窗口打开的方式,一个是自身消失而 后打开另一个窗口,一个是打开另一个窗口而自身不消失。可以看到他们实现的 方法是不同的。 三、Qt Creator 登录对话框(原创) 实现功能: 在弹出对话框中填写用户名和密码,按下登录按钮,如果用户名和密码均正确则 进入主窗口,如果有错则弹出警告对话框。 实现原理: 通过上节的多窗口原理实现由登录对话框进入主窗口,而用户名和密码可以用 if 语句进行判断。 实现过程: 1.先新建Qt4 Gui Application 工程,工程名为mainWidget,选用QWidget 作 为Base class,这样便建立了主窗口。文件列表如下: 2.然后新建一个Qt Designer Form Class 类,类名为loginDlg,选用Dialog without Buttons,将其加入上面的工程中。文件列表如下: 3.在logindlg.ui 中设计下面的界面:行输入框为Line Edit。其中用户名后面 的输入框在属性中设置其object Name 为usrLineEdit,密码后面的输入框为 pwdLineEdit,登录按钮为loginBtn,退出按钮为exitBtn。 4.将exitBtn 的单击后效果设为退出程序,关联如下: 5.右击登录按钮选择go to slot,再选择clicked(),然后进入其单击事件的槽 函数,写入一句 void loginDlg::on_loginBtn_clicked() { accept(); } 6.改写main.cpp: #include #include "widget.h" #include "logindlg.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; loginDlg login; if(login.exec()==QDialog::Accepted) { w.show(); return a.exec(); } else return 0; } 7.这时执行程序,可实现按下登录按钮进入主窗口,按下退出按钮退出程序。 8.添加用户名密码判断功能。将登陆按钮的槽函数改为: void loginDlg::on_loginBtn_clicked() { if(m_ui->usrLineEdit->text()==tr("qt")&&m_ui->pwdLineEdit->text()==tr ("123456")) //判断用户名和密码是否正确 accept(); else{ QMessageBox::warning(this,tr("Warning"),tr("user name or password error!"),QMessageBox::Yes); //如果不正确,弹出警告对话框 } } 并在logindlg.cpp 中加入#include 的头文件。如果不加这个头文件, QMessageBox 类不可用。 9.这时再执行程序,输入用户名为qt,密码为123456,按登录按钮便能进入主 窗口了,如果输入错了,就会弹出警告对话框。 如果输入错误,便会弹出警告提示框: 10.在logindlg.cpp 的loginDlg 类构造函数里,添上初始化语句,使密码显示 为小黑点。 loginDlg::loginDlg(QWidget *parent) : QDialog(parent), m_ui(new Ui::loginDlg) { m_ui->setupUi(this); m_ui->pwdLineEdit->setEchoMode(QLineEdit::Password); } 效果如下: 11.如果输入如下图中的用户名,在用户名前不小心加上了一些空格,结果程序 按错误的用户名对待了。 我们可以更改if 判断语句,使这样的输入也算正确。 void loginDlg::on_loginBtn_clicked() { if(m_ui->usrLineEdit->text().trimmed()==tr("qt")&&m_ui->pwdLineEdit-> text()==tr("123456")) accept(); else{ QMessageBox::warning(this,tr("Warning"),tr("user name or password error!"),QMessageBox::Yes); } } 加入的这个函数的作用就是移除字符串开头和结尾的空白字符。 12.最后,如果输入错误了,重新回到登录对话框时,我们希望可以使用户名和 密码框清空并且光标自动跳转到用户名输入框,最终的登录按钮的单击事件的槽 函数如下: void loginDlg::on_loginBtn_clicked() { if(m_ui->usrLineEdit->text().trimmed()==tr("qt")&&m_ui->pwdLineEdit-> text()==tr("123456")) //判断用户名和密码是否正确 accept(); else{ QMessageBox::warning(this,tr("Warning"),tr("user name or password error!"),QMessageBox::Yes); //如果不正确,弹出警告对话框 m_ui->usrLineEdit->clear();//清空用户名输入框 m_ui->pwdLineEdit->clear();//清空密码输入框 m_ui->usrLineEdit->setFocus();//将光标转到用户名输入框 } } 四、Qt Creator 添加菜单图标(原创) 在下面的几节,我们讲述Qt 的MainWindow 主窗口部件。这一节只讲述怎样在其 上的菜单栏里添加菜单和图标。 1.新建Qt4 Gui Application 工程,将工程命名为MainWindow,其他选项默认 即可。 生成的窗口界面如下图。其中最上面的为菜单栏。 2.我们在Type Here 那里双击,并输入“文件(&F)”,这样便可将其文件菜单的 快捷键设为Alt+F。(注意括号最好用英文半角输入,这样看着美观) 3.输入完按下Enter 键确认即可,然后在子菜单中加入“新建(&N)”,确定后, 效果如下图。 4.我们在下面的动作编辑窗口可以看到新加的“新建”菜单。 5.双击这一条,可打开它的编辑对话框。我们看到Icon 项,这里可以更改“新 建”菜单的图标。 6.我们点击后面的...号,进入资源选择器,但现在这里面是空的。所以下面我 们需要给该工程添加外部资源。 7.添加资源有两种方法。一种是直接添加系统提供的资源文件,然后选择所需图 标。另一种是自己写资源文件。我们主要介绍第一种。新建Qt Resources file, 将它命名为menu。其他默认。 8.添加完后如下图。可以看到添加的文件为menu.qrc。 9.我们最好先在工程文件夹里新建一个文件夹,如images,然后将需要的图标 文件放到其中。 10.在Qt Creator 的menu.qrc 文件中,我们点击Add 下拉框,选择Add Prefix。 我们可以将生成的/new/prefix 前缀改为其他名字,如/File。 11.然后再选择Add 下拉框,选择Add Files。再弹出的对话框中,我们到新建 的images 文件夹下,将里面的图标文件全部添加过来。 12.添加完成后,我们在Qt Creator 的File 菜单里选择Save All 选项,保存所 的更改。 13.这时再打开资源选择器,可以看到我们的图标都在这里了。(注意:如果不显 示,可以按一下上面的Reload 按钮) 14.我们将new.png 作为“新建”菜单的图标,然后点击Shortcut,并按下 Crtl+N,便能将Crtl+N 作为“新建”菜单的快捷键。 15.这时打开文件菜单,可以看到“新建”菜单已经有图标了。 运行程序后效果如下。 16.我们在工程文件夹下查看建立的menu.qrc 文件,可以用写字板将它打开。 其具体内容如下。 附:第二种添加资源文件的方法。 1.首先右击工程文件夹,在弹出的菜单中选择Add New,添加新文件。也可以用 File 中的添加新文件。 2.我们选择文本文件。 3.将文件名设置为menu.qrc。 4.添加好文件后将其内容修改如下。可以看到就是用第一种方法生成的 menu.qrc 文件的内容。 5.保存文件后,在资源管理器中可以看到添加的图标文件。 五、Qt Creator 布局管理器的使用(原创) 上篇讲解了如何在Qt Creator 中添加资源文件,并且为菜单添加了图标。这次 我们先对那个界面进行一些完善,然后讲解一些布局管理器的知识。 首先对菜单进行完善。 1.我们在上一次的基础上再加入一些常用菜单。 “文件”的子菜单如下图。中间的分割线可以点击Add Separator 添加。 “编辑”子菜单的内容如下。 “帮助”子菜单的内容如下。 2.我们在动作编辑器中对各个菜单的属性进行设置。 如下图。 3.我们拖动“新建”菜单的图标,将其放到工具栏里。 拖动“新建”菜单的图标。 将其放到菜单栏下面的工具栏里。 4.我们再添加其他几个图标。使用Append Separator 可以添加分割线。 5.最终效果如下。如果需要删除图标,可以在图标上点击右键选择Remove action 即可。 下面简述一下布局管理器。 (这里主要以垂直布局管理器进行讲解,其他类型管理器用法与之相同,其效 果可自己验证。) 1.在左边的器件栏里拖入三个PushButton 和一个Vertical Layout(垂直布局 管理器)到中心面板。如下图。 2.将这三个按钮放入垂直布局管理器,效果如下。可以看到按钮垂直方向排列, 并且宽度可以改变,但高度没有改变。 3.我们将布局管理器整体选中,按下上面工具栏的Break Layout 按钮,便可取 消布局管理器。(我们当然也可以先将按钮移出,再按下Delete 键将布局管理 器删除。) 4.下面我们改用分裂器部件(QSplitter)。 先将三个按钮同时选中,再按下上面工具栏的Lay Out Vertically in Splitter (垂直分裂器)。 效果如下图。可以看到按钮的大小可以随之改动。这也就是分裂器和布局管理器 的分别。 5.其实布局管理器不但能控制器件的布局,还有个很重要的用途是,它能使器件 的大小随着窗口大小的改变而改变。 我们先在主窗口的中心拖入一个文本编辑器Text Edit。 这时直接运行程序,效果如下。可以看到它的大小和位置不会随着窗口改变。 下面我们选中主窗口部件,然后在空白处点击鼠标右键,选择Layout->Lay Out in a Grid,使整个主窗口的中心区处于网格布局管理器中。 可以看到,这时文本编辑器已经占据了整个主窗口的中心区。 运行一下程序,可以看到无论怎样拉伸窗口,文本编辑框的大小都会随之改变。 我们在这里一共讲述了三种使用布局管理器的方法,一种是去器件栏添加,一 种是用工具栏的快捷图标,还有一种是使用鼠标右键的选项。 程序中用到的图标是我从Ubuntu 中复制的,可以到 http://www.qtcn.org/bbs/read.php?tid=23252&page=1&toread=1 下载到。 六、Qt Creator 实现文本编辑(原创) 前面已经将界面好了,这里我们为其添加代码,实现文本编辑的功能。 首先实现新建文件,文件保存,和文件另存为的功能。 (我们先将上次的工程文件夹进行备份,然后再对其进行修改。在写较大的程序 时,经常对源文件进行备份,是个很好的习惯。) 在开始正式写程序之前,我们先要考虑一下整个流程。因为我们要写记事本一 样的软件,所以最好先打开windows 中的记事本,进行一些简单的操作,然后 考虑怎样去实现这些功能。再者,再强大的软件,它的功能也是一个一个加上 去的,不要设想一下子写出所有的功能。我们这里先实现新建文件,保存文件, 和文件另存为三个功能,是因为它们联系很紧,而且这三个功能总的代码量也 不是很大。 因为三个功能之间的关系并不复杂,所以我们这里便不再画流程图,而只是简 单描述一下。 新建文件,那么如果有正在编辑的文件,是否需要保存呢? 如果需要进行保存,那这个文件以前保存过吗?如果没有保存过,就应该先将其 另存为。 下面开始按这些关系写程序。 1.打开Qt Creator,在File 菜单中选择Open,然后在工程文件夹中打开 MainWindow.pro 工程文件。 先在main.cpp 文件中加入以下语句,让程序中可以使用中文。 在其中加入#include 头文件包含,再在主函数中加入下面一行: QTextCodec::setCodecForTr(QTextCodec::codecForLocale()); 这样在程序中使用中文,便能在运行时显示出来了。更改后文件如下图。 2.在mainwindow.h 文件中的private 下加入以下语句。 bool isSaved; //为true 时标志文件已经保存,为false 时标志文件尚未保存 QString curFile; //保存当前文件的文件名 void do_file_New(); //新建文件 void do_file_SaveOrNot(); //修改过的文件是否保存 void do_file_Save(); //保存文件 void do_file_SaveAs(); //文件另存为 bool saveFile(const QString& fileName); //存储文件 这些是变量和函数的声明。其中isSaved 变量起到标志的作用,用它来标志文件 是否被保存过。然后我们再在相应的源文件里进行这些函数的定义。 3.在mainwindow.cpp 中先加入头文件#include ,然后在构造函数里添 加以下几行代码。 isSaved = false; //初始化文件为未保存过状态 curFile = tr("未命名.txt"); //初始化文件名为“未命名.txt” setWindowTitle(curFile); //初始化主窗口的标题 这是对主窗口进行初始化。效果如下。 4.然后添加“新建”操作的函数定义。 void MainWindow::do_file_New() //实现新建文件的功能 { do_file_SaveOrNot(); isSaved = false; curFile = tr("未命名.txt"); setWindowTitle(curFile); ui->textEdit->clear(); //清空文本编辑器 ui->textEdit->setVisible(true); //文本编辑器可见 } 新建文件,先要判断正在编辑的文件是否需要保存。然后将新建的文件标志为未 保存过状态。 5.再添加do_file_SaveOrNot 函数的定义。 void MainWindow::do_file_SaveOrNot() //弹出是否保存文件对话框 { if(ui->textEdit->document()->isModified()) //如果文件被更改过,弹出保 存对话框 { QMessageBox box; box.setWindowTitle(tr("警告")); box.setIcon(QMessageBox::Warning); box.setText(curFile + tr(" 尚未保存,是否保存?")); box.setStandardButtons(QMessageBox::Yes | QMessageBox::No); if(box.exec() == QMessageBox::Yes) //如果选择保存文件,则执行保存操作 do_file_Save(); } } 这个函数实现弹出一个对话框,询问是否保存正在编辑的文件。 6.再添加“保存”操作的函数定义。 void MainWindow::do_file_Save() //保存文件 { if(isSaved){ //如果文件已经被保存过,直接保存文件 saveFile(curFile); } else{ do_file_SaveAs(); //如果文件是第一次保存,那么调用另存为 } } 对文件进行保存时,先判断其是否已经被保存过,如果没有被保存过,就要先对 其进行另存为操作。 7.下面是“另存为”操作的函数定义。 void MainWindow::do_file_SaveAs() //文件另存为 { QString fileName = QFileDialog::getSaveFileName(this,tr("另存为 "),curFile); //获得文件名 if(!fileName.isEmpty()) //如果文件名不为空,则保存文件内容 { saveFile(fileName); } } 这里弹出一个文件对话框,显示文件另存为的路径。 8.下面是实际文件存储操作的函数定义。 bool MainWindow::saveFile(const QString& fileName) //保存文件内容,因为可能保存失败,所以具有返回值,来表明是否保存成功 { QFile file(fileName); if(!file.open(QFile::WriteOnly | QFile::Text)) //以只写方式打开文件,如果打开失败则弹出提示框并返回 { QMessageBox::warning(this,tr("保存文件"), tr("无法保存文件 %1:\n %2").arg(fileName) .arg(file.errorString())); return false; } //%1,%2 表示后面的两个arg 参数的值 QTextStream out(&file); //新建流对象,指向选定的文件 out << ui->textEdit->toPlainText(); //将文本编辑器里的内容以纯文本 的形式输出到流对象中 isSaved = true; curFile = QFileInfo(fileName).canonicalFilePath(); //获得文件的标准路 径 setWindowTitle(curFile); //将窗口名称改为现在窗口的路径 return true; } 这个函数实现将文本文件进行存储。下面我们对其中的一些代码进行讲解。 QFile file(fileName);一句,定义了一个QFile 类的对象file,其中filename 表明这个文件就是我们保存的的文件。然后我们就可以用file 代替这个文件, 来进行一些操作。Qt 中文件的操作和C,C++很相似。对于QFile 类对象怎么使 用,我们可以查看帮助。 点击Qt Creator 最左侧的Help,在其中输入QFile, 在搜索到的列表中选择QFile 即可。这时在右侧会显示出QFile 类中所有相关信 息以及他们的用法和说明。 // 我们往下拉,会发现下面有关于怎么读取文件的示例代码。 // // 再往下便能看到用QTextStream 类对象,进行字符串输入的例子。下面也提到了 QFileInfo 和QDir 等相关的类,我们可以点击它们去看一下具体的使用说明。 // 上面只是了一个简单的说明。以后我们对自己不明白的类都可以去帮助里进行 查找,这也许是我们以后要的最多的一件事了。对于其中的英文解释,我们最 好想办法弄明白它的大意,其实网上也有一些中文的翻译,但最好还是从一开始 就尝试着看英文原版的帮助,这样以后才不会对中文翻译产生依赖。 我们这次只是很简单的说明了一下怎样使用帮助文件,这不表明 它不重要,而是因为这里不可能将每个类的帮助都解释一遍,没有那么多时间, 也没有那么大的篇幅。而更重要的是因为,我们这个教程只是引你入门,所以很 多东西需要自己去尝试。 在以后的教程里,如果不是特殊情况,就不会再对其中的类进行 详细解释,文章中的重点是对整个程序的描述,其中不明白的类,自己查看帮助。 9.双击mainwindow.ui 文件,在图形界面窗口下面的Action Editor 动作编辑 器里,我们右击“新建”菜单一条,选择Go to slot,然后选择triggered(), 进入其触发事件槽函数。 同理,进入其他两个菜单的槽函数,将相应的操作的函数写入槽函数中。如下。 void MainWindow::on_action_New_triggered() //信号和槽的关联 { do_file_New(); } void MainWindow::on_action_Save_triggered() { do_file_Save(); } void MainWindow::on_action_SaveAs_triggered() { do_file_SaveAs(); } 这时点击运行,就能够实现新建文件,保存文件,文件另存为的功能了。 然后实现打开,关闭,退出,撤销,复制,剪切,粘贴的功能。 先备份上次的工程文件,然后再将其打开。 1.先在mainwindow.h 文件中加入函数的声明。 void do_file_Open(); //打开文件 bool do_file_Load(const QString& fileName); //读取文件 2.再在mainwindow.cpp 文件中写函数的功能实现。 void MainWindow::do_file_Open()//打开文件 { do_file_SaveOrNot();//是否需要保存现有文件 QString fileName = QFileDialog::getOpenFileName(this); //获得要打开的文件的名字 if(!fileName.isEmpty())//如果文件名不为空 { do_file_Load(fileName); } ui->textEdit->setVisible(true);//文本编辑器可见 } bool MainWindow::do_file_Load(const QString& fileName) //读取文件 { QFile file(fileName); if(!file.open(QFile::ReadOnly | QFile::Text)) { QMessageBox::warning(this,tr("读取文件"),tr("无法读取文件 %1:\n%2.").arg(fileName).arg(file.errorString())); return false; //如果打开文件失败,弹出对话框,并返回 } QTextStream in(&file); ui->textEdit->setText(in.readAll()); //将文件中的所有内容都 写到文本编辑器中 curFile = QFileInfo(fileName).canonicalFilePath(); setWindowTitle(curFile); return true; } 上面的打开文件函数与文件另存为函数相似,读取文件的函数与文件存储函数相 似。 3.然后按顺序加入更菜单的关联函数,如下。 void MainWindow::on_action_Open_triggered() //打开操作 { do_file_Open(); } // void MainWindow::on_action_Close_triggered() //关闭操作 { do_file_SaveOrNot(); ui->textEdit->setVisible(false); } // void MainWindow::on_action_Quit_triggered() //退出操作 { on_action_Close_triggered(); //先执行关闭操作 qApp->quit(); //再退出系统,qApp 是指向应用程序的全局指针 } // void MainWindow::on_action_Undo_triggered() //撤销操作 { ui->textEdit->undo(); } // void MainWindow::on_action_Cut_triggered() //剪切操作 { ui->textEdit->cut(); } // void MainWindow::on_action_Copy_triggered() //复制操作 { ui->textEdit->copy(); } // void MainWindow::on_action_Past_triggered() //粘贴操作 { ui->textEdit->paste(); } 因为复制,撤销,全选,粘贴,剪切等功能,是TextEdit 默认就有的,所以我 们只需调用一下相应函数就行。 到这里,除了查找和帮助两个菜单的功能没有加上以外,其他功能都已经实现了。 七、Qt Creator 实现文本查找(原创) 现在加上查找菜单的功能。因为这里要涉及关于Qt Creator 的很多实用功能, 所以单独用一篇文章来介绍。 以前都用设计器设计界面,而这次我们用代码实现一个简单的查找对话框。对于 怎么实现查找功能的,我们详细地分步说明了怎么进行类中方法的查找和使用。 其中也将Qt Creator 智能化的代码补全功能和程序中函数的声明位置和定义位 置间的快速切换进行了介绍。 1.首先还是保存以前的工程,然后再将其打开。 我们发现Qt Creator 默认的字体有点小,可以按下Ctrl 键的同时按两下+键, 来放大字体。也可以选择Edit->Advanced->Increase Font Size。 2.在mainwindow.h 中加入#include 的头文件包含,在private 中 添加 QLineEdit *find_textLineEdit; //声明一个行编辑器,用于输入要查找的内容 在private slots 中添加 void show_findText(); 在该函数中实现查找字符串的功能。 3.我们进入查找菜单的触发事件槽函数,更改如下。 void MainWindow::on_action_Find_triggered() { QDialog *findDlg = new QDialog(this); //新建一个对话框,用于查找操作,this 表明它的父窗口是MainWindow。 findDlg->setWindowTitle(tr("查找")); //设置对话框的标题 find_textLineEdit = new QLineEdit(findDlg); //将行编辑器加入到新建的查找对话框中 QPushButton *find_Btn = new QPushButton(tr("查找下一个"),findDlg); //加入一个“查找下一个”的按钮 QVBoxLayout* layout = new QVBoxLayout(findDlg); layout->addWidget(find_textLineEdit); layout->addWidget(find_Btn); //新建一个垂直布局管理器,并将行编辑器和按钮加入其中 findDlg ->show(); //显示对话框 connect(find_Btn,SIGNAL(clicked()),this,SLOT(show_findText())); //设置“查找下一个”按钮的单击事件和其槽函数的关联 } 这里我们直接用代码生成了一个对话框,其中一个行编辑器可以输入要查找的字 符,一个按钮可以进行查找操作。我们将这两个部件放到了一个垂直布局管理器 中。然后显示这个对话框。并设置了那个按钮单击事件与show_findText()函数 的关联。 5.下面我们开始写实现查找功能的show_findText()函数。 void MainWindow::show_findText()//“查找下一个”按钮的槽函数 { QString findText = find_textLineEdit->text(); //获取行编辑器中的内容 } 先用一个QString 类的对象获得要查找的字符。然后我们一步一步写查找操作的 语句。 6.在下一行写下ui,然后直接按下键盘上的“<.”键,这时系统会根据是否是 指针对象而自动生成“->”或“.”,因为ui 是指针对象,所以自动生成“->” 号,而且弹出了ui 中的所有部件名称的列表。如下图。 7.我们用向下的方向键选中列表中的textEdit。或者我们可以先输入text,这 时能缩减列表的内容。 8.如上图我们将鼠标放到textEdit 上,这时便出现了textEdit 的类名信息, 且后面出现一个F1 按键。我们按下键盘上的F1,便能出现textEdit 的帮助。 9.我们在帮助中向下拉,会发现这里有一个find 函数。 10.我们点击find,查看其详细说明。 11.可以看到find 函数可以实现文本编辑器中字符串的查找。其中有一个 FindFlags 的参数,我们点击它查看其说明。 12.可以看到它是一个枚举变量(enum),有三个选项,第一项是向后查找(即 查找光标以前的内容,这里的前后是相对的说法,比如第一行已经用完了,光 标在第二行时,把第一行向后。),第二项是区分大小写查找,第三项是 查找全部。 13.我们选用第一项,然后写出下面的语句。 ui->textEdit->find(findText,QTextDocument::FindBackward); //将行编辑器中的内容在文本编辑器中进行查找 当我们刚打出“f”时,就能自动弹出textEdit 类的相关属性和方法。 可以看到,当写完函数名和第一个“(”后,系统会自动显示出该函数的函数原 型,这样可以使我们减少出错。 14.这时已经能实现查找的功能了。但是我们刚才看到find 的返回值类型是bool 型,而且,我们也应该为查找不到字符串作出提示。 if(!ui->textEdit->find(findText,QTextDocument::FindBackward)) { QMessageBox::warning(this,tr("查找"),tr("找不到 %1") .arg(findText); } 因为查找失败返回值是false,所以if 条件加了“!”号。在找不到时弹出警 告对话框。 15.到这里,查找功能就基本上写完了。show_findText()函数的内容如下。 我们会发现随着程序功能的增强,其中的函数也会越来越多,我们都会为查找 某个函数的定义位置感到头疼。而在Qt Creator 中有几种快速定位函数的方法, 我们这里讲解三种。 第一,在函数声明的地方直接跳转到函数定义的地方。 如在do_file_Load 上点击鼠标右键,在弹出的菜单中选择Follow Symbol under Cursor 或者下面的Switch between Method Declaration/Definition。 这时系统就会自动跳转到函数定义的位置。如下图。 第二,快速查找一个文件里的所有函数。 我们可以点击窗口最上面的下拉框,这里会显示本文件中所有函数的列表。 第三,利用查找功能。 1.我们先将鼠标定位到一个函数名上。 2.然后选择Edit->Find/Replace->Find Dialog。 3.这时会出现一个查找对话框,可以看到要查找的函数名已经写在里面了。 4.当我们按下Search 按钮后,会在查找结果窗口显示查找到的结果。 5.我们点击第二个文件。会发现在这个文件中有两处关键字是高亮显示。 6.我们双击第二项,就会自动跳转到函数的定义处。 文章讲到这里,我们已经很详细地说明了怎样去使用一个类里面没有用过的方法 函数;也说明了Qt Creator 中的一些便捷操作。可以看到,Qt Creator 开发环 境,有很多很人性化的设计,我们应该熟练应用它们。 在以后的文章中,我们不会再很详细地去用帮助来说明一个函数是 怎么来的,该怎么用,这些应该自己试着去查找。 八、Qt Creator 实现状态栏显示(原创) 在程序主窗口Mainwindow 中,有菜单栏,工具栏,中心部件和状态栏。前面几 个已经讲过了,这次讲解状态栏的使用。 程序中有哪些不明白的类或函数,请自己查看帮助。 1.我们在mainwindow.h 中一下更改。 加入头文件包含: #include 加入私有变量和函数: QLabel* first_statusLabel; //声明两个标签对象,用于显示状态信息 QLabel* second_statusLabel; void init_statusBar(); //初始化状态栏 加入一个槽函数声明:void do_cursorChanged(); //获取光标位置信息 2.在mainwindow.cpp 中加入状态栏初始化函数的定义。 void MainWindow::init_statusBar() { QStatusBar* bar = ui->statusBar; //获取状态栏 first_statusLabel = new QLabel; //新建标签 first_statusLabel->setMinimumSize(150,20); //设置标签最小尺寸 first_statusLabel->setFrameShape(QFrame::WinPanel); //设置标签形状 first_statusLabel->setFrameShadow(QFrame::Sunken); //设置标签阴影 second_statusLabel = new QLabel; second_statusLabel->setMinimumSize(150,20); second_statusLabel->setFrameShape(QFrame::WinPanel); second_statusLabel->setFrameShadow(QFrame::Sunken); bar->addWidget(first_statusLabel); bar->addWidget(second_statusLabel); first_statusLabel->setText(tr("欢迎使用文本编辑器")); //初始化内容 second_statusLabel->setText(tr("yafeilinux 制作!")); } 这里将两个标签对象加入到了主窗口的状态栏里,并设置了他们的外观和初值。 3.在构造函数里调用状态栏初始化函数。 init_statusBar(); 这时运行程序,效果如下。 4.在mainwindow.cpp 中加入获取光标位置的函数的定义。 void MainWindow::do_cursorChanged() { int rowNum = ui->textEdit->document()->blockCount(); //获取光标所在行的行号 const QTextCursor cursor = ui->textEdit->textCursor(); int colNum = cursor.columnNumber(); //获取光标所在列的列号 first_statusLabel->setText(tr("%1 行 %2 列").arg(rowNum).arg(colNum)); //在状态栏显示光标位置 } 这个函数可获取文本编辑框中光标的位置,并显示在状态栏中。 5.在构造函数添加光标位置改变信号的关联。 connect(ui->textEdit,SIGNAL(cursorPositionChanged()),this,SLOT(do_cur sorChanged())); 这时运行程序。效果如下。 6.在do_file_Load 函数的最后添加下面语句。 second_statusLabel->setText(tr("打开文件成功")); 7.在saveFile 函数的最后添加以下语句。 second_statusLabel->setText(tr("保存文件成功")); 8.在on_action_Find_triggered 函数的后面添加如下语句。 second_statusLabel->setText(tr("正在进行查找")); 9.在on_action_Close_triggered 函数最后添加如下语句。 first_statusLabel->setText(tr("文本编辑器已关闭")); second_statusLabel->setText(tr("yafeilinux 制作!")); 到这里整个文本编辑器的程序就算写完了。我们这里没有写帮助菜单的功能实 现,大家可以自己添加。而且程序中也有很多漏洞和不完善的地方,如果有兴 趣,大家也可以自己修改。因为时间和篇幅的原因,我们这里就不再过多的讲 述。 九、Qt Creator 中鼠标键盘事件的处理实现自定义鼠标指针(原创) 我们前面一直在说信号,比方说用鼠标按了一下按钮,这样就会产生一个按钮的 单击信号,然后我们可以在相应的槽函数里进行相应功能的设置。其实在按下鼠 标后,程序要先接收到鼠标按下的事件,然后将这个事件按默认的设置传给按钮。 可以看出,事件和信号并不是一回事,事件比信号更底层。而我们以前把单击按 钮也叫事件,这是不确切的,不过大家都知道是什么意思,所以当时也没有细 分。 Qt 中的事件可以在QEvent 中查看。下面我们只是找两个例子来进行简单的演示。 1.还是先建立一个Qt4 Gui Application 工程,我这里起名为event。 2.添加代码,让程序中可以使用中文。 即在main.cpp 文件中加入#include 的头文件包含。 再在下面的主函数里添加 QTextCodec::setCodecForTr(QTextCodec::codecForLocale()); 3.在mainwindow.h 文件中一下更改。 添加#include 头文件。因为这样就包含了QtGui 中所有的子文件。 在public 中添加两个函数的声明 void mouseMoveEvent(QMouseEvent *); void keyPressEvent(QKeyEvent *); 4.我们在mainwindow.ui 中添加一个Label 和一个PushButton,将他们拉长点, 因为一会要在上面显示标语。 5.在mainwindow.cpp 中的构造函数里添加两个部件的显示文本。 ui->label->setText(tr("按下键盘上的A 键试试!")); ui->pushButton->setText(tr("按下鼠标的一个键,然后移动鼠标试试")); 6.然后在下面进行两个函数的定义。 /*以下是鼠标移动事件*/ void MainWindow::mouseMoveEvent(QMouseEvent *m) {//这里的函数名和参数不能更改 QCursor my(QPixmap("E:/Qt/Qt-Creator-Example/event/time.png")); //为鼠标指针选择图片,注意这里要用绝对路径,且要用“/”,而不能用“\” QApplication::setOverrideCursor(my); //将鼠标指针更改为自己设置的图片 int x = m->pos().x(); int y = m->pos().y(); //获取鼠标现在的位置坐标 ui->pushButton->setText(tr("鼠标现在的坐标是(%1,%2), 哈哈好玩吧 ").arg(x).arg(y)); //将鼠标的位置坐标显示在按钮上 ui->pushButton->move(m->pos()); //让按钮跟随鼠标移动 } /*以下是键盘按下事件*/ void MainWindow::keyPressEvent(QKeyEvent *k) { if(k->key() == Qt::Key_A) //判断是否是A 键按下 { ui->label->setPixmap(QPixmap("E:/Qt/Qt-Creator-Example/event/linux.jp g")); ui->label->resize(100,100); //更改标签图片和大小 } } 注意:这两个函数不是自己新建的,而是对已有函数的重定义,所有函数名和参 数都不能改。第一个函数对鼠标移动事件进行了重写。其中实现了鼠标指针的更 改,和按钮跟随鼠标移动的功能。 第二个函数对键盘的A 键按下实现了新的功能。 效果如下。 按下鼠标的一个键,并移动鼠标。 按下键盘上的A 键。 十、Qt Creator 中实现定时器和产生随机数(原创) 有两种方法实现定时器。 第一种。自己建立关联。 1.新建Gui 工程,工程名可以设置为timer。并在主界面上添加一个标签label, 并设置其显示内容为“0000-00-00 00:00:00 星期日”。 2.在mainwindow.h 中添加槽函数声明。 private slots: void timerUpDate(); 3.在mainwindow.cpp 中添加代码。 添加#include 的头文件包含,这样就包含了QtCore 下的所有文件。 构造函数里添加代码: QTimer *timer = new QTimer(this); //新建定时器 connect(timer,SIGNAL(timeout()),this,SLOT(timerUpDate())); //关联定时器计满信号和相应的槽函数 timer->start(1000); //定时器开始计时,其中1000 表示1000ms 即1 秒 4.然后实现更新函数。 void MainWindow::timerUpDate() { QDateTime time = QDateTime::currentDateTime(); //获取系统现在的时间 QString str = time.toString("yyyy-MM-dd hh:mm:ss dddd"); //设置系统时间显示格式 ui->label->setText(str); //在标签上显示时间 } 5.运行程序,效果如下。 第二种。使用事件。(有点像单片机中的定时器啊) 1.新建工程。在窗口上添加两个标签。 2.在main.cpp 中添加代码,实现中文显示。 #include QTextCodec::setCodecForTr(QTextCodec::codecForLocale()); 3.在mainwindow.h 中添加代码。 void timerEvent(QTimerEvent *); 4.在mainwindow.cpp 中添加代码。 添加头文件#include 在构造函数里添加以下代码。 startTimer(1000); //其返回值为1,即其timerId 为1 startTimer(5000);//其返回值为2,即其timerId 为2 startTimer(10000); //其返回值为3,即其timerId 为3 添加了三个定时器,它们的timerId 分别为1,2,3。注意,第几个定时器的返 回值就为几。所以要注意定时器顺序。 在下面添加函数实现。 void MainWindow::timerEvent(QTimerEvent *t) //定时器事件 { switch(t->timerId()) //判断定时器的句柄 { case 1 : ui->label->setText(tr("每秒产生一个随机数: %1").arg(qrand()%10));break; case 2 : ui->label_2->setText(tr("5 秒后软件将关闭"));break; case 3 : qApp->quit();break; //退出系统 } } 这里添加了三个定时器,并都在定时器事件中判断它们,然后执行相应的功能。 这样就不用每个定时器都写一个关联函数和槽函数了。 随机数的实现: 上面程序中的qrand(),可以产生随机数,qrand()%10 可以产生0-9 之间的随机 数。要想产生100 以内的随机数就%100。以此类推。 但这样每次启动程序后,都按同一种顺序产生随机数。为了实现每次启动程序产 生不同的初始值。我们可以使用qsrand(time(0));实现设置随机数的初值,而 程序每次启动时time(0)返回的值都不同,这样就实现了产生不同初始值的功 能。 我们将qsrand(time(0));一句加入构造函数里。 程序最终运行效果如下。 十一、Qt 2D 绘图(一)绘制简单图形(原创) 声明:本文原创于yafeilinux 的百度博客,http://hi.baidu.com/yafeilinux 转载请注明出处。 说明:以后使用的环境为基于Qt 4.6 的Qt Creator 1.3.0 windows 版本 本文介绍在窗口上绘制最简单的图形的方法。 1.新建Qt4 Gui Application 工程,我这里使用的工程名为painter01,选用 QDialog 作为Base class 2.在dialog.h 文件中声明重绘事件函数void paintEvent(QPaintEvent *); 3.在dialog.cpp 中添加绘图类QPainter 的头文件包含#include 4.在下面进行该函数的重定义。 void Dialog::paintEvent(QPaintEvent *) { QPainter painter(this); painter.drawLine(0,0,100,100); } 其中创建了QPainter 类对象,它是用来进行绘制图形的,我们这里画了一条线 Line,其中的参数为线的起点(0,0),和终点(100,100)。这里的数值指的 是像素,详细的坐标设置我们以后再讲,这里知道(0,0)点指的是窗口的左上 角即可。运行效果如下: 5.在qt 的帮助里可以查看所有的绘制函数,而且下面还给出了相关的例子。 6.我们下面将几个知识点说明一下,帮助大家更快入门。 将函数改为如下: void Dialog::paintEvent(QPaintEvent *) { QPainter painter(this); QPen pen; //画笔 pen.setColor(QColor(255,0,0)); QBrush brush(QColor(0,255,0,125)); //画刷 painter.setPen(pen); //添加画笔 painter.setBrush(brush); //添加画刷 painter.drawRect(100,100,200,200); //绘制矩形 } 这里的pen 用来绘制边框,brush 用来进行封闭区域的填充,QColor 类用来提供 颜色,我们这里使用了rgb 方法来生成颜色,即(red,green,blue),它们取 值分别是0-255,例如(255,0,0)表示红色,而全0 表示黑色,全255 表示 白色。后面的(0,255,0,125),其中的125 是透明度(alpha)设置,其值 也是从0 到255,0 表示全透明。最后将画笔和画刷添加到painter 绘制设备中, 画出图形。这里的Rect 是长方形,其中的参数为(100,100)表示起始坐标, 200,200 表示长和宽。效果如下: 7.其实画笔和画刷也有很多设置,大家可以查看帮助。 QPainter painter(this); QPen pen(Qt::DotLine); QBrush brush(Qt::blue); brush.setStyle(Qt::HorPattern); painter.setPen(pen); painter.setBrush(brush); painter.drawRect(100,100,200,200); 这里我们设置了画笔的风格为点线,画刷的风格为并行横线,效果如下: 在帮助里可以看到所有的风格。 我们这里用了Qt::blue,Qt 自定义的几个颜色如下: 8.画弧线,这是帮助里的一个例子。 QRectF rectangle(10.0, 20.0, 80.0, 60.0); //矩形 int startAngle = 30 * 16; //起始角度 int spanAngle = 120 * 16; //跨越度数 QPainter painter(this); painter.drawArc(rectangle, startAngle, spanAngle); 这里要说明的是,画弧线时,角度被分成了十六分之一,就是说,要想为30 度, 就得是30*16。它有起始角度和跨度,还有位置矩形,要想画出自己想要的弧线, 就要有一定的几何知识了。这里就不再祥述。 十二、Qt 2D 绘图(二)渐变填充(原创) 声明:本文原创于yafeilinux 的百度博客,http://hi.baidu.com/yafeilinux 转载请注明出处。 在qt 中提供了三种渐变方式,分别是线性渐变,圆形渐变和圆锥渐变。如果能 熟练应用它们,就能设计出炫目的填充效果。 线性渐变: 1.更改函数如下: void Dialog::paintEvent(QPaintEvent *) { QPainter painter(this); QLinearGradient linearGradient(100,150,300,150); //从点(100,150)开始到点(300,150)结束,确定一条直线 linearGradient.setColorAt(0,Qt::red); linearGradient.setColorAt(0.2,Qt::black); linearGradient.setColorAt(0.4,Qt::yellow); linearGradient.setColorAt(0.6,Qt::white); linearGradient.setColorAt(0.8,Qt::green); linearGradient.setColorAt(1,Qt::blue); //将直线开始点设为0,终点设为1,然后分段设置颜色 painter.setBrush(linearGradient); painter.drawRect(100,100,200,100); //绘制矩形,线性渐变线正好在矩形的水平中心线上 } 效果如下: 圆形渐变: 1.更改函数内容如下: QRadialGradient radialGradient(200,100,100,200,100); //其中参数分别为圆形渐变的圆心(200,100),半径100,和焦点(200, 100) //这里让焦点和圆心重合,从而形成从圆心向外渐变的效果 radialGradient.setColorAt(0,Qt::black); radialGradient.setColorAt(1,Qt::yellow); //渐变从焦点向整个圆进行,焦点为起始点0,圆的边界为1 QPainter painter(this); painter.setBrush(radialGradient); painter.drawEllipse(100,0,200,200); //绘制圆,让它正好和上面的圆形渐变的圆重合 效果如下: 2.要想改变填充的效果,只需要改变焦点的位置和渐变的颜色位置即可。 改变焦点位置:QRadialGradient radialGradient(200,100,100,100,100); 效果如下: 锥形渐变: 1.更改函数内容如下: //圆锥渐变 QConicalGradient conicalGradient(50,50,0); //圆心为(50,50),开始角度为0 conicalGradient.setColorAt(0,Qt::green); conicalGradient.setColorAt(1,Qt::white); //从圆心的0 度角开始逆时针填充 QPainter painter(this); painter.setBrush(conicalGradient); painter.drawEllipse(0,0,100,100); 效果如下: 2.可以更改开始角度,来改变填充效果 QConicalGradient conicalGradient(50,50,30); 开始角度设置为30 度,效果如下: 其实三种渐变的设置都在于焦点和渐变颜色的位置,如果想设计出漂亮的渐变 效果,还要有美术功底啊! 十二、Qt 2D 绘图(三)绘制文字(原创) 声明:本文原创于yafeilinux 的百度博客,http://hi.baidu.com/yafeilinux 转载请注明出处。 接着上一次的教程,这次我们学习在窗体上绘制文字。 1.绘制最简单的文字。 我们更改重绘函数如下: void Dialog::paintEvent(QPaintEvent *) { QPainter painter(this); painter.drawText(100,100,"yafeilinux"); } 我们在(100,100)的位置显示了一行文字,效果如下。 2.为了更好的控制字体的位置。我们使用另一个构造函数。在帮助里查看 drawText,如下。 这里我们看到了构造函数的原型和例子。其中的flags 参数可以控制字体在矩形 中的位置。我们更改函数内容如下。 void Dialog::paintEvent(QPaintEvent *) { QPainter painter(this); QRectF ff(100,100,300,200); //设置一个矩形 painter.drawRect(ff); //为了更直观地看到字体的位置,我们绘制出这个矩形 painter.setPen(QColor(Qt::red)); //设置画笔颜色为红色 painter.drawText(ff,Qt::AlignHCenter,"yafeilinux"); //我们这里先让字体水平居中 } 效果如下。 可以看到字符串是在最上面水平居中的。如果想让其在矩形正中间,我们可以使 用Qt::AlignCenter。 这里我们也可以使用两个枚举变量进行按位与操作,例如可以使用 Qt::AlignBottom|Qt::AlignHCenter 实现让文字显示在矩形下面的正中间。效 果如下。 对于较长的字符串,我们也可以利用“\n”进行换行,例如"yafei\nlinux"。效 果如下。 3.如果要使文字更美观,我们就需要使用QFont 类来改变字体。先在帮助中查 看一下这个类。 可以看到它有好几个枚举变量来设置字体。下面的例子我们对主要的几个选项进 行演示。 更改函数如下。 void Dialog::paintEvent(QPaintEvent *) { QFont font("Arial",20,QFont::Bold,true); //设置字体的类型,大小,加粗,斜体 font.setUnderline(true); //设置下划线 font.setOverline(true); //设置上划线 font.setCapitalization(QFont::SmallCaps); //设置大小写 font.setLetterSpacing(QFont::AbsoluteSpacing,5); //设置间距 QPainter painter(this); painter.setFont(font); //添加字体 QRectF ff(100,100,300,200); painter.drawRect(ff); painter.setPen(QColor(Qt::red)); painter.drawText(ff,Qt::AlignCenter,"yafeilinux"); } 效果如下。 这里的所有字体我们可以在设计器中进行查看。如下。 基于Qt 4.6 的Qt Creator 1.3.0 环境变量设置(原创) 如果你以前安装过visual studio 2005 之类的软件,那么装上Qt Creator 1.3.0 后,编译运行其自带的演示程序时就可能出现如下图的,105 个错误,几十个警 告的问题。 我们查看输出窗口,如下图。会发现它居然显示VC98 之类的东西,就是说它并 没有去自己的include 文件夹 中查找文件。我们可以怀疑是系统环境变量的问题了。 点击Qt Creator 界面左侧的projects 图标,查看工程信息。这里我们主要查看 编辑环境Buid Environment,点击其右侧的show Details。 可以看到其中的include 和lib 均指向了virtual studio 文件夹中,我们需要 将其改正。 将他们都改为自己Qt Creator 安装目录下的相关路径,如下图。(要换成你的 安装路径) 改完后会发现新的设置已经显示出来了。 我们查看下面的Run Environment,发现它已经自己改过来了。 回到编辑界面,右击工程文件,在弹出的菜单上选择Clean project,清空以前 的编译信息。 然后运行Run qmake,生成Makefile 文件。 最后,点击run 或者build 都可,这时程序已经能正常编译运行了。 基于Qt 4.6 的Qt Creator 1.3.0 写helloworld 程序注意事项(原创) 注意:下面指的是在windows 下,linux 下的情况可进行相应改变 昨天Qt 4.6 和Qt Creator 1.3.0 正式版发布了,但是如果以前用过旧版本,就 可能出一些问题。 1.用debug 方式 如果你以前用了Qt 4.5 的Qt Creator,并且将QtCored4.dll,QtGuid4.dll, mingwm10.dll 等文件放到了C 盘的system 文件夹下。那么请先将它们删除,不 然编译不会通过。 编译完helloworld 程序后,如果要直接执行exe 文件,需要将安装目录(新版 Qt)下的qt/bin 目录下的QtCored4.dll,QtGuid4.dll,mingwm10.dll,和 libgcc_s_dw2-1.dll(这个是新增的)文件放在exe 文件夹中。或者将它们放到 系统的system 文件夹下。 2.选择release 方式 编译程序后生成exe 文件 1.需要Qt 安装目录下的qt/bin 目录中的QtGui4.dll ,Qt Core4.dll, libgcc_s_dw2-1.dll 以及mingwm10.dll 四个文件的支持,将它们拷贝到exe 文 件目录下。 2.程序中默认只支持png 图片,如果使用了gif,jpg 等格式的文件是显示不出 来的。需要将Qt 安装目录下的qt/plugins/目录中的imageformats 文件夹拷贝 到exe 文件目录下(注意是整个文件夹)。而imageformats 文件夹中只需要保 留你需要的文件,例如你只需要支持gif 文件,就只保留qgif4.dll 即可。 ‘Qt Creator 发布release 软件相关注意事项(原创) 注意:环境是windows 选择release 编译程序后生成exe 文件 1.需要Qt 安装目录下的qt/bin 目录中的QtGui4.dll 和 Qt Core4.dll 以及 mingwm10.dll 三个文件的支持,将它们拷贝到exe 文件目录下。 2.程序中默认只支持png 图片,如果使用了gif,jpg 等格式的文件是显示不出 来的。需要将Qt 安装目录下的qt/plugins/目录中的imageformats 文件夹拷贝 到exe 文件目录下(注意是整个文件夹)。而imageformats 文件夹中只需要保 留你需要的文件,例如你只需要支持gif 文件,就只保留qgif4.dll 即可。 Qt Creator 的 error: collect2: ld returned 1 exit status 问题 利用Qt Creator 1.2.1( Built on Sep 30 2009 at 05:21:42)编译 程序经常会出现error: collect2: ld returned 1 exit status 的错误,但是 自己的程序没有一点问题,怎么回事呢? 如果这时退出软件,再重新进入,打开刚才的工程,重新编译, 就不会出现刚才的错误了。这应该是Qt Creator 软件的问题吧! 后来发现是因为上次执行的程序还在运行,你打开windows 的任 务管理器中的进程可以看见你刚才运行的程序还在执行,我们看不见,是因为它 在后台执行着。出现这个现象,是因为你写的代码的问题,比如在main 函数里 用了w.show();语句,就可能出现界面一闪而过,但它并没有关闭,而是在后台 运行,所以再次运行时就会出错。我们可以在资源管理器中将该进程关闭,或者 像上面那样直接关闭Qt Creator。 示例: #include #include "widget.h" #include "logindlg.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); loginDlg m; if(m.exec()==QDialog::Accepted) { Widget w; w.show(); } return a.exec(); } 执行后就会在后台运行。这时如果修改了代码再次运行程序,就会出现上面的错 误。 在任务管理器中可以看见自己的程序: 将该进程结束,然后在重新运行,就不会出错了。 正确的代码应该这样写: int main(int argc, char *argv[]) { QApplication a(argc, argv); loginDlg m; Widget w; if(m.exec()==QDialog::Accepted) { w.show(); return a.exec(); } else return 0; //关闭整个程序 } 这样新建的对象w 就不是局部变量了,这样运行程序w 表示的窗口不会一闪而过, 会一直显示。程序也不会再出现上面的错误了。 QT 常用问题解答(转) 本文是我前几天一个网友告诉我的,当时看了感觉好,就保存下来。今天再次查 看,感觉有必要把文章分享给各位学习QT 的朋友,因为网上好用的QT 资源真的 好少。 1、如果在窗体关闭前自行判断是否可关闭 答:重新实现这个窗体的closeEvent()函数,加入判断操作 Quote: void MainWindow::closeEvent(QCloseEvent *event) { if (maybeSave()) { writeSettings(); event->accept(); } else { event->ignore(); } } 2、如何用打开和保存文件对话 答:使用QFileDialog Quote: QString fileName = QFileDialog::getOpenFileName(this); if (!fileName.isEmpty()) { loadFile(fileName); } Quote: QString fileName = QFileDialog::getSaveFileName(this); if (fileName.isEmpty()) { return false; } 3、如果创建Actions(可在菜单和工具栏里使用这些Action) 答: Quote: newAct = new QAction(QIcon(":/images/new.png"), tr("&New"), this); newAct->setShortcut(tr("Ctrl+N")); newAct->setStatusTip(tr("Create a new file")); connect(newAct, SIGNAL(triggered()), this, SLOT(newFile())); openAct = new QAction(QIcon(":/images/open.png"), tr("&Open..."), this); openAct->setShortcut(tr("Ctrl+O")); openAct->setStatusTip(tr("Open an existing file")); connect(openAct, SIGNAL(triggered()), this, SLOT(open())); saveAct = new QAction(QIcon(":/images/save.png"), tr("&Save"), this); saveAct->setShortcut(tr("Ctrl+S")); saveAct->setStatusTip(tr("Save the document to disk")); connect(saveAct, SIGNAL(triggered()), this, SLOT(save())); saveAsAct = new QAction(tr("Save &As..."), this); saveAsAct->setStatusTip(tr("Save the document under a new name")); connect(saveAsAct, SIGNAL(triggered()), this, SLOT(saveAs())); exitAct = new QAction(tr("E&xit"), this); exitAct->setShortcut(tr("Ctrl+Q")); exitAct->setStatusTip(tr("Exit the application")); connect(exitAct, SIGNAL(triggered()), this, SLOT(close())); cutAct = new QAction(QIcon(":/images/cut.png"), tr("Cu&t"), this); cutAct->setShortcut(tr("Ctrl+X")); cutAct->setStatusTip(tr("Cut the current selection's contents to the " "clipboard")); connect(cutAct, SIGNAL(triggered()), textEdit, SLOT(cut())); copyAct = new QAction(QIcon(":/images/copy.png"), tr("&Copy"), this); copyAct->setShortcut(tr("Ctrl+C")); copyAct->setStatusTip(tr("Copy the current selection's contents to the " "clipboard")); connect(copyAct, SIGNAL(triggered()), textEdit, SLOT(copy())); pasteAct = new QAction(QIcon(":/images/paste.png"), tr("&Paste"), this); pasteAct->setShortcut(tr("Ctrl+V")); pasteAct->setStatusTip(tr("Paste the clipboard's contents into the current " "selection")); connect(pasteAct, SIGNAL(triggered()), textEdit, SLOT(paste())); aboutAct = new QAction(tr("&About"), this); aboutAct->setStatusTip(tr("Show the application's About box")); connect(aboutAct, SIGNAL(triggered()), this, SLOT(about())); aboutQtAct = new QAction(tr("About &Qt"), this); aboutQtAct->setStatusTip(tr("Show the Qt library's About box")); connect(aboutQtAct, SIGNAL(triggered()), qApp, SLOT(aboutQt())); 4、如果创建主菜单 答:采用上面的QAction 的帮助,创建主菜单 Quote: fileMenu = menuBar()->addMenu(tr("&File")); fileMenu->addAction(newAct); fileMenu->addAction(openAct); fileMenu->addAction(saveAct); fileMenu->addAction(saveAsAct); fileMenu->addSeparator(); fileMenu->addAction(exitAct); editMenu = menuBar()->addMenu(tr("&Edit")); editMenu->addAction(cutAct); editMenu->addAction(copyAct); editMenu->addAction(pasteAct); menuBar()->addSeparator(); helpMenu = menuBar()->addMenu(tr("&Help")); helpMenu->addAction(aboutAct); helpMenu->addAction(aboutQtAct); 5、如果创建工具栏 答:采用上面的QAction 的帮助,创建工具栏 Quote: fileToolBar = addToolBar(tr("File")); fileToolBar->addAction(newAct); fileToolBar->addAction(openAct); fileToolBar->addAction(saveAct); editToolBar = addToolBar(tr("Edit")); editToolBar->addAction(cutAct); editToolBar->addAction(copyAct); editToolBar->addAction(pasteAct); 6、如何使用配置文件保存配置 答:使用QSettings 类 Quote: QSettings settings("Trolltech", "Application Example"); QPoint pos = settings.value("pos", QPoint(200, 200)).toPoint(); QSize size = settings.value("size", QSize(400, 400)).toSize(); Quote: QSettings settings("Trolltech", "Application Example"); settings.setValue("pos", pos()); settings.setValue("size", size()); 7、如何使用警告、信息等对话框 答:使用QMessageBox 类的静态方法 Quote: int ret = QMessageBox::warning(this, tr("Application"), tr("The document has been modified.\n" "Do you want to save your changes?"), QMessageBox::Yes | QMessageBox::Default, QMessageBox::No, QMessageBox::Cancel | QMessageBox::Escape); if (ret == QMessageBox::Yes) return save(); else if (ret == QMessageBox::Cancel) return false; 8、如何使通用对话框中文化 答:对话框的中文化 比 如说,QColorDialog 的与文字相关的部分,主要在qcolordialog.cpp 文件 中,我们可以从qcolordialog.cpp 用 lupdate 生成一个ts 文件,然后用自定 义这个ts 文件的翻译,再用lrelease 生成一个.qm 文件,当然了,主程序就要 改变要支持多国语言了, 使用这个.qm 文件就可以了。 另外,还有一个更快的方法,在源代码解开后有一个目录translations,下面 有一些.ts, .qm 文件,我们拷贝一个: Quote: cp src/translations/qt_untranslated.ts ./qt_zh_CN.ts 然 后,我们就用Linguist 打开这个qt_zh_CN.ts,进行翻译了,翻译完成后, 保存后,再用lrelease 命令生成qt_zh_CN.qm, 这样,我们把它加入到我们的 qt project 中,那些系统的对话框,菜单等等其它的默认是英文的东西就能显 示成中文了。 9、在Windows 下Qt 里为什么没有终端输出? 答:把下面的配置项加入到.pro 文件中 Quote: win32:CONFIG += console 10、Qt 4 for X11 OpenSource 版如何静态链接? 答:编译安装的时候加上-static 选项 Quote: ./configure -static //一定要加static 选项 gmake gmake install 然后,在Makefile 文件中加 static 选项或者在.pro 文件中加上QMAKE_LFLAGS += -static,就可以连接静态库了。 11、想在源代码中直接使用中文,而不使用tr()函数进行转换,怎么办? 答:在main 函数中加入下面三条语句,但并不提倡 Quote: QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8")); QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8")); 或者 Quote: QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK")); QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GBK")); QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK")); 使用GBK 还是使用UTF-8,依源文件中汉字使用的内码而定 这样,就可在源文件中直接使用中文,比如: Quote: QMessageBox::information(NULL, "信息", "关于本软件的演示信息", QMessageBox::Ok, QMessageBox::NoButtons); 12、为什么将开发的使用数据库的程序发布到其它机器就连接不上数据库? 答:这是由于程序找不到数据库插件而致,可照如下解决方法: 在main 函数中加入下面语句: Quote: QApplication::addLibraryPath(strPluginsPath"); strPluginsPath 是插件所在目录,比如此目录为/myapplication/plugins 则将需要的sql 驱动,比如qsqlmysql.dll, qsqlodbc.dll 或对应的.so 文件放 到 /myapplication/plugins/sqldrivers/ 目录下面就行了 这是一种解决方法,还有一种通用的解决方法,即在可执行文件目录下写 qt.conf 文件,把系统相关的一些目录配置写到qt.conf 文件里,详细情况情参 考Qt Document Reference 里的qt.conf 部分 13、如何创建QT 使用的DLL(.so)以及如何使用此DLL(.so) 答:创建DLL 时其工程使用lib 模板 Quote: TEMPLATE=lib 而源文件则和使用普通的源文件一样,注意把头文件和源文件分开,因为在其它 程序使用此DLL 时需要此头文件 在使用此DLL 时,则在此工程源文件中引入DLL 头文件,并在.pro 文件中加入 下面配置项: Quote: LIBS += -Lyourdlllibpath -lyourdlllibname Windows 下和Linux 下同样(Windows 下生成的DLL 文件名为yourdlllibname.dll 而在Linux 下生成的为libyourdlllibname.so。注意,关于DLL 程序的写法, 遵从各平台级编译器所定的规则。 14、如何启动一个外部程序 答:1、使用QProcess::startDetached()方法,启动外部程序后立即返回; 2、使用QProcess::execute(),不过使用此方法时程序会最阻塞直到此方法执 行的程序结束后返回
测试等级:3级. 一.更新内容: 1.增加员工赠送限额,根据后台参数可配置为按日、周、月结算(按日结算时,每天日结处理时更新已赠送金额为0,按周结算时,每周一日结处理时更新已赠送金额为0,按月结算,每月1号日结处理时更新已赠送金额为0)。 2.增加BillServer同步机制,可以把收银服务器的包厢状态同步到星云服务器。 3.去掉了点单的打印按钮。 4.出品查询与帐单查询中打印的酒水单增加[补打]。 5.咨客台以及收银台的销售经理可以手工输入名字(该名字可以不是已经建好的员工信息)。 6.结账时,打折人可以手工输入名字(该名字可以不是已经建好的员工信息),且折扣数不限制(对于具体的折扣数,该场子会通公文的形式给定具体人员的最低折扣数) {功能使用说明:当后台参数"是否允许手工输入员工姓名 "设置为"允许"时以上两个功能同时生效。 5、在预订界面(包括收银系统和咨客系统)和开房界面输入销售经理、定位人、 包厢公主等信息时,可以通过“CTRL+TAB”在快速输入(即原来的输入法) 和手工输入(可以自由输入)之间切换,且在员工信息表中自动添加新的记录。 在业绩查询里都可以查到相应的记录。 6、结帐时打折人名字可以随意输入,且任何输入的名字都不限制折扣系数。} 7.增加了单独对包厢和包厢类别的服务费设置,当后台参数设置为收取“服务费”时包厢设置的服务费才能起作用,三处服务费的优先级从高到低排列为:包厢信息设置(具体的每一个包厢)、包厢类别设置(对一类包厢的设置)、后台参数(所有包厢) 包厢信息设置与包厢类别设置中若服务费设置为0表示无效,自动进入下一个优先级的服务费。 8.修改了消费结帐界面,增大消费信息列表。 9.营业收入统计界面中增加酒水帐单明细。 10.在点单录入、赠品管理、外卖冲帐窗口中增加物品拼音筛选功能(在条码输入框中输入拼音首字母)。 11.开房套餐改为可以退单。 12.在酒水退单查询中加一个补打的功能,并且能按查询出来的数据进行汇总打印。 13.增加了一种退单模式--点单模式退单(原退单模式仍然保留,通过后台参数控制,可选择退单模式)。关于点单模式退单的说明:此种模式下退单并不改动原先点的酒水单,而是生成了新的酒水单,只是数量为负数,和点的酒水单一样执行出品、领用的过程。 14.增加了对模特送花的功能,此功能需要星云7.4SP2配合使用。 15.在结帐单中把单价和点单类别都相同的酒水合并计算。 16.对于大厅点单增加了一种模式“先结帐再出品”,增加后台参数控制,选择此模式后,大厅点单传单后,需要结帐完吧台才能出品大厅的酒水单。 17.在结帐单中增加一列“单类”,此列值对应关系如下:开房套餐--配送,点单录入中勾上“配送”后点的酒水--配送,点单酒水--点单,点单为从物品例送的酒水--例送,赠品管理中赠送的酒水--赠送 18.日报表打印去掉了原来的“花环”列,增加了一列“折扣率”。 19.员工伪密码(假帐查询密码)为空时系统自动判断为无效。 20.咨客增加了客人信息管理。 21.大厅赠品改为可以直接赠送,不需要先点单才能赠送。 22.修改了大厅点单的模式。 23.增加公关台票充值管理,即公关帐户先存一定金额,每次上台系统自动从该公关帐户上扣取固定的金额. 24.增加公关视频编号,配合星云7.4SP2支持公关视频播放. 25.咨客增加设置“故障”房. 26.咨客系统主界面,显示每个包厢的价格、最低消费( 注:如果是分场次的,主界面显示包厢价和最低消费只显示晚场的) 27.包厢预订后在包厢界面上显示定位人或销售经理(预订时有销售经理则显示销售经理,没有销售经理而有定位人则显示定位人) 28.咨客增加带客功能,各系统增加带客状态. 29.酒水赠送单增加赠送人打印(仅自定义打印有效). 30.结帐单增加打印预订人(即定位人). 31.包厢右键菜单中增加了一项消费浏览,可查看包厢当前消费的酒水信息. 32.修改了结帐锁定的模式,避免程序异常退出造成包厢无法点单. 33.增加挂帐管理系统,具体问题:例如 客户20号消费500,结帐方式:挂帐,要求在21号的时候客户拿现金来充帐 34.后台增加参数控制赠送单是否执行例送规则. 35.结账单付款方式由如消费500元,原来的‘付款方式:现金+信用卡’改为‘付款方式:现金(200)+信用卡(300)’,具体实现各种付款方式的具体金额.(仅自定义) 36.大厅传单服务员刷卡,完成传单过程,电脑需自动把这笔酒水业绩算入该服务员上.(该功能通过后台参数控制). 37.增加后台参数控制结帐时对会员卡和打折卡的折扣率调整(卡设置中的折扣为最低折扣,结帐时可以根据实际消费情况调整折扣率). 38.包厢结帐界面,增加当前结帐包厢的:已赠送物品总金额、赠送金额占总消费金额的百分比. 39.增加赠送限制:可以设置每个包厢的最大赠送金额(例送物品和配送物品不算在该限额中,赠送限额设置为0表示不控制限额). 40.当包厢以结帐重开模式开房时,不自动赠送套餐. 41.包厢前台物品显示的排序可以根据客户的要求随意更改,比如按照价格高低,或者指定排序,在物品编码中设置. 42.结帐界面现金自动计算,比如在消费的物品和赠送的物品互换后,还有输入调整金额或输入免单金额后. 43.在换房时,根据实际计费模式确定换房窗口是否显示新包厢费,如计费方式中有包含包厢费则显示,没有则不显示. 44.增加后台参数控制例送主物品是否累加,实现同一个帐单分几次点的物品也可以累加算例送. 45.查询分析中增加一项预订查询,可以查询到有效的预订信息(不包含已经取消预订的). 46.增加后台打印参数,控制结帐单中,退单酒水是否独立显示. 47.会员卡支持star tcp400 可视信息复写卡(厚卡)读写器. 48.日报表,帐单查询,营业收入中各种费用统一,具体如下:{费用合计(实收金额)=现金(已经包含预付费)+会员卡+储值卡+信用卡+抵用券+支票} { 应收金额=现金(已经包含预付费)+会员卡+储值卡+信用卡+抵用券+支票+挂帐+免单+折扣=实收金额+免单+挂帐+折扣} 49.酒水单的下单员值统一为服务员. 50.营业收入中增加两列:调整费用和赠送金额. 51.增加包厢内买单申请功能(需要配合星云系统特殊M包和皮肤). 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.进入退单默认为当前选中的包厢. 79.主界面的包厢按拼音排序. 80.主界面右键菜单增加“点单,赠送,退单”这些操作. 81.增加"消费清单"打印,若后台参数“结帐是否自动打单”选是,则结帐界面的打单按钮打印出来的结帐单中的实收金额、实收现金、付款方式三项的值为空,标题也改为“消费清单”. 82.增加寄存系统的权限控制. 83.修改了寄存系统的界面. 二.修改的BUG: 1.不分场次开房,且员工编号为0开头时,销售经理未保存进数据库的问题。 2.点单录入直接出品打印两张单子的问题。 3.大厅坐台,两张以上帐单,且有的单出品了,有的未出品时,点单赠送丢单问题 4.大厅点单直接结帐帐单号不连续的问题。 5.结帐锁定功能使用一次后就不能使用的问题。 6.点单录入同一张单子点某个有例送的物品,再点另一个物品,再点上述有例送的物品累加数量时不例送的问题。 7.员工登陆窗口修改密码时,可以把密码和假帐查询密码修改成相同的。 8.数据清理时没有把退酒水单记录清除的问题。 9.大厅点单丢结帐单的问题。 10.赠品直接出品时把该包厢酒水单都出品掉的问题。 11.出品不打单时不自动出品的问题。 12.修改模式退单时,帐单作废后生成的酒水退单记录错误的问题. 13.前台开房套餐单类错误的问题. 14.更换赠送人赠送后,退单,引起人员已赠送金额错误的问题. 15.会员消费查询余额错误的问题. 16.会员积分规则改为不满一分的金额不积分. 17.界面下方岗位值显示为权限组的问题. 18.帐单补打时收银员值错误的问题. 19.员工表导出EXCEL时,员工号中以0开头的都变成整数的问题,如001导出成1了. 20.公关集体签到连续签到出错的问题. 21.物品编码是否启用在前台点单时没有屏蔽的问题. 22.换房后没有把新房间的历史帐单打上标志的问题. 23.包厢超过200个启动billserver会弹一个错误框的问题. 24.修改了假帐密码登陆后无法进入"营业收入"和"日报表"的问题. 25.修改了吧台自动出品自动打单时,打印最后一张酒水单会出错的问题. 26.修改了包厢费为0不能换房的问题. 27.修改了打折后有些数字无法全额挂帐的问题. 28.修改了同时对一张预定单进行撤消预定和预定转房出错的问题. 29.修改了同时对一张帐单结帐和点单操作出错的问题. 30.修改了盘点单审核时更新历史盘点单的问题. 视易神通收银系统(夜总会版)V3.0 + SP1 What’s New ===================================== 增加的功能: 1.会员卡根据积分设置自动升降级 2.某个收银点打开结帐界面,其他收银、吧台以及前台无法点酒水和退酒水 3.盘点表增加Excel导出功能 4.增加出品刷卡功能(在包厢里头点了酒水以后,在出品台处有专门的酒水员, 当出品台接受到包厢里头的点播酒水的需求以后,打开出品窗口,酒水员通过自己的一张射频卡或者别的卡进行刷卡验证后, 酒水自动出品并且打单,同时酒水员的名字出现在出品单上),根据后台参数设置出品是否需要刷卡(如选择自动出品则不需要刷卡) 5.结帐单中的酒水增加按物品类别小计项目(根据后台参数控制是否打印) 6.出品查询增加打印酒水出品单功能 7.后台增加参数包厢右上角显示金额可选 8.日报表打印增加预付款合计 9.物品入库明细单增加一项合计金额 解决的BUG: 1.点单时点了有例送的物品,且出品方式不同的,未按出品方式生成酒水单 2.物品盘点单审核后退出程序再进入显示未审核 3.解决出品两次的问题 4.解决出品打印串单的问题 5.员工业绩中销售经理业绩未按实收金额计算的问题 6.结帐打单锁定的时候没有锁定时间的问题 7.公关系统组长资料、清洁工资料、DJ资料中射频卡号可以重复的问题 8.寄存系统修改密码的问题 9.物品盘点时库存小于等于0的没有盘点的问题 10.出品不打单时自动出品功能失效的问题 11.日结与空置包厢时把有预订的包厢变为空置的问题 12.员工岗位新增或修改输入重复名字的岗位出错的问题 13.前台查询酒水点单时没有屏蔽未启用的物品 14.前台机顶盒点单有时例送设置失效的问题 2006-09-20 视易神通收银系统(夜总会版)V3.0 What’s New ===================================== 一、增加需求 1、在开房时,增加“赠送套餐”选择框,默认为后台包厢维护设置的套餐类型; 2、在“酒水销售”的销售明细,打出的单据中加入房间名称; 3、类似量贩功能,增加结帐重开功能,在后台参数设置“结帐后包厢处理状态”;若状态为“已结帐关闭点播系统”或“空置关闭点播系统”,则可以结帐重开,不再重复收取最低消费,只收钟点费; 4、结帐时,增加一个计算器功能。收银结帐时,要能够输入 实收金额,然后系统自动计算出找补数目;例如应收金额为78元,当客人交给收银员100元,系统要能计算出还应该找给客人 22元; 5、在“会员信息”增加“服务密码”,在“会员信息查询”通过“服务密码”查询是否存在会员名称与该服务密码匹配; 6、在“会员信息”增加会员个人基本情况:传真,邮箱,服务密码等,在查询统计的“会员信息”增加会员详细信息的查询,例如住址、电话(手机号码),传真,邮箱,积分,剩余金额等等; 7、在“出品查询”中,增加一个房间号,可以用“包厢名称”和“录入员”,“时间段”来查询; 8、在‘查询统计’-‘会员信息’里的会员消费信息查询里加入会员的消费明细。具体加入每单消费明细‘包厢号’‘帐单号’‘消费金额’‘结帐日期’; 9、在“酒水退单”里,赠送商品在该商品名称后加“(赠送)”加以区别,以便在执行退单操作时,赠送物品不能退钱; 10、在后台参数设置中增加“有未结帐信息时是否可以日结”的选项;若选择“可以”则在有未结帐单情况下照样可以日结,日结之前的算上一天,之后的算下一天;若选择“不可以”则有未结帐单情况下不能日结; 11、在“查询统计”的“员工业绩”的“服务员业绩明细”,“销售明细”,如果物品是赠送的,则酒水金额显示为“0”; 12、在“物品编码”的“大类设置”中增加一项“是否计入客损”,并在后台参数设置增加“客损物品是否在前台显示”的选项来控制; 13、在“点单录入”时,选择酒水后直接退出或“清除”的时候不删单; 二、修改问题: 1、在“物品编码”的“大类设置”中,若删除某大类时,该大类所属的物品还未删除,则提示“先删除该大类所属物品再进行删除”的提示信息; 2、提高库存查询输入日期条件的容错性,若后台设置的库存查询日期超过该月最大日期,则将进入“库存查询”时,自动调整到该月的最大日期; 3、修改了“在库存查询中,输入物品类型(提供了“简拼输入”),执行查询后,返回空记录。”的问题; 4、修改了“物品编码”的“物品参数设置”的物品名称对应的拼音长度大于10会出错”的问题; 5、修改了“员工登录修改密码时,如果员工号为空,修改密码后会把所有员工卡号为空的人员的密码都修改”的问题,设置员工密码不能为空; 2006-08-17 视易神通收银系统(夜总会版)V2.0 What’s New ===================================== 1、在收银程序主界面窗口左上方中新增一个“自动出品”选项,当有出品权限的员工登录后,勾取该功能可以实现自动出品,不需在象之前版本需要打开“吧台管理 - > 吧台出品”窗口弹出才能实现自动出品功能; 2、在后台参数设置中增加一个选项,可以结帐单的打印收银员栏中选择显示“收银员工号”还是“收银员姓名”; 3、在日报表中增加总计显示; 4、增加一种钟点费的计费方式,计费方法,如下面描述: 小于多少分钟(用x表示)不计费,大于X分钟按单位时间多少分钟(用y表示)计费。之后消费时间若小于ny+x 分钟按ny分钟计费,若大于ny+x分钟按(n+1)y分钟计费(n为正整数)。增加了会员充值后,自动打印会员充值单的功能。 举例说明:设置“小于9分钟不计费,大于9分钟按单位时间60分钟计费”,那么具体费用如下: 消费9分钟 费用为0 消费10分钟 费用为1个小时的费用 消费69分钟 费用为1个小时的费用 消费70分钟 费用为2个小时的费用 以此类推 5、在结帐窗口中新增加显示“损坏赔偿”一拦,在结帐时可以手动输入,当有损坏赔偿时将会在结帐打印单显示。 6、解决了8000前台开房无法录音的问题。 7、之前的版本中,设置“开房赠送酒水”时操作很麻烦,需每天一个一个房间地进行赠送。改进为可先到‘基础数据->套餐设置’中先设置套餐类型、内容,再到‘基础数据->包厢设置’中包厢类别、信息维护中选择相应所要设置的选项,这样在点单设置中可以对所有包厢按需求一次性进行“开房赠送酒水”操作。 8、实现可以单独备份和恢复酒水相关数据,这个数据与星云点播系统分离。 9、增加了退单时的打印功能。 10、增加了会员充值后,自动打印会员充值单的功能。 11、针对大厅卖酒水(吧台-大厅点单)可以计入员工业绩,在‘点单录入’窗口中有选择‘服务员’销售金额和酒水数量,对已结帐的包厢进行统计。 12、在主界面上增加“是否显示呼叫声音和动画”选项。 13、报表计算金额原计算方式是:实收金额=应收金额,现在修改为:实收金额=应收金额-免单-折扣-挂账; 14、增加一个“赠送需要按赠送人统计”的功能,可在‘查询统计->酒水销售’中的‘员工赠送酒水统计’中查询每个人员在选定时间内所赠送的金额。 15、改进帐单作废功能,作废后不但库存退回去,酒水也从酒水销售中去掉。 16、“日报表的打印汇总表打印出来很宽,超出了A4范围(一张纸的左边和右边都有内容没有打出来),通过在打印设置中修改设置没有效果”的问题。 17、“日报表的打印汇总表,使用ESPON300K+打印机,直接打印可以打出来(但有上面问题1的问题),但是进入预览后,再点击上面的打印设置(扳手图标),程序和操作系统都不响应了,只能重新启动电脑”的问题。 18、在“收银管理”的权限设置中可以设置“结帐管理”权限,该权限具有设置“故障房”的权限。 19. 支持低于单位时间按单位时间消费的打折功能。 20. 在主程序的标题栏中增加了是版本信息(注册版还是演示版)。 21. 后台参数设置中增加一个设置项:打印开房条时可以控制是否需要打印客人签名。 22. 结帐单打印内容中增加打印“付款方式”。 23. 积分兑换中兑换某个会员积分时,积分界面不显示会员卡号(适用于没有进行过写卡操作的会员)。 24. 配送功能中新增了按配送类单独为一个查询条件的查询功能,在物品参数管理中增加“是否可配送”的配置项。 25. 服务费金额为0时在结帐单不显示。 26. 收银管理中增加销售经理和包厢公主这个职务,方便在开房的选择相应人员。 27. 在主界面窗口右上方增加一个可选呼叫声音选项,如果不勾取,就取消了呼叫声音;如果勾取该选项,恢复呼叫声音。 28. 服务费率在结帐的时候可以手工输入。 29. 酒水销售查询的汇总统计中增加一条合计汇总信息。 30. 在点单录入的模块中,同一种商品在一单中可以多次点单,打印时,点多少次就打印多少条的明细,不是累计的数量。 31. 结帐的时候,调整金额支持输入负数。 32. 在帐单查询处增加酒水单补打功能。 33. 入库单据增加一个合计金额。 34. 在结帐时,可以调整计费方式。 35. 转房操作时候新增加转房条打印功能。 36. 在帐单查询和日报表里面增加显示“并房费用”。 37. 支持在TBY-210B针式打印机(使用较窄的75mm宽度的打印纸)上打印结帐单。 38.不满单位时间按单位时间计算时如果后台未设置打折信息,结帐时无法按单位时间计算的问题。 39.解决了并房操作时,并房前的包厢出品的酒水单不能退的问题。 40、修改“营业收入统计”窗口中‘打印’功能,只打印其合计费用而没有将其所有包厢费用明细打印出来 41、在“员工业绩统计”窗口中新增‘员工赠送酒水统计’功能 42、在“酒水销售查询”窗口中新增按‘出品机器’名查询功能 43、在“点单录入”窗口中进行点单操作‘落单’时其出品帐单上其‘打单时间’现显示日期和时间 44、在“会员信息”窗口中新增一个‘会员充值查询’功能 45、解决了结帐单打印的时其中间分割栏的那个“-----------”虚线比其它偏长的问题 46、解决夜总会1.11SP2版本,结帐单的“物品名称”“单位”“单价”那一行非常偏左,导致其下面的物品明细不对称问题 47、解决在物品明细中点击全部显示按钮会报错 48、解决在套餐设置中选择最后一条物品信息时无法保存 2006-03-28 视易神通收银系统(夜总会版)V1.11+SP1 What’s New ===================================== 1、修改结帐单(注意不是修改日报表)的内容及排版方式,在结帐的时候,实收金额跟应收金额按客户的要求进行计算。 2、增加一个新的功能——积分兑换,实现会员通过充值或者兑换来改变积分。 3、后台增加一个参数“会员卡结算方式” a)会员卡充值支付:就是保留原来的会员卡充值处理方式; b)会员卡现金支付:是指会员卡可以无须充值,用现金支付,但是会员卡可以用来打折或者用来累计积分。 4、在查询统计的酒水销售里,按区域(楼层)进行查询。 5、在参数设置中设置的钟点费结算方式容易引起误解,现在修改该项的说明文字,表达更清晰; 6、在读卡处增加一个手工输入卡号,可以实现打折卡打折功能,会员打折时只要提供卡号即可打折,不必非要进行刷卡; 7、在点单录入处增加一个“配送”选项,勾取该选项就可以实现配送功能,货物单价为零; 2005-12-31 视易神通收银系统(夜总会版)V1.11 What’s New ===================================== 1、增加了咨客系统。 2、增加了公关管理系统。 3、增加了VIP密码设置。 2005-11-28
Access 2000数据库系统设计(PDF)---025目 录译者序前言第一部分 Access基础第1章 Access 2000的新增功能 11.1 Access 2000透视 11.2 用Office Web组件部署数据访问页 21.2.1 Office Web 组件 21.2.2 DAP演示测试. 31.2.3 DAP设计模式 51.3 为Microsoft数据引擎创建 Access数据项目 51.3.1 新的ADP工具和对象 61.3.2 NorthwindCS项目和da Vinci工具箱的深入研究 61.4 OfficeVBA编辑器和Access的集成 91.5 DAP和DHTML的HTML源编辑器 101.6 浏览和编辑子数据表中的相关记录 111.7 使Jet和SQL Server 7.0/MSDE数据库相一致 111.8 Access在2000年问题上的改进 121.8.1 四位数年份选项设置 121.8.2 数据库窗口 131.8.3 窗体和报表 141.8.4 名称自动更正 151.8.5 与Office 2000相关的改进 151.9 安装Access 2000 171.9.1 Access 2000的初始安装 171.9.2 定制Access 2000 201.10 安装和配置Microsoft数据引擎 20 1.11 现实世界—为什么升级 23第2章 建立第一个Access 2000应用 252.1 理解Access的应用设计方法 252.2 从模板文件创建Access应用 262.3 熟悉联系管理应用 292.3.1 数据库窗口中的表对象 292.3.2 切换面板窗体 322.3.3 Access窗体 332.3.4 Access报表 352.3.5 Access模块 362.4 使用切换面板管理器 382.5 探索窗体设计视图和VBA类模块 392.6 现实世界—所学知识的透视 40第3章 Access导航 423.1 理解Access功能和模式 423.1.1 定义Access功能 423.1.2 定义Access操作模式 443.2 理解Access的表显示 443.2.1 最大化文档窗口 463.2.2 把文档窗口最小化为图标 473.2.3 表数据表视图中的工具栏 483.2.4 工具栏自定义 503.2.5 右击快捷方式菜单 523.3 使用功能键 533.3.1 全局功能键 533.3.2 字段、网格和文本框的功能键分配 533.4 设置默认的选项 543.4.1 系统默认值 553.4.2 数据表视图的默认值 583.5 使用Access帮助 593.5.1 上下文相关的帮助 593.5.2 “帮助”菜单 603.5.3 Microsoft Access的帮助窗口 613.5.4 “Office助手” 643.6 使用“数据库实用工具” 663.6.1 压缩和修复数据库 673.6.2 将数据库转换为Access 2000格式 683.6.3 将数据库转换为Access 97格式 693.6.4 添加切换面板窗体 693.6.5 创建.mde文件 703.7 疑难解答 703.8 现实世界—HTML帮助或者障碍 71第4章 使用Access数据库和表 724.1 定义Access数据库的元素 724.2 理解关系型数据库 744.3 使用Access数据库文件和表 754.3.1 Access系统数据库 754.3.2 Access 库数据库 754.4 创建一个新数据库 754.5 理解表和字段的属性 774.6 选择字段数据类型、大小和格式 804.6.1 为数值和文本数据选择字段大小 814.6.2 选择显示格式 834.6.3 使用输入掩码 874.7 使用Northwind Traders示例数据库 884.8 向现有的数据库添加一个新表 904.8.1 设计Personnel Actions表 914.8.2 创建Personnel Actions表 934.8.3 在数据表视图中直接创建一个表 964.9 设置字段的默认值 964.10 使用关系、关键字字段和索引 974.10.1 建立表之间的关系 984.10.2 实施参照完整性 1004.10.3 选择一个主键 1014.10.4 往表中添加索引 1024.11 改变字段和关系 1044.11.1 重新安排表中字段的顺序 1044.11.2 改变字段数据类型和大小 1054.11.3 改变表之间的关系 1064.12 复制和粘贴表 1074.13 疑难解答 1084.14 现实世界—数据库战略和表战术 108第5章 输入、编辑和验证表中的数据 1105.1 在Access表中输入测试数据 1105.2 使用键盘操作进行数据输入和编辑数据 1105.2.1 创建Northwind.mdb的试验用复本 1115.2.2 使用数据输入和编辑键 1115.2.3 用于Windows剪贴板操作的组合键 1125.2.4 在字段和文本框上使用快捷键 1135.2.5 设置数据输入选项 1145.3 向表中添加记录 1145.4 选择、追加、替换和删除表记录 1155.5 验证数据输入 1165.5.1 添加字段级有效性规则 1165.5.2 添加表级有效性规则和使用表达式生成器 1185.6 向Personnel Actions表添加记录 1195.7 输入Personnel Actions表数据和测试有效性规则 1205.8 疑难解答 1215.9 现实世界—批量数据输入 121第6章 排序、查找和筛选表中的数据 1236.1 理解排序和筛选的作用 1236.2 排序表的数据 1236.2.1 冻结表中某个字段的显示 1246.2.2 在单个字段上排序数据 1246.2.3 在多个字段上排序数据 1256.2.4 删除表排序次序和解冻列 1256.3 查找表中的匹配记录 1266.4 自动地替换匹配的字段值 1276.5 筛选表数据 1286.5.1 按选定内容筛选 1286.5.2 按窗体筛选 1306.5.3 高级筛选和排序 1326.5.4 添加一个多字段排序和复合筛选准则 1326.5.5 使用复合准则 1346.5.6 将筛选保存为查询与筛选的加载 1356.6 定制数据表视图 1366.7 复制、导出和邮寄排序和筛选后的数据 1386.8 疑难解答 1396.9 现实世界—基于计算机的排序和搜索 139第7章 链接、导入和导出表 1417.1 从其他应用或者向其他应用移动数据 1417.2 理解Access如何处理其他数据库文件格式的表 1427.2.1 识别PC数据库文件格式 1437.2.2 链接和导入外部 ISAM表 1437.2.3 用ODBC链接Visual FoxPro表 1457.2.4 处理外部文件中的图像 1487.2.5 将字段数据类型转换为Access数据类型 1497.2.6 使用链接表管理器加载项重新链接表 1507.2.7 导入表和将数据库文件链接为表 1507.3 导入和链接电子数据表文件 1517.3.1 通过导入Excel工作表创建一个表 1517.3.2 链接Excel工作表 1567.4 使用Microsoft Outlook和Exchange文件夹 1567.4.1 用Outlook导出和导入Jet 4.0表 1577.4.2 使用Exchange/Outlook向导的链接 1597.5 导入文本文件 1607.5.1 使用导入文本向导 1617.5.2 导入文本向导的高级选项 1637.5.3 使用分隔文本文件 1657.5.4 处理宽度固定的文本文件 1667.5.5 追加文本数据到一个现有的表 1677.6 使用剪贴板导入数据 1677.6.1 向一个表粘贴新记录 1687.6.2 通过从剪贴板上粘贴来替换记录 1707.7 从Access表导出数据 1717.7.1 通过Windows剪贴板导出数据 1717.7.2 将数据导出为一个文本文件 1727.7.3 以其他文件格式导出数据 1737.8 疑难解答 1737.9 现实世界—Microsoft的付出与回报 175第二部分 最大限度地利用查询第8章 设计Access 查询 1778.1 查询简介 1778.2 “简单查询向导”的使用 1778.3 使用查询设计窗口 1798.3.1 为查询选择字段 1808.3.2 按准则选择记录和排序显示 1828.3.3 创建更为复杂的查询 1838.3.4 改变查询列标题的名字 1848.3.5 将查询作为报表进行打印 1868.3.6 使用查询的数据 1878.4 创建其他的查询类型 1888.4.1 创建和使用简单的生成表操作查询 1888.4.2 向生成表查询添加参数 1908.5 疑难解答 1918.6 现实世界—查询设计优化 191第9章 理解查询操作符和表达式 1939.1 编写表达式作为查询准则和数据验证依据 1939.2 理解表达式中的元素 1949.2.1 操作符 1949.2.2 文字 1979.2.3 标识符 1989.2.4 函数 1989.2.5 固有的和命名常数 2059.3 创建Access表达式 2059.3.1 创建默认值的表达式 2069.3.2 使用表达式进行数据有效性验证 2069.3.3 作为查询准则的表达式 2069.3.4 计算查询字段值的表达式 2109.3.5 表达式的其他用途 2129.4 疑难解答 2129.5 现实世界—Access表达式代数学 212第10章 创建多表查询和交叉表查询 21410.1 介绍表的连接 21410.2 连接表以创建多表查询 21510.2.1 创建传统的单列等值连接 21610.2.2 为查询结果集指定排序次序 21810.2.3 使用表之间的间接关系创建查询 21910.2.4 创建多列等值连接和选择唯一值 22010.3 使用表中的查找字段 22210.3.1 用查阅向导添加外部键下拉列表 22210.3.2 向一个表添加固定值查找列表 22510.4 向表或者查询添加子数据表 22610.4.1 表子数据表 22710.4.2 查询子数据表 22810.5 外连接、自连接和Theta连接 23010.5.1 创建外连接 23010.5.2 创建自连接 23110.5.3 创建带准则的不相等Theta连接 23210.6 用查询更新表中的数据 23310.6.1 确定你是否能更新查询的特性 23310.6.2 用查询字段属性窗口格式化数据 23410.7 使表的所有字段都可以被访问 23510.8 在多个记录上创建计算 23510.8.1 使用SQL的聚集函数 23510.8.2 基于表中所有记录进行计算 23610.8.3 基于表中被选定的记录进行计算 23810.9 设计参数查询 24010.9.1 向月销售量查询添加一个参数 24010.9.2 指定参数的数据类型 24110.10 创建交叉表查询 24210.10.1 使用向导生成一个季度产品销售交叉表查询 24210.10.2 设计一个月产品销售交叉表查询 24510.10.3 使用固定列标题的交叉表查询 24610.11 从其他数据库中的表创建查询 24710.12 疑难解答 24810.13 现实世界—优化多表查询 249第11章 用操作查询修改数据 25111.1 操作查询入门 25111.2 用生成表查询创建新表 25111.2.1 设计和测试选择查询 25211.2.2 将选择查询转换为生成表查询 25311.2.3 为新表建立关系 25411.2.4 使用新的tblShipAddresses表 25511.3 创建操作查询向一个表中追加记录 25611.4 用操作查询从一个表中删除记录 25711.5 更新表中多个记录的值 25811.6 测试级联删除和更新 26111.6.1 创建测试表和建立关系 26111.6.2 测试级联删除 26211.6.3 测试级联更新 26211.7 疑难解答 26311.8 现实世界—操作查询之外的选择 26311.8.1 浏览模式更新 26411.8.2 基于窗体的更新 26411.8.3 用SQL语句进行更新 26411.8.4 用SQL Server存储过程进行更新 265第三部分 设计窗体和报表第12章 创建和使用窗体 26712.1 理解Access窗体和控件的角色 26712.2 使用窗体向导创建事务处理窗体 26812.2.1 为窗体选择数据源 26812.2.2 用窗体向导创建基本窗体 26812.3 使用窗体设计窗口 27212.3.1 窗体设计窗口的元素 27312.3.2 窗体设计工具栏按钮和菜单选择 27312.3.3 格式工具栏 27512.3.4 窗体的默认值 27512.3.5 使用自动套用格式 27612.3.6 改变对象的颜色 27712.4 选择、编辑、移动窗体元素和控件 28112.4.1 改变窗体页眉和窗体页脚的大小 28212.4.2 选择、移动和缩放单个控件 28212.4.3 将控件和网格对齐 28312.4.4 选择和移动多个控件 28312.4.5 对齐一组控件 28412.4.6 使用Windows 剪贴板和删除控件 28412.4.7 改变控件的颜色和边框样式 28512.4.8 改变控件的内容 28512.4.9 使用格式刷 28612.5 重新安排Personnel Actions窗体 28612.5.1 设置主窗体的属性 28712.5.2 设置子窗体的属性 28812.6 使用事务处理窗体 28912.6.1 窗体视图中的工具栏按钮 28912.6.2 使用Personnel Actions窗体 29012.6.3 向Personnel Actions表追加新记录 29012.6.4 编辑现有的数据 29212.6.5 提交和回退对表的改变 29212.7 在测试之后修改窗体或者控件的属性 29212.7.1 为数据输入而改变字段的次序 29212.7.2 从Tab键次序中删除字段 29312.8 现实世界—窗体设计技巧 293第13章 设计自定义多表窗体 29613.1 扩展你的窗体设计技能 29613.2 了解Access工具箱 29613.2.1 控件分类 29613.2.2 工具箱 29713.2.3 Access的控件向导、生成器和工具栏 29813.3 使用工具箱添加控件 30013.3.1 创建作为主窗体基础的查询 30113.3.2 创建一个具有页眉和页脚的空白窗体 30213.3.3 向窗体页眉上添加一个标签 30313.3.4 格式化文本和调整文本控件的大小 30413.3.5 创建绑定、多行、计算文本框 30513.3.6 改变属性的默认视图和获取帮助 30813.3.7 用向导添加选项组 30813.3.8 使用剪贴板复制控件到其他窗体 31113.3.9 使用组合和列表框 31213.3.10 创建一个组合框来查找特定的记录 31813.3.11 创建选项卡控件 32013.3.12 改变控件类型 32413.4 完成主Personnel Actions Entry窗体 32413.5 使用子窗体/子报表向导创建子窗体 32613.6 修改连续窗体的设计 32813.7 覆盖表的字段属性 32913.8 为打印窗体添加页眉和页脚 33013.9 疑难解答 33013.10 现实世界—Access的向导化 331第14章 打印基本报表和邮件标签 33314.1 理解窗体和报表之间的关系 33314.2 Access 报表类型的分类 33414.3 用“报表向导”创建分组报表 33414.4 使用Access的报表窗口 33814.5 使用自动套用格式和自定义报表样式 34014.6 修改基本的“报表向导”报表 34014.6.1 删除、重新部署和编辑现有的控件 34014.6.2 向报表添加计算控件 34514.6.3 对齐和格式化控件并调整行间距 34714.7 传统报表的边距调整和打印 35014.8 通过组的保持同页属性防止出现孤立的记录 35114.9 将多列报表作为邮件标签打印 35214.10 疑难解答 35314.11 现实世界—虚拟的无纸办公室 354第15章 高级报表 35515.1 从头开始创建报表 35515.2 报表数据的分组与排序 35515.2.1 分组数据 35615.2.2 数据分组排序 35815.3 从空白报表开始 35915.3.1 将一个报表用作一个子报表 35915.3.2 创建Monthly Sales by Category报表 36115.4 集成子报表 36415.4.1 向绑定报表添加链接子报表 36415.4.2 使用未链接子报表和未绑定报表 36615.5 自定义报表 36715.5.1 添加和删除报表的节 36715.5.2 分页控制以及打印页眉和页脚 36815.5.3 减少报表的长度 36815.6 向报表添加其他控件 36815.7 邮递报表快照 36915.8 疑难解答 37015.9 现实世界—报表设计的技巧 371第四部分 在Intranet和Internet上发布数据第16章 超级链接和HTML 37316.1 允许数据传送的Web页面 37316.2 Microsoft的Internet程序透视 37416.2.1 数字神经系统和Windows DNA 37516.2.2 Microsoft的Internet相关的客户端产品 37616.2.3 Microsoft的服务器方组件 37816.2.4 Microsoft支持Internet相关产品的技术 37816.3 用超级链接在Web和Intranet中导航 37916.4 理解Access 2000的超级链接字段数据类型 38216.4.1 测试Northwind Orders表中的超级链接 38216.4.2 编辑和插入传统的超级链接 38416.4.3 链接到一个Word文档的书签 38416.4.4 指定到Intranet Server或者Web上的页面的超级链接 38716.4.5 为超级链接添加屏幕提示 38816.4.6 使用表超级链接打开一个Access对象 38816.5 在Access控件上使用超级链接 38916.6 指定其他Internet URL 39016.7 疑难解答 39116.8 现实世界—到Internet或者不到Internet 391第17章 从表和查询生成Web页面 39317.1 简化基于Web的决策支持方式 39317.2 将表和查询数据表导出到HTML 39317.2.1 创建一个非格式化的Web页面 39517.2.2 从一个查询创建 Web页面 39817.3 使用HTML模板 39917.3.1 使用包含在Office 2000中的AccessHTML模板 39917.3.2 用模板导出一个查询数据表 40117.4 将报表导出到HTML 40217.5 从HTML表导入数据 40417.6 创建动态 Web页面 40617.6.1 理解ASP 40717.6.2 为ASP创建一个ODBC数据源 40817.6.3 将Access查询导出为ASP 40817.7 疑难解答 41017.8 现实世界—ASP和DAP 410第18章 设计数据访问页 41218.1 转向一个新的Access窗体模型 41218.2 理解Access的动态HTML实现 41318.2.1 支持DHTML和DAP的技术 41318.2.2 DOM HTML和DHTML 41418.3 DAP入门 41518.3.1 Review Products页 41518.3.2 Review Orders页 41818.3.3 HTML源代码编辑器 41918.3.4 Analyze Sales数据透视表页 42018.3.5 Sales页 42118.3.6 读写页 42318.4 使用“数据页向导”创建简单的DAP 42418.5 使用自动创建数据页创建纵栏式DAP 42718.5.1 使用记录浏览控件的筛选和排序特征 42818.5.2 修改自动创建数据页DAP的设计 42918.5.3 改变记录浏览控件的属性 43118.6 从头开始创建DAP 43218.6.1 用页字段列表添加一个数据透视表 43218.6.2 数据透视表列表控件在IE 5.0中的使用 43318.6.3 在IE5.0中更改透视表的属性 43418.7 用数据透视表列表向DAP添加图表 43518.7.1 为数据透视表列表创建一个查询 43518.7.2 添加和格式化数据透视表列表 43718.7.3 使用图表向导向数据透视表列表绑定一个Office 图表 43818.8 生成分组页 44018.8.1 创建一个三级层次分组页结构 44018.8.2 填充明细内容 44218.8.3 添加相关表的字段和标题 44318.9 疑难解答 44418.10 现实世界—DAP准备好大展宏图了吗? 444第五部分 集成Access与其他Office 2000应用程序第19章 往窗体和报表中添加图表和图形 44719.1 用图形丰富窗体和报表 44719.2 用Microsoft Graph 2000创建图形和图表 44719.2.1 创建作为图形基础的查询 44819.2.2 使用“图表向导”创建非链接图形 44919.2.3 更改图形的设计特征 45219.2.4 从交叉表查询中创建图形 45519.2.5 把图形链接到表或查询中的单个记录上 45719.3 在页中使用图表Web控件 45819.3.1 为图表Web控件设计查询 45919.3.2 添加基于单数据列系列的office图表 45919.3.3 更改Office图表的属性 46219.4 往窗体或报表中添加未绑定对象控件 46319.4.1 在Personnel Actions查询中包含相片 46319.4.2 在Personnel Actions窗体中显示雇员的图像 46319.4.3 缩放图形对象 46519.4.4 检查位图图像文件格式 46619.5 使用图像控件 46719.6 疑难解答 46819.7 现实世界—可视化数据 468第20章 与Microsoft Excel一起使用Access 47020.1 用数据透视表切分数据 47020.2 使用Access的数据透视表向导 47020.2.1 为数据透视表创建查询 47120.2.2 用向导产生一个数据透视表窗体 47220.3 在Excel中处理数据透视表 47520.3.1 提高数据透视表的格式化程度 47520.3.2 用数据透视表切分数据 47720.3.3 通过筛选进行切分 47820.3.4 折叠或展开明细数据的显示 47920.3.5 更改维的坐标轴 48120.4 格式化数据透视表报表 48120.5 从数据透视表中创建数据透视图表 48220.6 把Excel用作OLE服务器 48420.6.1 在窗体中嵌入常规的Excel工作表 48420.6.2 从OLE对象中抽取值 48620.6.3 链接到Excel工作表中一定范围的单元格 48720.7 疑难解答 48920.8 现实世界—OLAP和数据透视表 489第21章 与Microsoft Word和邮件合并一起使用Access 49221.1 集成Access 2000和Word 2000 49221.2 使用Access邮件合并向导 49221.2.1 创建和预览新套用信函 49221.2.2 使用已有的主合并文档及新数据源 49421.3 与Access数据库一起使用Word 2000的邮件合并功能 49721.3.1 用Microsoft查询和ODBC数据源来创建新的邮件合并数据源 49721.3.2 从已有查询创建套用信函 50121.4 在Access表中嵌入或链接Word文档 50221.4.1 在表中嵌入或链接Word 2000文档 50321.4.2 创建窗体以显示被嵌入文档 50421.5 疑难解答 50621.6 现实世界—Microsoft查询和OLE DB 506第六部分 使用高级Access技术第22章 关系数据库设计与实现的研究 50922.1 查看Access 2000新增的数据库设计功能 50922.2 集成对象和关系数据库 51022.3 理解数据库系统 51022.3.1 数据库设计的目标 51022.3.2 数据库设计过程 51122.3.3 数据库设计的面向对象方法 51222.3.4 数据库术语 51422.3.5 关系数据库中表和关键字的类型 51522.4 数据建模 51522.4.1 应用数据库 51622.4.2 主题数据库 51622.4.3 图表化数据模型 51722.4.4 数据库模式 51722.5 把数据规范化到关系模型 51822.5.1 规范化规则 51822.5.2 关系类型 52222.6 使用Access 2000的“表分析器向导” 52522.7 用数据库文档管理器创建数据字典 52822.8 使用Access索引 52922.9 实施数据库完整性 53022.9.1 保证实体完整性和可审计性 53022.9.2 维护参照完整性 53322.10 疑难解答 53322.11 现实世界—为什么学习关系理论? 533第23章 结构化查询语言 53523.1 理解Access 2000中SQL的角色 53523.2 使用Access学习SQL 53623.3 理解SQL语法 53723.4 用SQL编写SELECT查询 53723.4.1 使用SQL标点号和符号 53923.4.2 使用SQL语句创建Access查询 53923.4.3 使用SQL聚集函数 54123.4.4 用SQL创建连接 54223.4.5 使用联合查询 54323.4.6 实现子查询 54523.5 编写操作和交叉表查询 54623.6 添加IN以使用其他数据库中的表 54623.6.1 操作其他Access数据库 54723.6.2 对其他数据库类型使用IN子句 54823.6.3 用Jet DDL创建表 54823.6.4 比较ANSI和Jet SQL 54923.6.5 Access中SQL保留字 54923.6.6 对应于SQL关键字的Jet SQL保留字 54923.6.7 用于替代ANSI SQL关键字的Access函数和操作符 55023.6.8 不存在于ANSI SQL中的Jet SQL保留字、操作符和函数 55123.6.9 Jet 的 DISTINCTROW 和 SQL 的DISTINCT关键字 55223.6.10 Jet SQL保留字不支持的通用 ANSI SQL关键字和功能 55423.7 在窗体、报表和宏中使用SQL语句 55523.8 疑难解答 55523.9 现实世界—把SQL作为第二种语言 555第24章 多用户网络应用的安全 55824.1 网络化Access 2000应用程序 55824.2 在网络化环境下安装Access 55924.3 与其他用户共享你的Access数据库文件 55924.3.1 为文件共享创建一个文件夹和系统文件 55924.3.2 准备共享你的数据库文件 56224.3.3 为文件共享而拆分数据库 56224.3.4 修补链接、数据源和DAP的超链接 56424.3.5 用“工作组管理员”选择工作组 56524.4 使用命令行来打开共享数据库 56624.5 维护数据库安全 56824.5.1 指定局域网上数据库安全的原则: 56824.5.2 用密码保护单个数据库 56924.5.3 管理组和用户 57024.6 理解数据库对象所有权 57524.6.1 对象的所有者权限 57524.6.2 更改数据库对象的所有权 57524.7 授予和撤消对数据库对象的访问权限 57624.7.1 使用安全向导更改权限 57724.7.2 手工更改组权限 58024.7.3 给特定用户授予其他权限 58124.7.4 授予对其他工作组中某数据库的访问权限 58124.8 在网络上共享数据库 58224.8.1 在Windows 9x网络上共享数据库文件 58224.8.2 用户级安全共享文件 58324.8.3 共享来自网络服务器的数据库文件 58424.9 访问共享的工作组和数据文件 58424.9.1 粘附被共享的工作组系统文件 58524.9.2 刷新到共享数据文件的链接 58524.10 管理数据库和应用 58624.10.1 备份和恢复数据库 58624.10.2 压缩和修复数据库文件 58724.10.3 加密和解密数据库文件 58724.11 疑难解答 58824.12 现实世界—共享文件与客户/服务器后端 588第25章 创建Access数据项目 59025.1 将Access转变成客户/服务器模式 59025.2 理解MSDE的作用 59125.2.1 SQL Server版本与特性 59125.2.2 MSDE的优点 59225.3 安装与启动MSDE 59225.4 熟悉ADP 59525.4.1 适应MSDE与SQL Server 7.0的特性 59525.4.2 启动Northwind CS示例工程 59625.5 使用项目设计器 59725.5.1 MSDE表操作 59825.5.2 浏览MSDE视图 60025.5.3 图形化表关系 60225.5.4 编写存储过程 60325.5.5 为表添加触发 60425.6 使用升迁向导来创建ADP 60525.6.1 运行Access升迁向导 60525.6.2 检查向导成功还是失败 60725.7 使用DTS向导压缩数据库 60825.8 连接远程MSDE数据库 61025.8.1 使用SQL Server客户网络实用工具 61025.8.2 验证与使用远程数据库 61125.8.3 建立MSDE安全 61225.9 疑难解答 61325.10 现实世界—尝试中的 ADP 61425.10.1 ADP的缺陷 61425.10.2 SQL Server 的优点:ADP、MSDE和SQL Server 7.0 614第七部分 Access应用的程序设计和转换第26章 编写VBA代码 61726.1 理解VBA在Access中的作用 61726.2 介绍VBA 6.0 61826.2.1 在什么情况下使用VBA代码 61826.2.2 VBA命名习惯 61826.2.3 模块、函数和子过程 61926.2.4 模块元素 62026.2.5 VBA和Access模块的引用 62126.2.6 VBA中数据类型和数据库对象 62226.2.7 变量和命名习惯 62326.2.8 符号常量 62726.2.9 VBA命名的可选参数 62826.3 控制程序流 62826.3.1 转移和标号 62926.3.2 条件语句 62926.3.3 重复操作:循环 63126.4 处理运行错误 63326.4.1 使用Err对象查找错误类型 63426.4.2 在窗体或者报表模块中使用Error事件 63426.5 浏览VBA编辑器 63526.5.1 模块窗口的工具栏 63526.5.2 模块快捷键 63626.5.3 VBA帮助系统 63726.6 检验实用工具函数模块 63726.6.1 向IsLoaded()函数中加一个断点 63826.6.2 用Debug对象把结果输出到立即窗口 63926.6.3 使用文本比较选项 64026.7 现实世界—宏的应用 640第27章 理解通用数据访问、OLE DB和ADO 64227.1 透视Microsoft新的数据访问组件 64227.2 与多种数据源的接口 64327.2.1 用OLE DB自底向上重新设计 64327.2.2 将OLE DB接口映射到ADO 64527.2.3 比较ADO和DAO对象 64627.3 创建ADODB.Recordsets 64727.4 用代码将控件绑定到记录集 64927.5 使窗体可修改 65027.5.1 连接到NorthwindCS MSDE数据库 65127.5.2 用DAO3.6代替ADO2.1 65127.6 浏览顶层ADO属性、方法和事件 65227.7 与ADODB.Connection对象一起工作 65427.7.1 Connection的属性 65427.7.2 Errors集合和Error对象 65627.7.3 Connection的方法 65727.7.4 Connection事件 65927.8 使用ADODB.Command对象 66027.8.1 Command对象的属性 66027.8.2 Parameters集合 66127.8.3 Parameter对象 66127.8.4 Command方法 66327.8.5 把参数值传递给存储过程的代码 66427.9 理解ADODB.Recordset对象 66627.9.1 Recordset的属性 66627.9.2 Fields集合和Field对象 66927.9.3 Recordset的方法 67127.9.4 断开连接的Recordset 67427.9.5 Recordset事件 67427.10 疑难解答 67527.11 现实世界—努力学习和使用ADO 675第28章 用VBA6.0响应事件 67728.1 介绍事件驱动的编程 67728.2 理解类模块的角色 67728.2.1 Main Switchboard类模块 67828.2.2 在Main Switchboard窗体中的事件处理代码 67928.3 在对象浏览器和项目浏览器中检查工程类模块成员 68128.4 通过命令按钮向导添加事件处理代码 68228.5 用函数来响应事件 68428.6 理解Access 2000的事件指令集 68528.7 使用Access 2000的Docmd方法 68928.8 用命令条对象定制应用 69428.9 指定一个自定义CommandBar并设置其他启动属性 69628.10 用VBA引用Access对象 69728.10.1 引用打开的窗体或报表及其属性 69728.10.2 引用控件及其属性 69828.10.3 引用子窗体或主窗体中的控件 69928.11 使用另一种集合语法 69928.12 响应由窗体和控件触发的数据事件 69928.13 疑难解答 70128.14 现实世界—处理事件驱动的编程 701第29章 组合框和列表框编程 70229.1 流线型决策支持前台 70229.2 用组合框约束查询选择 70229.2.1 设计决策支持查询 70329.2.2 创建窗体并添加列表框 70329.2.3 向窗体添加查询组合框 70429.3 添加代码生成查询的SQL语句 70729.4 将组合框窗体转换成Access数据项目 70929.4.1 导入并测试组合框窗体 71029.4.2 使“行来源”SQL语句与Transact-SQL语句一致 71029.5 详化一个列表框选择 71229.5.1 创建详化查询和添加列表框 71229.5.2 详化列表框编程 71329.6 给列表框和组合框添加新的特征 71429.6.1 重复列表框数据项和选择一个数据项 71429.6.2 添加一个选项来选择所有国家或产品 71529.7 向ADP转移时处理Jet专有函数 71829.8 疑难解答 71929.9 现实世界—Access组合框和列表框 720第30章 使用ADO记录集、窗体和控件 72130.1 利用VBA操纵记录集 72130.1.1 生成临时记录集 72130.1.2 应用Move方法 72330.1.3 在循环中使用EOF和BOF 72330.1.4 使用AbsolutePosition属性 72430.2 使用Find方法和书签 72430.3 修改记录集的记录 72630.3.1 编辑和增加记录 72630.3.2 删除记录 72630.4 由记录集填充组合框 72730.4.1 创建frmCombo2并改变组合框设计 72730.4.2 用代码填充组合框 72830.5 改变组合框列表的排序 72930.6 由记录集对象填充列表框 73130.7 格式化值列表组合框的列 73330.8 将frmComboVBA导出到一个Access数据项目 73630.9 疑难解答 73730.10 现实世界—适应ADO 737第31章 Access 9x应用向Access 2000的转换 73831.1 理解.mdb文件升级过程 73831.2 把不安全文件从Access 9x转换到Access 2000 73831.2.1 在Access 2000中第一次打开文件时升级 73831.2.2 在Access 2000中打开文件后升级 74031.3 转换安全的Access 9x文件 74131.3.1 在一个混合的Access 9x和Access2000环境中进行升级 74131.3.2 升级后台数据库和工作组文件 74131.4 将Access 2.0应用文件.mdb升级为Access 2000 74131.4.1 Win16函数调用转换为Win32函数调用 74231.4.2 表上的32个索引限制 74331.4.3 将16位OLE控件转换为32位ActiveX控件 74431.5 疑难解答 74431.6 现实世界—升级的诱惑 744
目 录译者序前言第一部分 Access基础第1章 Access 2000的新增功能 11.1 Access 2000透视 11.2 用Office Web组件部署数据访问页 21.2.1 Office Web 组件 21.2.2 DAP演示测试. 31.2.3 DAP设计模式 51.3 为Microsoft数据引擎创建 Access数据 项目 51.3.1 新的ADP工具和对象 61.3.2 NorthwindCS项目和da Vinci工具 箱的深入研究 61.4 OfficeVBA编辑器和Access的集成 91.5 DAP和DHTML的HTML源编辑器 101.6 浏览和编辑子数据表中的相关记录 111.7 使Jet和SQL Server 7.0/MSDE数据库 相一致 111.8 Access在2000年问题上的改进 121.8.1 四位数年份选项设置 121.8.2 数据库窗口 131.8.3 窗体和报表 141.8.4 名称自动更正 151.8.5 与Office 2000相关的改进 151.9 安装Access 2000 171.9.1 Access 2000的初始安装 171.9.2 定制Access 2000 201.10 安装和配置Microsoft数据引擎 20 1.11 现实世界—为什么升级 23第2章 建立第一个Access 2000应用 252.1 理解Access的应用设计方法 252.2 从模板文件创建Access应用 262.3 熟悉联系管理应用 292.3.1 数据库窗口中的表对象 292.3.2 切换面板窗体 322.3.3 Access窗体 332.3.4 Access报表 352.3.5 Access模块 362.4 使用切换面板管理器 382.5 探索窗体设计视图和VBA类模块 392.6 现实世界—所学知识的透视 40第3章 Access导航 423.1 理解Access功能和模式 423.1.1 定义Access功能 423.1.2 定义Access操作模式 443.2 理解Access的表显示 443.2.1 最大化文档窗口 463.2.2 把文档窗口最小化为图标 473.2.3 表数据表视图中的工具栏 483.2.4 工具栏自定义 503.2.5 右击快捷方式菜单 523.3 使用功能键 533.3.1 全局功能键 533.3.2 字段、网格和文本框的功能键 分配 533.4 设置默认的选项 543.4.1 系统默认值 553.4.2 数据表视图的默认值 583.5 使用Access帮助 593.5.1 上下文相关的帮助 593.5.2 “帮助”菜单 603.5.3 Microsoft Access的帮助窗口 613.5.4 “Office助手” 643.6 使用“数据库实用工具” 663.6.1 压缩和修复数据库 673.6.2 将数据库转换为Access 2000格式 683.6.3 将数据库转换为Access 97格式 693.6.4 添加切换面板窗体 693.6.5 创建.mde文件 703.7 疑难解答 703.8 现实世界—HTML帮助或者障碍 71第4章 使用Access数据库和表 724.1 定义Access数据库的元素 724.2 理解关系型数据库 744.3 使用Access数据库文件和表 754.3.1 Access系统数据库 754.3.2 Access 库数据库 754.4 创建一个新数据库 754.5 理解表和字段的属性 774.6 选择字段数据类型、大小和格式 804.6.1 为数值和文本数据选择字段大小 814.6.2 选择显示格式 834.6.3 使用输入掩码 874.7 使用Northwind Traders示例数据库 884.8 向现有的数据库添加一个新表 904.8.1 设计Personnel Actions表 914.8.2 创建Personnel Actions表 934.8.3 在数据表视图中直接创建一个表 964.9 设置字段的默认值 964.10 使用关系、关键字字段和索引 974.10.1 建立表之间的关系 984.10.2 实施参照完整性 1004.10.3 选择一个主键 1014.10.4 往表中添加索引 1024.11 改变字段和关系 1044.11.1 重新安排表中字段的顺序 1044.11.2 改变字段数据类型和大小 1054.11.3 改变表之间的关系 1064.12 复制和粘贴表 1074.13 疑难解答 1084.14 现实世界—数据库战略和表战术 108第5章 输入、编辑和验证表中的数据 1105.1 在Access表中输入测试数据 1105.2 使用键盘操作进行数据输入和编辑数据 1105.2.1 创建No

87,910

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧