ASTAR Coming Now

时常仰望天空,乃知天高;时常鸟瞰大地,常感天地宽- 梦想皆有神助
随笔 - 170, 文章 - 2, 评论 - 191, 引用 - 19
数据加载中……

2009年10月29日

如何:.NET 组件/控件在设计时的调试

本文主要介绍如何在设计时对组件的调试,多数情况开发人员用MessgeBox来弹出信息进行调试,但无法进入到代码内部。因此本文以图解的方式来介绍。本文参考了微软MSDN中《演练:设计时调试自定义 Windows 窗体控件》,鉴于其中文版翻译很晦涩,建议大家参考本文

 

背景知识介绍

需要了解组件和控件的区别, 组件编程的大概方向,以及.NET提供哪些服务(组件)来支持组件编程及设计时的事件。

image

有兴趣可以参考:

.net控件编程 - 资料篇

 

STEP BY STEP 调试

组件设计时的调试对象为两个:
一种对象是我们关注的组件本身。另一种则是组件的设计器。

举例一个组件MyComponet有一个属性,我需要在设置值的时候,进行调试更踪。

    private string demoStringValue = null;
        [Browsable(true)]
        public string DemoString
        {
            get
            {
                return this.demoStringValue;
            }
            set
            {
                demoStringValue = value; //设置æ-­ç‚¹
            }
        }

准备工作
1.创建一个library,并创建MyComponent组件,添入以上代码,并编译。
2.加入一个调试用的windows application项目TestMyComponent.
3. 设置library项目为启动项目,在属性中调试中设置启动外部程序,
设定VS的位置:
如:
D:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\devenv.exe

image

继续下去   

1. 按F5开始调试过程。这时会有一个新的VS.NET实例被启动。我们在新vs中重新加载此解决方案。

image

4. 在windows application工程中,双击Form1打开之。
5.     在工具栏中拖入MyComponent到Form1,   
6. 在属性页中,改变DemoString属性的值为Good bye。   
7. 此时应当步入断点所在处。

image

我们已经介绍了调试组件本身。

有时候,我们会自定义设计器来实现一些特定的功能。

比如:我们要捕捉组件被加入的事件,组件被移除的事件。要解决的是访问设计时的服务。

让某控件或组件都可以通过定义设计器标签来制定自定义的设计器。

clip_image001

而在设计器中要想触发对应的事件,就必须取得服务对象并挂接对应事件。

自定义设计器必须从ControlDesigner或者ComponentDesigner继承

clip_image002

自定义初始化,并加入一个初始化化服务对象的私有方法:

clip_image003

可以访问的服务:

clip_image004

比如:我们关注的控件的加入或移除事件

clip_image005

ComponentAdded的事件

clip_image006

在这里设置断点,并重复刚才的调试动作。所不同的最后两部,

我们将控件或组件,拖入到form1时候,这时候调试进入到了Designer中。

到此为止,两种类型调试结束了。

posted @ 2009-10-29 16:56 ASTAR Coming Now 阅读(34) | 评论 (0)编辑

Outlook2007 addin开发必读-菜单定制篇

介绍
自从微软开始推出VSTO以后,我们就更容易在此基础上面开发Add-in程序。对VSTO的介绍,大家可以看看这篇文章:VSTO简介及发展。本文例子是基于VSTO 3.0上进行的开发。
本文是在微软《Customizing the Ribbon in Outlook 2007》 基础上加入自己的实践和想法,供大家参考。

这段文字是来至于:
Http://msdn.microsoft.com/zh-cn/library/bb226712(en-us).aspx
Customizing the Ribbon in Outlook 2007

The Microsoft Office Fluent user interface (UI) is the terminology used to describe the new UI for the 2007 Microsoft Office system. The Ribbon is a component of the Microsoft Office Fluent UI.
Ribbon是新的Microsoft办公软件舒适?的界面组件。

Unlike other applications in the 2007 Microsoft Office system, such as Microsoft Office Word, Microsoft Office Excel, and Microsoft Office PowerPoint, which rely exclusively on the Ribbon, Microsoft Office Outlook 2007 uses both the Ribbon and command bars. Additionally, Outlook does not support document-level customizations of the Ribbon. You can customize the Ribbon only by implementing the IRibbonExtensibility interface in an Outlook add-in.
OutLook有区别于其他Office程序(word,excel,powerPoint),它不像它们完成依赖于Ribbon,outLook 2007同时存在两种样式菜单-Ribbon和command bars。此外,Outlook 2007不支持页面级(关于页面级的说明请参看:VSTO简介及发展)Ribbon的定制。你只能通过实现一个IRibbonExtensibility接口在Outlook add-in项目来定制Ribbon。

 

一个OutLook 2007 add-in项目只能实现一个Ribbon

一个Ribbon可以有多个Ribbon Tab。
Ribbon对象是怎么跟Add-in结合起来的?
在add-in class中通过下面任意方法Hook上的。
方法一:

protected override Microsoft.Office.Core.IRibbonExtensibility CreateRibbonExtensibilityObject() { return new Ribbon(); } 

方法二:

private Ribbon _ribbon;
protected override object RequestService(Guid serviceGuid)
{

if (serviceGuid==typeof(Office.IRibbonExtensibility).GUID)
{
if (_ribbon == null)
_ribbon = new Ribbon();
return _ribbon;
}
return base.RequestService(serviceGuid);
}

 

一个Ribbon可以出现在多个Item窗体上(什么是item?Message,contact,appointment 等等)如果只让Ribbon出现某几个Item窗体上?

 

#region IRibbonExtensibility Members
public string GetCustomUI(string ribbonID) { return GetResourceText("emailFinder.Ribbon.xml"); }
#endregion
//如果只让它出现在撰写邮件的窗体上
public string GetCustomUI(string ribbonID) {
if(ribbonID=="Microsoft.Outlook.Mail.Compoase") return GetResourceText("emailFinder.Ribbon.xml");
else
return string.Empty; }
 
*注意:ribbonID你可以在vs2008 ribbon组件视图设计器中得到
image 
 
ribbon视觉设计项的作用?
image 
 

它的作用是完成视觉设计并导出成为ribbon的标准XML。
而代码工作都是在ribbon类中手工完成

 

In the main application window, Outlook displays the command bars that are familiar to users of earlier versions of Microsoft Office.
在OutLook 2007主窗体中,我们使用以前版本很像是的command bars

In item windows, such as a mail message window where authoring is the central user experience, Outlook uses the new Ribbon.
在子项窗体里,比如邮件消息窗体(其编辑功能是用户体验核心),Outlook使用新的Ribbon

To provide the best authoring experience for end-users, Outlook item windows display item-specific Ribbons. From an object model perspective, an Outlook item window is an Inspector object. If you have existing code that uses the object returned by the Inspector.CommandBars property to customize command bars for standard or custom item types, this article describes how Ribbon extensibility improves your existing customizations of command bars for an Outlook Inspector.
对于更佳的需要客户体验编辑窗体来说,我们使用Ribbon。它是观察者(Inspector)对象,通过Inspector.CommandBars 属性来获取定制的菜单。

The main application window, known as an Explorer object, still uses command bars introduced in earlier versions of Office.
For an Outlook Explorer, you continue to use the object returned by the Explorer.CommandBars property to customize the Outlook window. As a prerequisite for this article, you must know how to write code for the Office CommandBars object model so that I will not spend much time discussing the CommandBars object model.

对主窗体来说,是一个浏览对象,而且可以继续使用Explorer.CommandBars属性来取得command bars对象。而我也不用花大量时间来介绍CommandBars对象模型。

There are several excellent blogs and technical articles that discuss Ribbon extensibility in detail on MSDN. For a comprehensive view of all aspects of the Ribbon, a must-read is Jensen Harris: An Office User Interface Blog. For developer information about Ribbon extensibility for tabs, groups, and controls, see Customizing the 2007 Office Fluent Ribbon for Developers (Part 1 of 3), Customizing the 2007 Office Fluent Ribbon for Developers (Part 2 of 3), and Customizing the 2007 Office Fluent Ribbon for Developers (Part 3 of 3) by Frank Rice. I urge you to view these references because I do not repeat the comprehensive listing of Ribbon XML Schema and callback signatures that you can find on MSDN. In this article, I focus on what you have to know about the Outlook implementation of the Ribbon.

介绍了在主窗体和item窗体后,我再说一下上下文菜单的定制,也就是通常说的右键菜单。

image

通过观察和阅读其他文章,我认为上下文菜单是可以通过Explorer.CommandBars获取, 理由是在主窗体中Outlook 2007依然使用以前的菜单模型。

posted @ 2009-10-29 16:35 ASTAR Coming Now 阅读(96) | 评论 (0)编辑

2009年10月13日

Perl 对象化编程的实现

缘由

最近反过头来看Perl,一方面是我的客户厂家用Perl开发了很多东西,另一方面在了解过程中,又复习了Perl语言,并且有了一些心得。记录下来,供大家参考。

我在做一个小程序,就是解析一个文本文件,将其中的内容进行处理,并保存在另一个文件。

背景知识

1. Perl的对象化编程实现

请参考阅读:

O'Reilly - Advanced Perl Programming.pdf - 第7章 [Object-Oriented Programming]

2. 在Perl中如何使用引用

http://www.chinaunix.net/jh/25/504623.html

3. Perl中如何读取文件

Perl cookbook [O'reilly Perl Cookbook.pdf] - 第7章 [File Access]

4. Perl的正则表达式

http://www.chinaunix.net/jh/25/159388.html

具体实现

对象编程是为了解决长期依赖困扰的维护和扩展的工作。如果我们的代码只写一次,以后再也不需要改动,那么也许现代编程模型就不会演化。当然我们知道这是不可能的。世界唯一不变就是变化。

Perl做为一种功能强大的脚本语言在各个方面都有运用(但没有在UI方面使用),但是由于脚本语言的特性,write once的标签一直伴随着它。大家普遍认为它是一种晦涩的并难以维护的程序语言。

其实这方面,大家有一些误解。语言使用跟开发人员的水平和涵养有关系,即便在C#这种良好的高级对象语言的基础上,部分开发人员仍然可以写糟糕的难以读懂的语言结构来。因此,开发人员不仅仅是要学会在高级语言上使用对象编程,并更需要深刻理解对象概念,最终能将这种概念运用到不同的语言中来,使其语言结构,模块化,对象化。

在我刚刚接触Perl的时候,我认为这种语言根本无法写出对象化的语言结构。因此,我对此有诸多抱怨。但随着学习的深入,Perl一样可以使用对象的概念来构件合适和清晰的语言结构。

我把最后测试的代码先贴上来:

use filehandle::filehandler;
use filehandle::catchWorkerId;

print "\nTEST fildehander base class \n\n";
my $filehandler =  filehandler->new("c:\\test2.ini");
print $filehandler->getDealedStrings();

print "\nTEST fildehander sub-class \n\n";
$filehandler = catchWorkerId->new("c:\\test2.ini");
print  $filehandler->getDealedStrings();
$filehandler->exportToFile("C:\\test2_new.ini");

filehandler.PM和catchworkerId.PM是我们重要的两个Module(class)。fileHandler类是父类并完成了一个文件解析的基本动作:

打开文件

每行读取

解析字符串并保存在类的数组变量里面

导出到合适的文件中

这样我们就可以只在子类里面完成需要变动的部分。请看子类代码catchworkId.PM

package catchWorkerId;
@ISA = qw(filehandler);
use strict;
use warnings;


sub convert
{

   my ($self,$linetext) = @_;

  my $pattern = "[a-z0-9]{9}[(]";
  my @a;
  if(@a=($linetext =~/$pattern/gio))
  {
    $a[0]=~s/[(]//g;
    return (1,$a[0]);
   }

return (0,"");
}

1;

代码说明

子类代码只是完成一个方法convert,它的输入是一个$linetext 字符串标量,我们进行正则表达式的判断,如果满足匹配则返回true+替换后的$linetext,如果不满足就返回false+空字符串。

如果在C#这类对象强类型语言中我们可以这样定义:

bool convert(string linetext, out string convetedlinetext)
{
 //implemenet code
}

由于Perl是一种解释性非类型语言,因此我们需要变通的实现这一功能。 所以,如何在新的概念情况下,用旧有语言来实现特定的功能,就需要开发人员的创新能力,这些东西不会在教程上讲述,而需要开发人员自己的摸索。

你看通过类的继承的方式,我们在子类只定义函数就完成我们预设目标。需要注意这一句:

@ISA = qw(filehandler);

它的意思是,引入filehandler.PM的函数,首先在catchWorkerId中查找调用函数,如果没有找到,会继续在filehandler.pm中查找。通过这种方式,我们完成了变相实现了类的继承

 

这里给出父类的实现:filehandler.PM

package filehandler;
use strict;
use warnings;

#new
sub new
{
  my($class, $filename) = @_;
  my $self ={
    _filename =>$filename
    };
  my @ss;
  $self->{_dealedStringArray}= \@ss;

  return bless($self,$class);
}

#really open file
sub getDealedStrings
{
  my($self) = @_;
  open (FILEHANDLE,$self->{_filename})|| die("can't open file: $self->{_filename}");
  #start to deal string line by line!
while(<FILEHANDLE>)
{
 $self->handleLine($_);
}
close (FILEHANDLE);
return  @{$self->{_dealedStringArray}} ;
}

#deal string line by line
sub handleLine
{
  my ($self,$linetext) = @_;
  my @result = $self->convert($linetext);
  if($result[0]==1)
  {

  $self->_addstring($result[1]);
  }


}
#You can write a override function in sub class
sub convert
{
  my ($self,$old) = @_;
  $old = "CONVERTED STRING:" .$old;
  return (1,$old);
}

#add the dealed string into a array.
sub _addstring
{
  my ($self,$linetext) = @_;

  my @a =@{ $self->{_dealedStringArray}};

  push(@a, $linetext."\n");
  @{$self->{_dealedStringArray}} = @a;

}

#output converted file
sub exportToFile
{
  my($self,$newFileName) = @_;
  open FILEHANDLE ,">$newFileName" || die("can't create file : $newFileName");
  for(my $i=0;$i<@{$self->{_dealedStringArray}};$i++)
  {
    print FILEHANDLE "${$self->{_dealedStringArray}}[$i]";
  }

  close FILEHANDLE;
}
1;

这里不在具体讲Perl 对象编程的概念,大家可以变参考背景知识里面推荐的O'Reilly - Advanced Perl Programming,边看本实例,一定会有所心得。

posted @ 2009-10-13 12:55 ASTAR Coming Now 阅读(62) | 评论 (0)编辑

2009年9月28日

VC++ 6.0 与VS2008 C++ DEBUG工具(Windows)介绍

在VC++ 6.0 里面,debug工具有这些:

image

请看大图展示:

image


这里面几个工具都是经常用到的。
比如:
上下文信息,可以查看当前变量的值和地址
Memory: 可以输入地址查看里面的内容。对调试和检查指针特别有用。

在vs2008里面,debug做为单独的主要菜单出现了。

image

1.Autos
自动显示目前执行语句与上一行的各个参数
2.locals
显示当前函数内所有变量的情况
3.watch,输入变量查看
这三个窗体都可以输入值改变当前的变量
3.imediate
输入可以直接执行。比如输入一个变量名回车,会把这个变量的信息显示出来。
Call Stack.
显示函数执行的级别,及输入参数
image

Modules - 当前程序及调用的dlls

image

sysmbol状态,被加载表示可以进入调试。
查看dll的依赖也可以使用Process Explorer。

disassembly - 查看对应的汇编程序

image
memory - 查看对应的地址的值(跟VC++ 6.0一样)

posted @ 2009-09-28 23:15 ASTAR Coming Now 阅读(203) | 评论 (0)编辑

2009年9月27日

C++ 如何获取目录下面的文件/文件的创建时间

     摘要: 我手上有一个C++程序会生成一些临时文件,过期以后希望能够删除. 到达成这个目的,我需要做到: 根据提供的路径, 列取所有文件,并比较现在时间跟其创建时间的差,如果超过N天,则删除. 问题分解开来是: 1. 取得某个目录下面所有文件 2. 取得文件的创建日期 3. 取得当前日期跟其创建的日期差 4. 删除文件 为此,我写了一个小程序来测试 1: // TestFileFunction.cpp :...  阅读全文

posted @ 2009-09-27 16:51 ASTAR Coming Now 阅读(186) | 评论 (0)编辑

VC++ 申明静态变量的注意事项

     摘要: 开发工具VC++ 6.0,举例类CEmployee 按照习惯,我们在头文件中如果已经声明了变量,我们在源文件中就可以直接使用了。 1: protected: 2: static string m_EmployeeName;我们在构造函数初始化它, 1: CEmployee::CEmployee() 2: { 3: 4: m_EmployeeName ="Rock"; 5: }编译没有问题,但连接...  阅读全文

posted @ 2009-09-27 14:01 ASTAR Coming Now 阅读(107) | 评论 (0)编辑

2009年8月7日

对引用和指针使用以及函数返回引用和指针类型的理解

     摘要: 引用的符号是&,指针的符号是* 先来看看一段测试代码, 1: #include "stdafx.h" 2: #include <iostream> 3: using namespace std; 4: int globalJ =999; 5: 6: //返回值 7: int test1() 8: { 9: int j =1; 10: cout<<"in test1...  阅读全文

posted @ 2009-08-07 15:11 ASTAR Coming Now 阅读(209) | 评论 (0)编辑

2009年8月2日

windows远程连接的几个问题

     摘要: 今天在家里想用到自己笔记本上的系统,通常我都是用笔记本来连我的家里的PC或者是显示器(屏大一些),今天反过来,我用家里的PC来远程连接自己的笔记本(可以用到大键盘,大屏幕,还可以打会游戏,再工作,嘿嘿) 想法很好,半天没有搞定。 第一个问题:无法ping通。 我测试从PC-》笔记本,timeout PC到其他网站 OK 笔记本到其他网站 OK 解决方法: 检查防火墙,我用的是symentec的,...  阅读全文

posted @ 2009-08-02 12:34 ASTAR Coming Now 阅读(84) | 评论 (0)编辑

2009年7月25日

关于CSDN指针讨论的心得

     摘要: http://topic.csdn.net/u/20080529/16/d408b4ce-32f5-486a-af22-5e40f592696a.html void CDlgTestDlg::OnButton1() { TCHAR* arr="1"; test(arr); MessageBox(arr); //弹出1 } void CDlgTestDlg::test(TCHAR* pChar) ...  阅读全文

posted @ 2009-07-25 00:30 ASTAR Coming Now 阅读(50) | 评论 (2)编辑

2009年5月6日

从Visual studio 2005移出Visual Assist

     摘要: 由于VC++ 6.0的代码辅助功能很烂,因此装了个visual assist 试用版,结果发现在VS 2005里面也加载上了。由于很占内存和CPU,不准备在VS2005里面使用这个插件。 结果发现用正常的VS - tool - addin管理器不能移除,反而是不是报错。 网上查了半天发现,这个方法: 改注册表:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Visual...  阅读全文

posted @ 2009-05-06 16:47 ASTAR Coming Now 阅读(193) | 评论 (0)编辑