沧海月明.NET

 
 

Powered by: 博客园
模板提供:沪江博客
博客园 | 首页 | 发新随笔 | 发新文章 | 联系 | 订阅订阅 | 管理

2011年8月31日

Windows Form设计器系列 目录
  1. 写FORM设计器尝试(一) START
  2. 写FORM设计器尝试(二) PROPERTYGRID
  3. 写FORM设计器尝试(三) 在窗体上添加控件
  4. 写FORM设计器尝试(四) 修改窗体上的控件属性
  5. 写Form设计器尝试(五) 让设计器使用自定义控件
  6. 写Form设计器尝试(六) 实现菜单命令
posted @ 2011-08-31 16:23 沧海月明 阅读(80) 评论(0) 编辑
 
离线安装Android开发工具(for Windows 32bit/64bit)

每次安装Android总要费一定时间,尤其在网络状况不好的时候,如果没有网络那更似乎束手无策。下面的方法可以让你快速安装Andoid开发工具,当然第一次的准备工作需要网络支持。

准备工作

先在一台能上网的电脑上下载好各工具(以JDK7、Eclipse 3.7、ADT12、Android SDK 12为例)

  1. 下载Java SDK
    打开网页http://www.oracle.com/technetwork/java/javase/downloads/index.html, 点击Java SE JDK下载, 选接受协议,下载jdk-7-windows-i586.exe (32bit)或者jdk-7-windows-x64.exe (64bit)
  2. 下载Eclipse for JAVA
    打开网页http://www.eclipse.org/downloads/,下载Eclipse IDE for Java Developers, 同样有32位与64位版之分。
  3. 下载ADT Plugin for Eclipse

    打开网页http://developer.android.com/sdk/index.html,在左侧找到ADT Plugin for Eclipse并点击其下的ADT 12, 然后在页面的右侧内容中找到ADT-12.0.0.zip的下载链接并下载到本机。
  4. 下载Android SDK
    打开网页http://developer.android.com/sdk/index.html,找到android-sdk_r12-windows.zip的下载链接并将其下载到本机。
  5. 在此电脑上安装JAVA SDK
  6. 将Eclipse解压到指定目录,如D:\eclipse,运行Eclipse目录下的eclipse.exe, 进入Eclipse后,打开菜单“Help”下的“Install New Software…”,然后在弹出的Install对话框中点击“Add…”按钮,再在弹出的Add Repository对话框中点“Archive…”按钮,在文件选择对话框中选择先前下载的ADT-12.0.0.zip。
  7. 将Android SDK解压到指定目录如D:\android-sdk,运行eclipse, 打开菜单“Window”下的“Prferences”,点击左侧的“Android”,在右侧的SDK Location选择Android SDK的解压路径,点“确定”。
  8. 在eclipse中打开菜单“Window”下的“Android and AVD Manager”, 点击左侧的”Available Packages”,选择需要版本的Android API,可以多选。点击“Install Seleted”,等待下载并安装Android API。完成后将D:\android-sdk目录压缩到一个文件如android-sdk.zip.

离线安装

将前面下载的JDK,Eclipse,ADT以及制作的压缩文件android-sdk.zip复制到移动媒体如U盘、移动硬盘或者刻录到光盘。

在不能上网的电脑上,执行“准备工作”中的第5、6步,然后将android-sdk.zip解压到指定目录,在eclipse, 打开菜单“Window”下的“Prferences”,将Android的“SDK Location”设定到此目录。即可完成Android开发工具的离线安装。

如果在前准备工作的步骤中,同时下载好JDK和eclipse的32位和64位版,则此4个文件(jdk-7-windows-i586.exe、jdk-7-windows-x64.exe、eclipse-java-indigo-win32.zip、eclipse-reporting-indigo-win32-x86_64.zip)再加上ADT-12.0.0.zip、以及准备工作第8步制作的android-sdk.zip,共六个文件即可在任何支持Andriod开发的Windows电脑上离线快速安装Android开发工具。

posted @ 2011-08-31 12:11 沧海月明 阅读(2434) 评论(1) 编辑
 

2007年7月20日

Luna简介
在所有基于关系数据库的软件系统中, 有两种数据模式是最常用到的:

一种我称之为单表, 以微软的NorthWind例子数据库为例, 如Categories表是最基本的模式, 较为复杂一点的是Products表, 它的某些字段是外键, 其值来源于其它表。大部份基本资料适用于这种模式。

一种我称之为主从表,它的最基本模式由两个有一对多关系的表构成, 如Orders与Order Details。更复杂一点的模式可能是一个主表对应多个从表,或者从表之下又有从表。大部份单据比如入库单、领料单、财务凭证等适用于此种模式。

我们已经花太多时间去写针对这两种数据模式的界面设计、新增修改删除功能实现、报表设计、权限管理、多语言支持等等。这些工作大部份都是重复的机械劳动。

Luna框架的功能是不需要再为这些做重复工作。开发者定义好数据模型和数据字典后,可以自动生成数据表、中间层代码、客户端界面。同时又可以保留充分的灵活性。开发者可以把绝大部份时间用于写业务逻辑。比如对于一张入库单,开发者需要写的代码是保存/或者审核这张单据时, 同时修改库存数量、库存成本。

这样的轮子市面上已经有很多了,但大多总有这样那样的缺点。我终于决定自已也来做一个。

这个是单表数据模式的界面示例:

标准工具栏为:新增、查询、编辑、删除、打印、四个位置导航、刷新、保存、撤消编辑。


posted @ 2007-07-20 18:10 沧海月明 阅读(1002) 评论(7) 编辑
 

2006年12月23日

MDI窗体的工具栏合并(ToolStrip Merging)的功能实现

上篇:MDI窗体的工具栏合并(ToolStrip Merging)

这个模型的大概构成是这样的:
1个MDI主窗体,1~n个MDI子窗体;
主窗体上一般会有1个主菜单栏,1~n个主工具栏;
子窗体设计时上可能有0~1个主菜单栏,0~1个主工具栏,运行时子窗体的菜单栏和工具栏都显示在主窗体上,与主窗体的菜单栏和工具栏合并。(实际上也许会有多个工具栏,但先简化为一个工具栏的模型,实现了一个工具栏的合并后,要实现多个工具栏合并也并非难事)。
对于菜单栏的合并,无论是传统的Windows API编程或者Window Forms,都已经完美地解决了,不再赘述。
工具栏合并的过程最好在子窗体的激活和关闭处理处理,一个容易想到的方法是写在子窗体的事件代码中,要么需在每一个子窗体的代码文件写上类似处理的代码,要么让所有子窗体继承自一个写好相关事件处理代码的窗体。前者显然不可取,后者在单根继承的时代,剥夺了子窗体从其它窗体继承的可能,也不是一个好办法。同时还有一个弊端是子窗体要访问主窗体的内容,耦合度太高。
最佳方案也自然而然地出来了,即在主窗体的MdiChildActivate事件中处理(不能望文生义以为仅仅是子窗体的激活会触发此事件,事实上子窗体的关闭也会触发此事件)。这个时候应该把主窗体从上一个子窗体合并来的工具栏内容清除掉(如果有的话),并将新激活的子窗体上的待合并的工具栏内容合并到主窗体的工具栏上(如果新激活的子窗体上无待合并的工具栏内容或者MdiChildActivate是关闭最后一个子窗体触发的时候则无此步)。为简化代码,假设子窗体的工具栏总是合并到主窗体工具栏的最后位置。
这时候,主窗体必须知道子窗体的工具栏的构成,完全解耦是不太可能的。一种办法是将子窗体的工具栏控件的作用范围设置为public, 我采取了另外一个办法,就是定义了一个接口,让需合并工具栏的子窗口实现这个接口即可。
接口代码如下:
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;

namespace Osmanthus.WinForms
{
    
interface IToolStripMergableForm
    {

        ToolStrip MergedToolStrip
        {
            
get;
        }
    }
}
让子窗体实现这个接口,所要写的代码也简单,只有一句,即:
public ToolStrip MergedToolStrip
{
    
get { return this.toolStrip1; }
}
剩下的内容似乎理想当然地是写主窗体的MdiChildActivate事件处理代码,不过我想增加重用性,就把它写成了一个组件,以后只要把该组件拖放在MDI主窗体,并设置此组件MainToolStrip属性为主窗体的工具栏(其实也可以写成自动获取默认属性值,即主窗体上的最后一个ToolStrip控件),不需对再对主窗体写一行代码。这个部件的代码内容如下(其中为实现组件对Form的存取参照了Chris Sells的大作,我不知道是否有其它的更好办法):
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.ComponentModel;
using System.ComponentModel.Design;

namespace Osmanthus.WinForms
{
    
class SdiToolStripMerger : Component, ISupportInitialize
    {
        
private Form hostingForm;
        
private ToolStrip mainToolStrip;
        
private IToolStripMergableForm currentMdiChild = null;

        
private List<ToolStripItem> toolStripItemList = new List<ToolStripItem>();

        
public ToolStrip MainToolStrip
        {
            
get { return mainToolStrip; }
            
set { mainToolStrip = value; }
        }

        [BrowsableAttribute(
false)]
        
public Form HostingForm
        {
            
get
            {
                
if ((hostingForm == null) && this.DesignMode)
                {
                    IDesignerHost designer 
= this.GetService(typeof(IDesignerHost)) as IDesignerHost;
                    
if (designer != null)
                    {
                        hostingForm 
= designer.RootComponent as Form;
                    }
                }
                
return hostingForm;
            }
            
set
            {
                hostingForm 
= value; //这里需要改进一下, 应该一旦设置了host form,就不能再修改.
            }
        }

        
#region ISupportInitialize Members

        
public void BeginInit()
        {
        }

        
public void EndInit()
        {
            
if ((!DesignMode) && (hostingForm != null))
            {
                hostingForm.MdiChildActivate 
+= new EventHandler(UpdateToolStrip);
            };
        }
        
#endregion

        
void UpdateToolStrip(object sender, EventArgs e)
        {
             //清除从上个激活子窗体合并来的工具栏内容
            if (currentMdiChild != null)
            {
                
foreach (ToolStripItem toolItem in toolStripItemList)
                {
                    currentMdiChild.MergedToolStrip.Items.Add(toolItem);
                }
                toolStripItemList.Clear();
            }

            IToolStripMergableForm form 
= (IToolStripMergableForm)hostingForm.ActiveMdiChild;
            
//如当前激活的子窗体实现了 IToolStripMergableForm接口,则合并其工具栏内容
            if (form != null)
            {

                currentMdiChild 
= form;
                
foreach (ToolStripItem toolItem in currentMdiChild.MergedToolStrip.Items)
                {
                    toolStripItemList.Add(toolItem);
                }
                
foreach (ToolStripItem toolItem in toolStripItemList)
                {
                    mainToolStrip.Items.Add(toolItem);
                }
            }
            
else
            {
                currentMdiChild 
= null;
                toolStripItemList.Clear();
            }
        }
    }
}

2006/12/25 附记:今天早上发现了.net Framework 2.0新增加的
一个类ToolStripManager,使用此类可以简化上述代码。

posted @ 2006-12-23 23:28 沧海月明 阅读(2701) 评论(1) 编辑
 
MDI窗体的工具栏合并(ToolStrip Merging)
MDI一个比较显著的特性是菜单合并。即子窗体的菜单能合并到主窗体的菜单上。假想一下如果没有这个功能,主窗体和子窗体各显示一个菜单栏,那人机交互该有多糟糕。工具栏是一个与菜单栏同等重要的窗体界面元素,如果也能实现合并功能,将为MDI界面的应用开发增色不少。我们可以象典型的MDI应用一样,只将工具栏放在主窗口上,在主窗体的工具栏中放上全局通用的工具项,而针对特定子窗体的工具项在子窗体中设计,显示的时候与主窗体的工具栏合并显示。这样一则可以在做到界面的一致性的同时也将MDI主窗体和子窗体之间的耦合降到很低,其次在支持插件开发时也很有意义。
示例如下, 主窗体

显示某子窗体时:

显示另外一个子窗体时:

其中变化的工具项是在子窗体中设计的。虽然显示在主窗体的工具栏中,但还是从属于子窗体,在事件处理等操作中与原来并无二致。

posted @ 2006-12-23 15:39 沧海月明 阅读(1990) 评论(4) 编辑
 

2006年3月26日

新的TreeView控件

我自已写的扩展TreeView控件, 实现了三态CheckBox和RadioButton:

posted @ 2006-03-26 22:56 沧海月明 阅读(1847) 评论(15) 编辑
 

2006年3月18日

目前关于.net 2.0下设计器最为详细的资料
http://msdn.microsoft.com/msdnmag/issues/06/03/DesignerHosting/default.aspx
作者: Dinesh Chandnani

posted @ 2006-03-18 09:29 沧海月明 阅读(1103) 评论(1) 编辑
 

2006年2月6日

.NET framework2.0中的农历类(三)写自已的日期格式化器
摘要: 五、写自已的日期格式化器昨天看了一篇文章,说目前大家用的“农历”这个术语是文革时期才有的,目的是反封建。这里为了省事,还是继续使用这个术语。而英文名称ChineseLunisolarCalendar太长,我自己的代码中就用ChineseCalendar为相关功能命名,这个名字也还过得去吧。我原先设想自定义一个类,使得能写出这样的代码:strings=DateTime.Now...阅读全文
posted @ 2006-02-06 17:23 沧海月明 阅读(2862) 评论(5) 编辑
 

2006年2月4日

.NET framework2.0中的农历类(二)
摘要: 三、农历类的使用 既然.net框架不支持直接将日期转换成农历格式的字符串,那么要将显示农历格式的日期,就只要自已写代码了。不过由于已经有了ChineseLunisolarCalendar类实现了公历转换为农历日期的功能,所以要写这样的代码也比较简单。需要用到ChineseLunisolarCalendar以下几个主要方法:int GetYear (DateTime time) 获取指定公历日期的农...阅读全文
posted @ 2006-02-04 20:30 沧海月明 阅读(3341) 评论(10) 编辑
 
.NET framework2.0中的农历类(一)
摘要: 一、简介过年是中国(以及日本、韩国等国)人民的第一大节日。你怎么知道哪天过年?查日历或者听别人说?程序员当然有程序员的办法,就是写程序啦。虽然公历(俗称的“阳历”)已经成了全世界的通用标准,而且也具有多方面的优越性。但在东亚地区,还是离不开“农历”,春节、元宵、端午、中秋、重阳这些节日是农历的,大部份人的老爸老妈的生日也是农历的。早在1.0框架出来的...阅读全文
posted @ 2006-02-04 11:42 沧海月明 阅读(2426) 评论(4) 编辑
 

2005年11月10日

窗体设计器试验程序下载地址
摘要: 目前的代码比较粗糙,仅包含了系列随笔1-6的内容。我计划在未来的时间里将之设计成一个基本可用的提供代码生成、事件支持的设计器, 以此做为.net 2.0下Form Designer的一个参考例子。http://www.cnblogs.com/Files/panjiwen/FormDesigner.zip阅读全文
posted @ 2005-11-10 11:30 沧海月明 阅读(2189) 评论(5) 编辑
 

2005年11月9日

写Form设计器尝试(六) 实现菜单命令
摘要: 在写这篇的正文之前,我要衷心感谢微软公司的Jeffrey Tan先生,他居然看懂了我的文理不通的英文提问,并且花费宝贵时间来钻研,帮我解决了一个星期来我百思不得其解的问题。我当时的问题是我写了一些语句来实现标准菜单命令,但是调试的时候怎么也得不到正确的结果,事实上我研究的两个例子用的方法和我的类似,它们却都可以正常执行。我一直没有找到原因,不得不求助支持。 在“写Form设计器尝试(四...阅读全文
posted @ 2005-11-09 09:49 沧海月明 阅读(5925) 评论(38) 编辑
 

2005年11月6日

写Form设计器尝试(五) 让设计器使用自定义控件
摘要: 在“写Form设计器尝试(三) 在窗体上添加控件”的评论中,热心关注者Leejee提出了自定义控件的问题。我于是作了一个小测试,来实现设计器中使用自定义控件。 先要准备一个自定义控件。新建一个Windows控件方案,命名为MyControl, 添加一个名为ComboBoxField的用户控件,在该用户控件上放一个Label和一个ComboBox,生成解决方案。将生成的dll...阅读全文
posted @ 2005-11-06 22:08 沧海月明 阅读(4031) 评论(5) 编辑
 

2005年11月3日

关于Microsoft.WizardFramework
摘要: 在vs的目录下发现了这个dll, 顾名思义应该是提供了一个向导框架的。我想了解一下怎么用它,google了半天,也没有找到相关资料,看来只好有空的时候去研究一下了。2008/11/28 补:http://radio.weblogs.com/0122832/2005/12/08.html 已经有简要使用说明。阅读全文
posted @ 2005-11-03 12:08 沧海月明 阅读(1189) 评论(1) 编辑
 

2005年11月1日

写Form设计器尝试(四) 修改窗体上的控件属性
posted @ 2005-11-01 11:20 沧海月明 阅读(3816) 评论(7) 编辑
 
仅列出标题  下一页