1   TFMDesign = class(TFMBase, IDataSetOperator)
 2   public
 3     //注意名称要不一样,重新定义保存方法
 4     procedure IDataSetOperator.DoApplyUpdates = ApplyUpdates;
 5 
 6     //重写保存方法
 7     procedure ApplyUpdates; stdcall;
 8 
 9     //接口用对象
10     property __Service: TDataSetOperator read F__Service write F__Service
11         implements IDataSetOperator;
12   end;

 

posted @ 2011-11-29 15:21 D10.天地弦 阅读(9) 评论(0)  编辑

在设计器中View->Options中调整Grid的大小默认为0.1mm,调成0.01后可以进行微调

posted @ 2011-11-03 10:07 D10.天地弦 阅读(16) 评论(0) 编辑

先来段代码

 

type
  MyString = AnsiString;
  PMyChar = PAnsiChar;


procedure TForm2.Button2Click(Sender: TObject);
var
  p: PMyChar;
  s, s2: MyString;
begin
  self.Caption := 'frmTest';  //7位的字符串
  p := GetCaption;
  s2 := p;   //这是时候s2 为frmTes
  ShowMessage(s2);  //*****显示出来为frmTes
end;

function TForm2.GetCaption: PMyChar;
var
  s1, s2: MyString;
begin
  s2 := MyString(self.Caption);
  Result := PMyChar(MyString(s2));
end;

 

研究说明(代表个人意见)(XE下面测试)

 

function TForm2.GetCaption: PMyChar;
var
  s1: MyString;
begin
  s1 := MyString(Self.Caption);    //self.Caption源码得知,是获取了一块临时的空间(A1)
  //A1(integer(s1))

  i:= StringRefCount(s1);  //i=1

  Result := PMyChar(MyString(s1));  //Result指针指向的为(A1)的空间
  //Integer(@Result^) = A1(integer(s1))  是指向同一块空间

  i:= StringRefCount(s1);  //i=1
end;
//函数返回后s1因为是局部变量 s1的引用计数为0,integer(s1)的空间被标志为可以覆盖
//返回的为指针,不增加s1的引用计数


procedure TForm2.Button2Click(Sender: TObject);
var
  p: PMyChar;
  s, s2: MyString;
begin
  self.Caption := 'frmTest';
  p := GetCaption; //实际上p指向的那块地址被标注为可以覆盖,随时都有可能被覆盖,是很危险的
  //Integer(@p^) = GetCaption内部给s1分配的那块空间地址
 
  s2 := p;         //导致丢掉了字符..
  //因为p指向的内存是可以被覆盖的,s2分配的地址可能和p指向的地址是一样的,导致丢掉了字符..
  //Integer(s2) 可能= Integer(@p^)  测试是发现都一样

  //下面操作(SetLength)同样也会一样结果,s2占用的和p占用的同样大小(或者小)。
  //这样导致了s2分配的空间可能和p内存一样
  //如果7改成较大的数就正常
  //  SetLength(s2, 7);
  //  StrCopy(PMyChar(s2), p);

  ShowMessage(s2);  //错误
end;

 

 解决方案(1)

将s1定义为内成员变量,这样当GetCaption执行完后那块空间不会被标准为可读写

 

function TForm2.GetCaption2: PMyChar;
begin
  FMyCaption := MyString(Self.Caption);    //self.Caption源码得知,是获取了一块临时的空间(A1)
  //A1(integer(FMyCaption))

  i:= StringRefCount(FMyCaption);  //i=1

  Result := PMyChar(MyString(FMyCaption));  //Result指针指向的为(A1)的空间
  //Integer(@Result^) = A1(integer(FMyCaption))  是指向同一块空间

  i:= StringRefCount(FMyCaption);  //i=1
end;
//执行完后FMyCaption不是临时变量,指向的地址不可以被覆盖

procedure TForm2.btnGetCaption2Click(Sender: TObject);
var
  p: PMyChar;
  s, s2: MyString;
begin
  self.Caption := 'frmTest';
  p := GetCaption2; //实际上p指向的那块地址和FMyCaption的地址是一样的
  //Integer(@p^) = GetCaption2内部给FMyCaption分配的那块空间地址是一样

  s2 := p;
  //因为p指向的内存是不可以被覆盖的,s2分配的地址不可可能和p指向的地址是一样的,这样做是安全的
  //Integer(s2) <> Integer(@p^)

  i:= StringRefCount(s2);  //i=1  新的内存

  ShowMessage(s2);  //正确
end;

 

 

***

局部变量

 

function TForm2.GetCaption2: PMyChar;
var

  s1: MyString;
begin
  s1 := 'frmTest'
  i:= StringRefCount(s1);  //i=-1  常量地址指向空间不可被覆盖
 
  //UniqueString(s1); 
  //i:= StringRefCount(s1);  //i=1  s1又变成临时的,函数返回后s1指向的地址不再安全
 
  Result=PMyChar(s1)
end;

 

 

 

posted @ 2011-10-20 13:54 D10.天地弦 阅读(20) 评论(0)  编辑

var
  ws: WideString;
  s: AnsiString;
  pw: PWideChar;
  p: PAnsiChar;
begin
  ws := 'ab中cd';
  pw := PWideChar(ws);
  s := ws;
  //p:=PAnsiChar(s); 正确
  //p:=PAnsiChar(String(pw));

  //不正确
  p := PAnsiChar(pw);  //这样转换,inc(p)后 显示的为00对应的为空

  inc(p, 1);  //
  ShowMessage(p^);

 

双字节

a:6100

单字节

a:61

posted @ 2011-10-19 15:31 D10.天地弦 阅读(14) 评论(0)  编辑

 

function TStrIntfHashMap.Remove(const Key: string): IInterface;
var
  Bucket: PStrIntfBucket;
  I: Integer;
{$IFDEF THREADSAFE}
  CS: IInterface;
{$ENDIF}
begin
{$IFDEF THREADSAFE}
  CS := EnterCriticalSection;
{$ENDIF}
  Result := nil;
  if Key = '' then
    Exit;
  Bucket := @(FBuckets[FHashFunction(HashString(Key))]);
  for I := 0 to Bucket.Count - 1 do
    if Bucket.Entries[I].Key = Key then
    begin

     //在Remove的时候仅仅只是返回了值,没有把Bucket.Entries[i]中的Value值进行置空。

     Result := Bucket.Entries[I].Value;

     //add by mofen
     Bucket.Entries[I].Value := nil;

      System.Move(Bucket.Entries[I + 1], Bucket.Entries[I],
       (Bucket.Count - I) * SizeOf(TStrStrEntry));
      Dec(Bucket.Count);
      Exit;
    end;
end;

 

我看了所有的Remove针对对象和接口的释放都貌似有些问题。

 

 

 

posted @ 2011-10-08 08:26 D10.天地弦 阅读(19) 评论(0)  编辑
摘要: //转自http://www.cnblogs.com/MurphyAefe/articles/1741825.html{ 说明:该事例实现的效果,在单个应用或代码量小的项目中,可以完全不用接口委托来完成。 之所以采用委托接口,主要是应用到:已经实现的接口模块中,在不改变原有代码的情况下, 需要对其进行扩展;原始模块只需要开放部分功能,但又不能暴露实现细节的场合;}unit TestUnit;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCt阅读全文
posted @ 2011-09-30 15:32 D10.天地弦 阅读(19) 评论(0)  编辑
摘要: ALTER DATABASE CXFX_DATASET ALLOW_SNAPSHOT_ISOLATION ONALTER DATABASE CXFX_DATASET READ_COMMITTED_SNAPSHOT ON//原来帮助里面写了,执行该语句时不能有其他东西连接数据库,难怪前几次执行了N久都没有反应,帮助没看仔细阅读全文
posted @ 2011-09-05 20:30 D10.天地弦 阅读(17) 评论(0)  编辑
摘要: 自己写的declare@countintDECLARE@SQLStringnvarchar(500),@TableNamevarchar(100)SELECTtop1@TableName=namefromsysobjectswherextype='u'SELECT@SQLString='select@innercount=count(1)from'+@TableNameEXECUTEsp_executesql@SQLString,N'@innercountintOUTPUT',@innercount=@countOUTPUTselect@Tabl阅读全文
posted @ 2011-09-01 11:38 D10.天地弦 阅读(16) 评论(0) 编辑
摘要: procedureCopyGridRecordToJsn(pvDataSet:TcxGridDBTableView;pvValueJsn:ISuperObject);vari,j:Integer;lvField:TcxGridDBColumn;lvItem:ISuperObject;beginwithpvDataSet,DataControllerdobeginfori:=0toController.SelectedRecordCount-1dobeginlvItem:=SO();tryforj:=0topvDataSet.ColumnCount-1dobeginlvField:=pvData阅读全文
posted @ 2011-08-23 09:23 D10.天地弦 阅读(50) 评论(0) 编辑
摘要: 1--A段2----------------------3selectso_d.*,4c_bf.FApproveState5fromsal_OrderListso_d6leftjoinbas_Bombom_m7on(so_d.FMaterialKey=bom_m.FMaterialKey8andso_d.FColorKey=bom_m.FColorKey)9innerjoincom_BillInfoc_bf10on(bom_m.FFormKey=c_bf.FFormKey)11and(c_bf.FApproveState=1)1213--B段14----------------------15阅读全文
posted @ 2011-08-11 11:40 D10.天地弦 阅读(17) 评论(0) 编辑