Categories

Links

delphi 强类型数据集

在delphi中,访问TDataSet的子类字段通常用FindByName,其实可以用类似ado.net 强类型数据集的方法来完成,简单的例子

unit Unit10;

interface
uses ADODB,classes,DB,variants,dialogs;

type
TPermission=class(TADODataSet)
  constructor create(owner:TComponent);override;
  public
  security_key_id:TIntegerField;
  id:TIntegerField;
  group_id:TIntegerField;
  access_level:TIntegerField;


end;

procedure test;
implementation
constructor TPermission.create(owner: TComponent);
begin
  inherited Create(owner);
  //创建字段
  self.CommandType:=cmdTable;
  CommandText:='permissions';


  security_key_id:=TIntegerField.Create(self);
  security_key_id.FieldName:='security_key_id';
  id:=TIntegerField.Create(self);
  id.fieldName:='id' ;

  group_id:=TIntegerField.Create(self);
  group_id.fieldName:='group_id';
  access_level:=TIntegerField.create(self);
  access_level.fieldName:='access_level';


//设置dataset,同时会将字段加入到fields集合
  security_key_id.DataSet:=self;
  id.DataSet:=self;
  group_id.DataSet:=self;
  access_level.dataset:=self;


end;

procedure test;
var
  p:TPermission;

begin
  p:=TPermission.Create(nil);
  p.ConnectionString:='.................................................';
  p.Active:=true;
  while not p.eof do begin

    showmessage(vartostr(p.security_key_id.Value));
    p.Next;
  end;
end;
end.

 

 

其实,如果delphi的index 属性支持字符串的话,可以定义出更高效的类,yy的

TPermission=class(TADODataSet)
 published
 property security_key_id:TField index 'security_key_id' read fieldByname;
 property group_id:TField index 'group_id' read fieldbyname;
 property id:TField:TField index 'id' read fieldbyname
 property access_level:TField index 'id' read fieldbyname


end;

 

 

[2008-06-25 02:39:30.385256 | Author:jiangjianxiao ] [] 64 comments

paxscript

basic

一句话,还真不错,有很多vb.net的语法,但又有些不同,比方说 过程无需带(),写了一段调用adodb的脚本,跑起来速度不赖,同vbscript差不多。

接下去,测试了字符串连接,类似

s=s & rs.fields("field").value & "\r\n" ’后面这个\r\n应该不是vb的特征

 

发现速度下来了,可见字符串处理效率不高,但想到其可以调用delphi 的vcl库,试着想使用vcl的字符串类,如TStringList,发现运行到add就卡壳

imports classes 'delphi classes 单元

dim s as TStringList

s=new TStringList

s.Add("test")

不支持的特色

1. is 操作符 typeof c is integer

2. 不能在定义时创建新对象,如dim c as new MyObject

 

javascript

1. 注意单元引用,如 using a in './units/a.pp'

 bug

var a = new Array(3)
a[2] = 12;
//println a;
//println a.length;
a[5] = 36;
//println a;
//println a.length;
var d = a.concat([1,2,3]);
println d.length;
println d;

这段脚本居然丢失 a[5].  结果为,,12,,,1,2,3 ,长度为8,显然,contact冲掉了最后一个元素

如果 写

a=[1,2,3];

a.conact([4,5,6]); //不认这个conact

看来是不能用了

 

 

[2008-06-18 14:41:44.531428 | Author:jiangjianxiao ] [] 8 comments

curl的许可

被infoq 上的 curl 6.0 比actionscript 3.0快8倍的消息刺激了一下,所以这几天又留心了一下curl. 说到又,是这个东西很早前就关注过,不过被它的语法搞晕了。 不过现在再来看,倒也不难,无非是一种置标语言+代码,同 xml 内嵌代码没什么区别,比方说

{CommandButton label="test"},你可以看成<CommandButton label="test"/>或是

CommandButton but=new CommandButton{label="test"}

当然这句更等效的是

{let but:CommandButton={CommandButton label="test"}}

n多的大括号:(

这东西的许可在这里,http://www.curl.com/products_licensing.php 大致看了一下,这公司大有酒香不怕巷子深的意味。

首先,基本使用是免费的,不过对照 pro的许可,会发现一些功能缺失(而且对是针对企业级应用的,像https,encryption,concurrency,所以免费使用的许可也只能说是玩具)

  • Https support
  • Complex concurrency
  • Running with privilege
  • Encryption & pCurl
  • Single sign-on
  • QTP integration
  • 就算是免费的,在web上部署,你也需要申请许可,当然本地和localhost不需要

    ide 的pro版本有60天的免费使用期,要收费的,不过你可以免费使用非pro版本

    6.0是传统的ria应用,7.0 代号nitro ,选air ,加入了离线内容

    对比一下,siliverlight ,走开放路线,基本可能达到免费,flex 也是走开放路线,基本可以达到免费的程度。而你这个样子,凭什么啊?

    [2008-06-14 08:47:02.417322 | Author:jiangjianxiao ] [] 4 comments

    我的第一篇在app engine上的blog

    虽然粗糙,但都是自己一行一行 代码垒起来的,虽然代码也没有几行:), 我的数据是通过urllib post上来的,结果是没有作者字段。 app engine缺少一种通过email 获取user对象的方法。 为了将user字段补充完成。 我写了这样一个方法

    @check_login
    def update_author(request):
      for blog in Blog.all():
      blog.user=users.get_current_user()
      blog.put()
     return HttpResponse("Update author finish!")

    结果如何,超时错误,然后换成这样

    @check_login
    def update_author(request):
     user=users.get_current_user()
     for blog in Blog.all():
      blog.user=user
      blog.put()
     return HttpResponse("Update author finish!")

    pass

     

    最近的blog都没有技术含量,呵呵 ,datastore没有一种批量更新的方法吗? 我现在没有发现,类似 update Blog set user=:1,倒是删除有针对集合的操作  ,另外,像这样的场合,使用事务处理应该会快些吧

    这东西一开始用app engine自身的RequestHandler机制写的,我写了一个简单的mvc类来简化开发,记录在这里,备忘吧

    main.py

     application=webapp.WSGIApplication(
      [   ('/(?P<app>\w+?)/(?P<controller>\w+?)(?:/(?P<action>\w+?))?(?:/(?P<id>\d+?))?(?:\?\w*)?',contrib.mvc.DispatchRequestHandler)

     

    class DispatchRequestHandler(webapp.RequestHandler):
        def __init__(self):
            super(DispatchRequestHandler,self).__init__()
        def dispatch(self,app,controller,action=None,id=None):
            module="%s.%s_controller" %(app.lower(),controller.lower())
            m = __import__(module)
            for i in module.split(".")[1:]:
                m = getattr(m, i)
            path=os.path.dirname(m.__file__)
            Controller=getattr(m,"%sController" % controller.capitalize())
            c=Controller(self,path)
            if action is None:
                action='index'
            func=getattr(c,action)
            if id is None:
                func()
            else:
                func(id)
        def get(self,app,controller,action=None,id=None):
            self.dispatch(app,controller,action,id)
        def post(self,app,controller,action=None,id=None):
            self.dispatch(app,controller,action,id)

    Controller基类

    class Controller(object):
        def __init__(self,handler,path):

            self.handler=handler
            self.request=handler.request
            self.response=handler.response
            self.path=path
            self.flush=Flush()
        @property
        def method(self):
            return self.request.method
        def redirect(self,uri,t=False):
            self.handler.redirect(uri,t)

     
        def error(self,code):
            self.response.set_status(code)
            self.response.clear()

     

        def render_to_response(self,file,values=None):
            path=os.path.join(self.path,"templates",file)

            self.response.out.write(template.render(path,values))
        #new,GET请求,返回一个用于创建资源的表单
        def new(self):
            pass
        #show,处理针对单个资源的GET请求
        def show(self,id):
            pass
        #create,处理POST请求,并将创建一个新资源
        def create(self):
            pass
        #edit,GET请求,返回一个用于更新资源的表单
        def edit(self,id):
            pass
        #update,处理PUT请求,并更新指定的资源
        def index(self):
            pass
        #update,处理PUT请求,并更新指定的资源
        def update(self,id):
            pass
        #destroy,处理DELETE请求,销毁一个资源
        def destroy(self,id):
            pass

     

     

    [2008-06-13 10:48:12.744533 | Author:jiangjianxiao ] [] 6 comments

    django小提示-FormPreview中的BooleanField

    这个问题得确是django的 bug
    问题在于django 总是将BooleanField的值处理成True,False,但有个地方存在不一致的地方,就是
    CheckboxInput的value_form_datadict方法

    代码
    1. def value_from_datadict(self, data, files, name):  
    2.       if name not in data:  
    3.           # A missing value means False because HTML form submission does not  
    4.           # send results for unselected checkboxes.  
    5.           return False  
    6.       return super(CheckboxInput, self).value_from_datadict(data, files, name)  


    这个方法会导致一些错误,因为 data是个字符串的词典,因此,这个方法会返回bool的False(当data中没有is_test时)或字符串的'False'(当存在,但值为False时)
    第一个是hash 值的计算,一开始的bool类型的False同unicode字符串的False是不同 的. 这样会导致当不核选时需要提交两次
    其次是当render的时候,可以查看CheckboxInput的render方法,里面有个check_test,默认被设置为bool,这样,当调用bool('False')时,返回的就是True了

    所以,修改上面的方法(或继承新建一个Checkbox2Input),让其根据实际情况返回bool值就ok了
    比方说(这只是个quick and dirty的解决方法,英语好的可以提交bug,让django团队来处理这个问题)

    代码
    1. def value_from_datadict(self, data, files, name):  
    2.      if name not in data:  
    3.          # A missing value means False because HTML form submission does not  
    4.          # send results for unselected checkboxes.  
    5.          return False  
    6.      #print data[name],"value_form_datadict",type(data[name])  
    7.      result=super(CheckboxInput, self).value_from_datadict(data, files, name)  
    8.      return True if result in ['on','ON','True','true'] else False  

    由于存在这两个问题,因此光传入一个check_test lambda 还不足以解决问题,我一开始就以为这个能解决,呵呵

    [2007-12-06 11:59:12 | Author:jiangjianxiao ] [] 7 comments

    Total 91 Display 1 of 5
    2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
    Powered by Google App Engine