2011年要完成的几件事

0,运营系统3.0全面上线,迁到NH3.x,添加短信模块。

1,熟悉ARM开发,完成产品样品。

2,承接软件开发项目。

3,了解Python3。

4,买房。

5,接小墨子到身边。

Openbravo POS 简体中文语言包

一个朋友开七匹狼专卖店,需要POS收银系统,叫我帮忙找一个。对比多个后发现Openbravo POS不错,唯一的问题是纯英文介界面,于是根据官方文档里介绍的办法,使用Netbeans把语言文件大概翻译一些,没有全部翻译,但至少保证正常收银的界面是全中文的。

现在已经把语言包放到官方,地址是:http://forge.openbravo.com/projects/china/

扩展WPF的DataGrid如同Excel支持方向键移动焦点

WPF的DataGrid默认的移动行为如下:

(1)当前单元格不处于编辑状态时可使用方向键移动焦点。

(2)当前单元格处于编辑状态时不可使用方向键移动焦点;
按Enter键,当前单元格退出编辑状态,焦点向下移动一格;
按Ctrl+Enter键,当前单元格退出编辑状态,焦点向上移动一格;
按Tab键,当前单元格退出编辑状态,焦点向右移动一格,并进入编辑状态;
按Shift+Tab键,当前单元格退出编辑状态,焦点向左移动一格,并进入编辑状态;

“运营管理3.0″的用户普遍电脑操作水平低下,Office是它们操作的最多也是最智能的软件,它们认为所有的软件都必须是Office一样地操作,否则就给差评,所以它们要求”运营管理”的操作方式尽量与Excel相同.

为了实现WPF的DataGrid的移动方式与Excel相同,需要重写DataGrid的OnPreviewKeyDown事件:

public class ExDataGrid : DataGrid
    {
        protected override void OnPreviewKeyDown(KeyEventArgs e)
        {
            if (e.Key == Key.Left || e.Key == Key.Right || e.Key == Key.Up || e.Key == Key.Down)
            {
                try
                {
                    base.CommitEdit();
                }
                catch (Exception ex)
                {
                    base.CancelEdit();

                    string mess = ex.Message;
                    if (ex.InnerException != null)
                        mess += "nn" + ex.InnerException.Message;
                    MessageBox.Show(mess);
                }
            }

            base.OnPreviewKeyDown(e);
        }
    }

然后在使用DataGrid的地方换成已重写的ExDataGrid就可以了.

Install ZendOptimizer 3.3.9 to Lenny

# php -v
PHP 5.2.6-1+lenny9 with Suhosin-Patch 0.9.6.2 (cli) (built: Aug  4 2010 03:25:57)
Copyright (c) 1997-2008 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies

# wget http://downloads.zend.com/optimizer/3.3.9/ZendOptimizer-3.3.9-linux-glibc23-i386.tar.gz

# tar zxvf ZendOptimizer-3.3.9-linux-glibc23-i386.tar.gz

# cp ZendOptimizer-3.3.9-linux-glibc23-i386/data/5_2_x_comp/ZendOptimizer.so /usr/lib/php5/

下面这步是重点
# echo “zend_extension=/usr/lib/php5/ZendOptimizer.so” > /etc/php5/conf.d/zend.ini

# /etc/init.d/apache2 restart

# php -v
PHP 5.2.6-1+lenny9 with Suhosin-Patch 0.9.6.2 (cli) (built: Aug  4 2010 03:25:57)
Copyright (c) 1997-2008 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies
    with Zend Optimizer v3.3.9, Copyright (c) 1998-2009, by Zend Technologies

手工安装PostgreSQL 9.0

题记:自8.4版本以来,使用自动安装包安装postgresql到windows时,若使用默认locale,总是会在初始化数据库的时候出错。今天9.0版本发布了,下载安装时发现存在同样的问题,于是爷怒了,去TM的自动安装包,老子以后纯手工安装,再不要什么鸟安装包了。

一、下载解压

1,下载postgresql-9.0.0-1-windows-binaries.zip

2,解压postgresql-9.0.0-1-windows-binaries.zip到D:\

二、添加用户

1,添加windows用户,用于启动PostgreSQL的windows服务
D:\pgsql>net user postgres pgsqlpw /add /expires:never /passwordchg:no

2,为保证安全,此用户不允许本地登录
D:\pgsql>net localgroup users postgres /del

3,赋于windows用户postgres访问PostgreSQL安装目录的权限
D:\pgsql>cacls . /T /E /P postgres:R

三、初始化数据库

1,切换到windows用户postgres的命令行环境
D:\pgsql>runas /noprofile /env /user:postgres "cmd"

2,初始化数据库,若不使用-U admin,则数据库里自动添加当前windows用户(即postgres)为数据库帐号
D:\pgsql>bin\initdb.exe -D "D:\pgsql\data" -E UTF-8 --locale=chs -A md5 -U admin -W

3,启动数据库
D:\pgsql>bin\pg_ctl.exe -D "D:\pgsql\data" -l logfile start

4,停止数据库
D:\pgsql>bin\pg_ctl.exe -D "D:\pgsql\data" stop

四、注册为Windows服务

1,注册为windows服务,当前windows用户(即postgres)将作为PostgreSQL服务的登录用户
D:\pgsql>bin\pg_ctl register -N PostgreSQL  -D "D:\pgsql\data"

2,启动PostgreSQL服务
D:\pgsql>sc start PostgreSQL

2010-06-03 tips

一、URU4000B

URU4000B在程序里的关系是这样的:程序->biokey.ocx->Driver->URU4000B。biokey.ocx是ActiveX,即所谓的SDK。我试过直接引用这个文件,但不成功,所以只能注册后引用COM。使用它并不算难,主类是ZKPEngX,它有这么几个属性可能用的着:

Active、
EngineValid、
EnrollCount、
EnrollIndex、
IsRegister、
SensorCount、
SensorIndex。

比较有用的方法有:

InitEngine()、
BeginEnroll()、
EndEngine()、
GetTemplateAsString()、
PrintImageAt()、
SaveJPG()、
VerFingerFromStr()。

一定会用到的事件有:

OnCapture、
OnEnroll、
OnFeatureInfo、
OnImageReceived。

在使用的过程中发现两个状况:
1,我每次登记完和验证完后都调用EndEngine()方法来释放设备,当如此几次后,CPU占用率升至50%,系统反映慢。
2,后来我改在加载窗口时调用InitEngine()来初始化设备,并且整个窗口类里都没有调用EndEngine()来释放设备,结果第二次打开窗口的时候,设备会不工作。

二、条码

我原来的条码使用的是Code128,打印软件是Bartender,全手工操作。

现在想实现程序自动打印条码,刚开始的想法是去找免费的条码SDK,集成在程序里。于是在网上找了一阵子,倒是找到了两个,但是限制太多,等于没用。

后来突然想到一个折中的办法,使用Portable型的打印软件,并制作好标签文件,里面设置好从Excel文件读取数据,然后在程序里生成这个Excel数据文件,最后调用打印软件打开标签文件。

另外,条码编码改用code128c,因为它更便于扫描。

封装了Popup

代码如下:

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Media;
using System.Windows.Threading;

namespace Yuzifu.Tools
{
    public sealed class MessagePopup
    {
        public static void Show(UIElement parent, string message)
        {
            parent.Dispatcher.Invoke(DispatcherPriority.Background, new Action(() =>
                {
                    Popup popup = new Popup();
                    popup.StaysOpen = true;
                    popup.PlacementTarget = parent;
                    popup.Placement = PlacementMode.Center;

                    Border aroundBorder = new Border();
                    aroundBorder.BorderThickness = new Thickness(2);
                    aroundBorder.BorderBrush = Brushes.SteelBlue;

                    StackPanel aroundStackPanel = new StackPanel();
                    aroundStackPanel.MinWidth = 320;
                    aroundStackPanel.MinHeight = 120;
                    aroundStackPanel.MaxWidth = 480;
                    aroundStackPanel.Background = Brushes.White;
                    aroundStackPanel.Orientation = Orientation.Vertical;
                    aroundStackPanel.FlowDirection = FlowDirection.LeftToRight;

                    DockPanel headDockPanel = new DockPanel();
                    headDockPanel.VerticalAlignment = VerticalAlignment.Top;
                    headDockPanel.Background = Brushes.SteelBlue;

                    TextBlock headTextBlock = new TextBlock();
                    headTextBlock.Margin = new Thickness(10, 0, 0, 0);
                    headTextBlock.Text = "提示";
                    headTextBlock.Height = 26;
                    headTextBlock.HorizontalAlignment = HorizontalAlignment.Left;
                    headTextBlock.VerticalAlignment = VerticalAlignment.Center;
                    headTextBlock.FontSize = 16;
                    headTextBlock.Focusable = false;
                    headTextBlock.IsHitTestVisible = false;
                    headTextBlock.Background = Brushes.SteelBlue;
                    headTextBlock.Foreground = Brushes.White;

                    TextBlock messageTextBlock = new TextBlock();
                    messageTextBlock.Text = message;
                    messageTextBlock.Margin = new Thickness(20, 20, 20, 10);
                    messageTextBlock.MinHeight = 28;
                    messageTextBlock.VerticalAlignment = VerticalAlignment.Top;
                    messageTextBlock.HorizontalAlignment = HorizontalAlignment.Left;
                    messageTextBlock.TextWrapping = TextWrapping.Wrap;

                    Button okButton = new Button();
                    okButton.Content = "OK";
                    okButton.Margin = new Thickness(0, 0, 20, 10);
                    okButton.Padding = new Thickness(25, 3,25,3);
                    okButton.HorizontalAlignment = HorizontalAlignment.Right;
                    okButton.Click += delegate
                    {
                        popup.IsOpen = false;
                        parent.IsEnabled = true;
                    };

                    headDockPanel.Children.Add(headTextBlock);
                    aroundStackPanel.Children.Add(headDockPanel);
                    aroundStackPanel.Children.Add(messageTextBlock);
                    aroundStackPanel.Children.Add(okButton);
                    aroundBorder.Child = aroundStackPanel;
                    popup.Child = aroundBorder;

                    parent.IsEnabled = false;
                    popup.IsOpen = true;
                }));
        }
    }
}

使用方法:

MessagePopup.Show(this,”显示文字”);

显示效果如下:

SciTE添加到右键菜单

SciTE不错,不过它是以压缩包的方式来发布的,想要方便地使用它,可以新建快捷方式或添加到右击菜单,下面是添加到右键菜单的方法:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\*\shell]
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\*\shell\Edit with SciTE]
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\*\shell\Edit with SciTE\command]
@="\"D:\\Program Files\\wscite\\SciTE.exe\" \"%1\""

以下方法在Window 7下测试通过。

WPF多线程以及UI

一、界面无响应,即所谓的卡

可以使用
delegate void DeleDisp();
DeleDisp dd = new DeleDisp(DispInfo);
dd.BeginInvoke(null, null);

如果使用了
Dispatcher.BeginInvoke(dd);
则界面依然会卡

二、报异常“控件由其它线程创建,无法访问其它线程的UI”

这个比较简单
只要使用把访问UI属性的代码用
Dispatcher.BeginInvoke()
包装起来就可以了。

如果是循环更改界面,则应该把把循环的代码放在Dispatcher.BeginInvoke()外面。

三、控件不能同步显示

如果出现这种现象,既可以调用控件的
Refresh()
方法来刷新,

还可以调用
System.Windows.Forms.Application.DoEvents()
方法来刷新。