[CB]将窗体从属于主窗体

C#上位机多语言切换实现 按窗体名/全局名.语言代码.resx规则创建多语言资源文件,填充相同键不同语言的值;绑定资源到界面控件(WinForms 手动绑定 / WPF XAML 绑定);通过(WPF)设置语言文化;静态切换在程序启动前设置文化,动态切换在设置文化后重新加载控件资源即可完成界面刷新。 阅读详情
  几乎所有正式一点的C++ Builder程序除了主窗体外都还有从属窗体,有时是对话框,有时是无模式窗口。VCL使得创建和显示从属窗体都易如反掌。但不是所有程序都适于采用无模式窗体,有些程序需要在一个主窗体内显示不同的内容。本文讨论如何将一个从属窗体“寄居”于主窗体中,从属窗体看上去是主窗体的一部分,用户甚至不知道一个从窗体正被显示。图A显示了一个主窗体,其客户区是一个从窗体。



图A 客户区包含从属窗体的主窗体

理解子/父联系
  这类程序的基本思路是让所有从属窗体都作主窗体的子窗体,这种设计在其他框架(如OWL或MFC)中很常见,但在VCL程序中却不常见。VCL不允许简单地指定一下属性就使一个窗体从属于另一窗体,要做到这一点还得付出点小小的劳动。你得告诉Microsoft Windows从属窗体是主窗体的子对象,在C++ Builder编程中一般趋于认为窗体是窗口,元件是子对象,实际上从Windows的观点来看,窗体和元件都是窗口。可以将任一窗口
(窗体和元件)指定为另一窗口的子对象,只要你暂时跳出VCL圈子。

更好的“鼠夹”
  将一个窗体附属于一个主窗体的一个好处是你可以象设计任何其他从属窗体一样设计子窗体,就是说你创建一个新的窗体,在其上添加元件并书写这个窗体的代码。这样使得设计你的子窗体变得容易,并将所有操纵子窗体的代码集中在一个地方。

程序设计范例
  先给出一些程序的背景,程序名叫PARENTING,有一个主窗体,主窗体的顶部和底部各有一个工具条(Tool Bar)和状态条(Status bar),除主窗体外,还有两个子窗体,一个叫TTableForm,用栅格显示ANIMAL.DBF数据表,ANIMAL表是C++ Builder带的数据库样本的一个表。另一个子窗体TChartForm用TChart显示ANIMAL表。(如果你购买的C++ Builder是标准版则没有数据库元件)你可以通过点击菜单项或工具按钮来选择显示表单还是图形窗体,在你作出选择时,活动窗体被摧毁而被选窗体被显示,子窗体在主窗体的工具条下方、状态条上方的客户区显示,而且随主窗体大小变动而随时保持充满客户区。

重载CreateParams()
  如前所述,为让主窗体控制从属窗体,需要将主窗体设为从窗体的“父”,这可以通过重载CreateParams()方法来完成。CreateParams()在VCL创建与窗体联系的窗口时调用,CreateParams()的声明如下:
void __fastcall CreateParams(TCreateParams& Params);
CreateParams()的唯一参数是对一个TCreateParams结构体的引用。在VCL中TCreateParams定义如下:


struct TCreateParams
{
char *Caption;
int Style;
int ExStyle;
int X;
int Y;
int Width;
int Height;
HWND WndParent;
void *Param;
tagWNDCLASSA WindowClass;
char WinClassName[64];
};


  此结构包含了Windows创建一个窗口所需的所有信息(如果你曾用API进行Windows编程,你一定能意识到TCreateParams的成员对Windows CREATESTRUCT结构的映射)。在重载CreateParams()时,首先调用基类的CreateParams()方法,然后修改TCreateParams结构的个别成员变量。一个重载过的CreateParams()方法看起来大致如下:


void __fastcall TChartForm::CreateParams(TCreateParams& Params)
{
TForm::CreateParams(Params);
Params.Style=WS_CHILD|WS_CLIPSIBLINGS;
Params.WndParent=MainForm->Handle;
Params.X=0;
Params.Y=0;
Params.Width=MainForm->ClientRect.Right;
Params.Height=MainForm->ClientRect.Bottom;
}


  程序的关键是设置TCreateParams结构体的Style和WndParent成员,Style设WS_CHILD 和WS_CLIPSIBLINGS窗口式样,WS_CHILD指定窗口为另一窗口的子窗口。根据定义,一个子窗口是没有标题棒的,设计时的标题棒在Windows在运行时创建窗体会被去掉。WS_CLIPSIBLINGS保证主窗口的不同子窗口在窗体绘制时不互相干涉。很明显,一个子窗口必须得有一个父对象,通过将父窗口句柄指定给TCreateParams结构体WndParent 成员就指定了父对象,正如前面代码所示,WndParent成员设置为主窗体的Handle属性。鉴于指定父对象属性相对直接明了,我不在这个主题上深入更多。

设置子窗体的属性
  除了CreateParams()方法中的代码外,还得设置一些子窗体的属性,多数属性可以保留缺省值,但AutoScroll属性应设为false,当然,前提是你的窗体要设计为不必卷动的窗体风格。因为子窗口的大小和位置在CreateParams()中设定,所以Position属性可置为poDefault。Caption和BorderIcon属性将被忽略,故而无需指定。确保BorderStyle置为bsSizeable,还有BorderWidth置为0,如果此二属性设成其它值,子窗体与主窗体会不协调。

窗体的其它元件
  很多时候,除了从属窗体外,主窗体还包含别的元件,比如工具条和状态条,此时设置TCreateParams结构体的X、Y、Width和Height成员时得考虑到工具条和状态条,子窗体应与顶部的工具条和底部队状态条协调。因此设置TCreateParams结构体的成员的代码应该是:


Params.X=0;
Params.Y=MainForm->ToolBar->Height+1;
Params.Width=MainForm->ClientRect.Right;
Params.Height=(MainForm->StatusBar->Top-1)-Params.Y;


  注意Y设为工具条底部加1,子窗体宽度置为主窗体客户区宽度,高度根据子窗体和状态条的顶部计算,基本上为界于工具条底部和状态条底部之间的主窗体客户区。这些就是使从属窗体“寄居”于主窗体的所有要求,你可能还有其它想在子窗体中实现的特征,我将把这些特征的讨论留到后面。

设置主窗体
  主窗体也得进行设置以控制其“收留”的子窗体。首先需要将子窗体从自动创建窗体列表中去掉,需要时再创建它们。如果不从列表中去掉,则当你的应用程序启动时它们会自动显示。你还需要一个变量来跟踪当前的活动子窗体,在主窗体的Public区声明如下变量,TForm * ActiveChild; ActiveChild是公有的,因为子窗体要访问这个变量。我马上会演示如何使用这一变量。现在来书写显示子窗体的代码,先看下面程序行,然后我来解释。


void __fastcall TMainForm::Chart1Click(TObject *Sender)
{
if(ActiveChild)
delete ActiveChild;

TChartForm * form=new TChartForm(this);
ActiveChild=form;
form->Show();
Chart1->Checked=true;
Table1->Checked=false;
}


  此方法是主窗体的菜单项的OnClick处理句柄,猜的没错,这是在显示TChartForm子窗体。首先检查ActiveChild变量是否非0,如果有激活动子窗体ActiveChild将非0。如果ActiveChild不为0,删除此变量关联的指针以摧毁活动子窗体,否则程序会将子窗体一个接一个地堆叠在一起。接着创建一个TChartForm类的实例,将new操作返回到指针赋予ActiveChild变量,这样ActiveChild总是包含一个指向当前子窗体的指针。最后调用Sow()方法显示子窗体。最后两行代码确保代表表单或图形显示的菜单项显示一个选中标记。为完成ActiveChild变量的讨论,我得带你回到子窗体单元一会儿。每个子窗体都含有一个如下的OnClose事件的事件句柄:


void __fastcall TChartForm::FormClose(TObject *Sender,
TCloseAction &Action)
{
MainForm->ActiveChild=0;
MainForm->Chart1->Checked=false;
Action=caFree;
}


  注意当窗体被摧毁时,主窗体的ActiveChild被置为0,并将与子窗体关联的菜单项置为未选中。Action参数置为caFree,以通知VCL释放与此窗体关联的内存。你或许会疑惑为何FormClose句柄包含上面最后两行。答案是每个子窗体都有一个Close按钮用来关闭窗体,如果用Close按钮来关闭窗体,就需要释放内存和uncheck菜单项。

额外特征
  例子程序至少还有一个尚未讨论的特征,就是如果子窗体比主窗体大,要重新调整主窗体大小以容纳子窗体。这些语句放在子窗体的CreateParams()方法中。之前我展示过一个简单的CreateParams()例子,但没有放进调整主窗体大小的语句。列表B中有完整的CreateParams()方法,和先前展示唯一不同的是包含以下语句:


if(Width>MainForm->ClientWidth)
MainForm->ClientWidth=Width;
if(Height>(MainForm->StatusBar->Top-MainForm->ToolBar->Height))
MainForm->ClientHeight=Height+
MainForm->ToolBar->Height+
MainForm->StatusBar->Height ;


  这几条语句检查子窗体的宽度是否大于主窗体的ClientWidth属性,如果是,主窗体的ClientWidth置为子窗体的宽度。余下的几行作的是同样的事情,只不过针对的是主窗体的客户区高度而已。这些语句的结果是主窗体总是被调整到能完全容纳被显示的子窗体。范例程序还考虑了主窗体调整大小时的情况。如果主窗口大小有变化,子窗体大小也必须变化以进行充满主窗体的客户区。以下语句演示了主窗体的OnResize事件句柄:


void __fastcall TMainForm::FormResize(TObject *Sender)
{
if(ActiveChild)


{
ActiveChild->Width=ClientRect.Right;
ActiveChild->Height=(MainForm->StatusBar->Top-1)-
ActiveChild->Top;
}


}


  这些语句相当直接,无需我逐条解释。注意首先检查ActiveChild变量确保非0(即指向某子窗体),很明显如果当前没有激活任何子窗体,在OnResize中就什么都不用干。其余语句是CreateParams()中看到语句的变种,只是简单地计算子窗体的新尺寸并设置相应的Width和Height属性。

结语
  列表A包含了例子程序主窗体的代码。列表B示出了TChartForm单元的源码。头文件都没有给出因为没有什么有意义的语句,也未给出TTableForm单元的语句,因为与ChatForm单元类似。你可以在www.reisdorph.com下载例子程序。将子窗体“寄居”于主窗体提供了一种清晰的替代MDI的方法,对那些只能以无模式窗体形式向用户显示数据的程序也是一种替代,使用子窗体允许你使用窗体设计器设计你的从窗口,并将操纵子窗体的代码放在一个地方。


列表A:MAINU.CPP
#include <vcl.h>
#pragma hdrstop

#include "MainU.h"
#include "ChartU.h"
#include "TableU.h"

#pragma resource "*.dfm"
TMainForm *MainForm;

__fastcall TMainForm::TMainForm(TComponent* Owner)
: TForm(Owner)
{
//清0以防包含随机数
ActiveChild=0;
//打开数据表
Table->Active=true;
}

void __fastcall TMainForm::Table1Click(TObject *Sender)
{
if(Table1->Checked) return;
if(ActiveChild){
delete ActiveChild;
ActiveChild=0;
}

TTableForm *form=new TTableForm(this);
//将DBGrid的DBGrid::DataSource属性赋给数据源
form->DBGrid->DataSource=DataSource;
//跟踪活动子窗体
Active=form;
form->Show();
Table1->Checked=true;
Chart1->Checked=false;
}

void __fastcall TMainForm::Chart1Click(TObject *Sender)
{
if(Chart1->Checked) return;
if(ActiveChild){
delete ActiveChild;
ActiveChild=0;
}

TChartForm *form=new TChartForm(this);
Active=form;
form->Show();
Chart1->Checked=true;
Table1->Checked=false;
}

void __fastcall TMainForm::FormResize(TObject *Sender)
{
if(ActiveChild){
ActiveChild->Width=ClientRect.Right;
ActiveChild->Height=(MainForm->StatusBar->Top-1)-
ActiveChild->Top;
}
}

列表B:CHARTU.CPP
#include <vcl.h>
#pragma hdrstop

#include "ChartU.h"
#include "MainU.h"

#pragma resource "*.dfm"
TChartForm *ChartForm;

__fastcall TChartForm::TChartForm(TComponent* Owner)
: TForm(Owner)
{
}

void __fastcall TChartForm::CreateParams(TCreateParams& Params)
{
//调用基类CreateParams方法
TForm::CreateParams(Params);
//子窗口类型
Params.Style=WS_CHILD|WS_CLIPSIBLINGS;
//设置父为主窗体
Params.WndParent=MainForm->Handle;

Params.X=0;
if(Width>MainForm->ClientWidth)
MainForm->ClientWidth=Width;
if(Height>(MainForm->StatusBar->Top-MainForm->ToolBar->Height))
MainForm->ClientHeight=Height+
MainForm->ToolBar->Height+
MainForm->StatusBar->Height;
Params.Y=MainForm->ToolBar->Height+1;
Params.Width=MainForm->ClientRect.Right;
Params.Height=(MainForm->StatusBar->Top-1)-Params.Y;
}

void __fastcall TChartForm::FormClose(TObject *Sender,
TCloseAction &Action)
{
MainForm->ActiveChild=0;
MainForm->Chart1->Checked=false;
Action=caFree;
}

void __fastcall TChartForm::CloseBtnClick(TObject *Sender)
{
Close();
}
【FreeRTOS】FreeRTOS 源码学习笔记 (3)队列 及 xQueueGenericSend分析 引言 本篇又不写调度器了,准备先整理整理“队列“,无他,就觉得这个很有用,自己写应用层代码的时候,队列要用的比较多,之前一直用一个自己写的环形buffer,里面nReadIndex,nWriteIndex,nFreeIndex来管理总觉得不够“官方”,这次看到一个如此成熟的队列,还是忍不住先分析一下。 ... 阅读详情

相关推荐

Qwen2.5-7B大模型实战:从零部署到高效推理全流程解析

本文详细解析了Qwen2.5-7B大模型从零部署到高效推理的全流程。内容涵盖环境准备、模型下载、使用Transformers进行核心对话推理,并深入介绍了vLLM与TGI生产级服务部署、GPTQ/AWQ量化技术以降低显存消耗,以及llama.cpp、Ollama等本地推理方案。旨在帮助开发者快速掌握部署技巧,实现大模型在消费级硬件上的高效运行。

weixin_29061425的博客 491

关于CreateParams的参数

procedure CreateParams(var Params: TCreateParams); override;参数定义如下: TCreateParams = record Caption: PChar; Style: DWORD; ExStyle: DWORD; X, Y: Integer; Width, Height: Integer; Wnd...

weixin_30301183的博客 691

PCIe 物理层(Physical Layer)详解

PCIe物理层关键技术解析 PCIe物理层作为协议栈底层核心,承担着比特流传输、链路训练与电气特性管理等关键功能。该层采用分层架构,包含逻辑物理层(负责编解码/加扰)和电气物理层(处理信号收发)。关键技术亮点包括: 智能链路管理:通过LTSSM状态机实现11种状态转换,涵盖链路检测(Detect)、协商(Polling/Configuration)、功耗管理(L0s/L1)等全生命周期控制 高效编码方案:Gen1/Gen2采用8b/10b编码(20%开销),Gen3+升级为128b/130b(仅1.5%开销

珂珂可爱多 730

将窗体从属于主窗体

将窗体从属于主窗体麦罗 几乎所有正式一点的C++ Builder程序除了主窗体外都还有从属窗体,有时是对话框,有时是无模式窗口。VCL使得创建和显示从属窗体都易如反掌。但不是所有程序都适于采用无模式窗体,有些程序需要在一个主窗体内显示不同的内容。本文讨论如何将一个从属窗体“寄居”于主窗体中,从属窗体看上去是主窗体的一部分,用户甚至不知道一个从窗体正被显示。图A显示了一个主窗体,其客户区是一个从

近山者仁 1938

Ubuntu桌面消失?可能是lightdm配置在捣鬼:详细解析/etc/lightdm.conf的优先级机制与实战修复

本文详细解析了Ubuntu系统因lightdm显示管理器配置错误导致桌面消失的问题。通过分析/etc/lightdm.conf的优先级加载机制,提供了从systemctl诊断、调试模式运行到实战修复配置语法错误(如缺失[Seat:*]组)的完整方案。文章还探讨了在系统无法启动时使用chroot或恢复模式进行高级救援,并对比了lightdm与gdm3在NVIDIA驱动环境下的不同表现,帮助用户高效恢复图形界面。

weixin_29313547的博客 420

支付宝周期扣款实战:从签约到主动扣款的完整Java代码与避坑指南

本文详细介绍了支付宝周期扣款功能的完整Java实现流程,从协议签约到主动扣款的各个环节,包括业务模型设计、签约接口实现、异步通知处理、主动扣款技术等关键步骤。针对开发中常见的陷阱和问题,提供了实用的避坑指南和代码示例,帮助开发者高效实现连续支付功能,提升用户留存率。

weixin_27199085的博客 378

Delphi 组件渐进开发浅谈(三)——锦上添花

  转载请指明出处来源。       3.锦上添花3.1.对齐属性Alignment  T[x]CustomEdit类没有提供左右对齐属性,这令人很不爽。也许在我们现在的生活中,文字基本都是左对齐的,但数值输入输出如果是右对齐的话就更理想了。  阅读StdCtrls文件,TCustomLabel、TCustomCheckBox、TRadioButton、TCustomMemo、TCustomStaticText均具有Alignment属性。  其中TCustomCheckBox、TRadioButton的A

溪亭淡月 1125

告别“为了写而写”:GJB438C-2021新规下,软件文档如何真正为项目服务?

本文深入解析GJB438C-2021新规如何重构软件文档的实战价值,通过文档体系瘦身、流程再造和敏捷化实践,显著提升军工软件项目的效率。新标准删除30%冗余文档,引入动态编制法和轻量化模板,使文档编制工作量降低37%,关键路径周期缩短15%。

weixin_30765577的博客 448

Delphi的Hint入门指导

Delphi中使用提示是如此简单,只需将欲使用Hint的控件作如下设置:   ShowHint := True;   Hint := ‘提示信息’;   不必写一行代码,相当方便。   但有时我们又想自己定制提示的效果,使其看起来更美观更具个人特色,没关系,Delphi完全有办法让你写出自己喜欢的Hint效果。   Delphi的Hint功能实现归类在Applicatio

wozengcong的专栏 3298

WiFi偏门协议(四):增强的传输机制802.11aa

区分Unicast和Multicast的优先级,以及设定不同的重传次数,以细化EDCA机制。 SCS(StreamClassification Service) 如上图,在VI,VO内各自又增加了一个queue, 对应不同的MAC header。VI和VO内的两个queue可以分别对应UC和MC。这样就提供了同一个AC内的更细粒度的优先级区分。当然还可以使用Drop Eligibility Indication子域来区分不同的重传次数。 改善Multicast数据传...

reekyli的专栏 1794

Yolov5自定义图片训练测试及模型调优(详细过程)

Yolov5自定义数据训练及测试1. 图像数据获取、标注2. 数据集划分及准备3. 配置训练参数,准备训练:3.1 修改data/训练配置xxx.yaml文件:3.2 修改models模型配置xxx.yaml文件4. 开始训练5. 测试训练后的模型: 1. 图像数据获取、标注 如果自定义训练自己的数据集,首先需要数据标注,至于数据来源可以是下载现有的开发数据集、拍照、爬虫等等。 如果是拍照、爬虫等获取的数据图片,需要进行数据标注,这个过程可以使用工具来做,但也需要一些手动操作 。。并且图片越多越好,如果

HowieXue 薛永浩的博客 10万+

.Net创建MDI窗体

多文档界面 (MDI) 应用程序的基本元素是 MDI 子窗体,因为它们是用户交互的中心。在下面的过程中,将创建显示 RichTextBox 控件的 MDI 子窗体,该子窗体类似于大多数字处理应用程序。将 RichTextBox 控件替换为其他控件(如 DataGrid 控件或混合控件)使您得以创建各种可能的 MDI 子窗口(而且进一步扩展为 MDI 应用程序)。创建

andi2009loveyou的专栏 875

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

让MessageBox弹出在当前窗体的中央,而不是在屏幕的中央

WinForm中默认的MessageBox默认的弹出位置在屏幕的center,而且没有属性可以修改它,所以在当前活动窗体不在中央时,将会出现,弹出的MessageBox的错位,如下: 而我们有时需要的是这样: 昨天看到Codeproject上有一篇文章:《Centering MessageBox, Common DialogBox or Form on applications》, ...

ribishuangba 240

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

C# 子窗体中调用父窗体中的方法(或多窗体之间方法调用)

看似一个简单的功能需求,其实很多初学者处理不好的,很多朋友会这么写: C# Code: //父窗体是是frmParent,子窗体是frmChildA //在父窗体中打开子窗体 frmChildA child = new frmChildA(); child.MdiParent = this; child.Show(); //子窗体调父窗体方法: //错误的调用!!!!!!!! (this....

热爱生活、热爱技术、热爱记录~ 2695

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

窗体winforn的学习

展示数据列表,模拟 Windows 资源管理器,支持大图标、列表、详细表格等展示方式。,是 Windows 应用程序的主窗口,所有按钮、文本框等控件都必须放置在窗体上。,节省界面空间,支持选择 / 输入(可配置),常用于性别、城市、分类选择。用户点击后执行指定操作(登录、提交、查询、清空),是界面交互的核心控件。,是最常用的输入控件(账号、密码、备注、内容编辑等)。,支持多选(如兴趣爱好、权限勾选、功能开关)。(头像、图标、广告图、本地 / 网络图片)。

pqd666的博客 647

c#软件开发学习笔记--Winform窗体(控件)

构造函数 → Load事件 → 显示 → 用户交互 → FormClosing → 关闭。

Z599817841的博客 241

【屌丝的逆袭系列】没有源代码也能加功能也能玩美化

【使用工具】Peid 0.94,OllyDbg(OllyIce),exeScope,Spy4Win【运行平台】WinXP【软件名称】IMMSG飞鸽传书 (下载) 【软件简介】一个用于内网交流和传输文件的小工具   前些日子到同事的同学哪里去拷《康熙大帝》。可惜网连好后,就是访问不了。看来又是什么安全策略的问题了,本想重设一下。这时同事的同学就讲可以使用飞鸽传书。 ...

weixin_30321449的博客 523

C#基础学习笔记(十三)

C#基础学习笔记(十三) 1、MD5加密 存密码的时候需要加密 static void Main(string[] args) { //123 //202cb962ac59075b964b07152d234b70 //202cb962ac5975b964b7152d234b70 x不一样 //202cb962ac59075b964b07152d234b70 x2 加个0 string s = GetMD5("123"); Console.WriteLine(

南极没有熊的博客 333

组合框

组合框:顾名思义是几个窗体组合而成的.先看下Delphi组合框的TCOMBOBOX类: TComboBox = class(TCustomComboBox) = class(TCustomCombo) = class(TCustomListControl) = class(TWinControl) 在TCustomComboBox之前的都是DELPHI一手捏造的,到了TCustomComboBox...

不以物喜,不以己悲 1741

Delphi中SendMessage使用技巧

Windows系统是由消息机制驱动的,每个线程如果建立了一个窗口,则由系统分配一个消息队列用于窗口消息的处理。另外,消息也可以不经过消息队列而利用SendMessage函数直接发送给窗口,窗口过程将处理这个消息,但只有当消息被处理之后,SendMessage才能返回到调用程序。下面结合两个Delphi程序,讨论如何利用SendMessage向控件发送消息和控件对这种消息的响应。

nedvedno1的专栏 2858

ubuntu下codeblocks起步(五)-上

<!-- @page { size: 21cm 29.7cm; margin: 2cm } P { margin-bottom: 0.21cm } --> ubuntu下codeblocks起步-鼠标响应 <!-- @page { size: 21cm 29.7cm; margin: 2cm }

Q_Jizi(七之子)的专栏 2031

C#.WinForm调用winapi SendMessage方法跨进程发消息

本文章主要用于做接口形式跨进程的使用。 额外提下: 发普通消息与此类同 1 public const int WM_SETTEXT = 12; 2 public const int CB_SETCURSEL = 0X014D; 3 [DllImport("user32.dll", EntryPoint = "SendMessage")] 4 public static extern int SendMessage(int hwnd, int w

chinaherolts2008的博客 1055

C#之winform(软件开发)

c#winform开发

weixin_46877907的博客 1903
上一篇: C++子对象和堆对象
下一篇: 局部类和嵌套类
普通网友
博客等级 码龄22年 1万+粉丝 3156原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值