tomcat配置虚拟路径的4种方法
在tomcat中,webapp文件夹默认为web应用的根目录。

1.在tomcat\conf\server.xml中找到 host标签,在host标签中增加新的元素<Context/>并设置 Context的元素,其中path元素所设置的值就是在浏览器中所要访问的虚拟路径的名称;docBase元素所对应的值就是web应用所在的具体目录,这里既可以的相对webapp的相对路径,也可是文件的绝对路径。

<Engine name="Catalina" defaultHost="localhost">
.......

<Host name="localhost" appBase="webapps"
       unpackWARs="true" autoDeploy="true"
       xmlValidation="false" xmlNamespaceAware="false">

       <Context docBase="SHARP" path="/test" reloadable="true" />

       <!--<Context docBase="D:/SHARP" path="/test" reloadable="true" />-->
      </Host>

</Engine>

2.在tomcat\conf\Catalina\localhost文件夹中设置一个web应用名称一样的xml文件。在xml文件中内容有一个<Context/>标签。

<Context path="/test" reloadable="true" />

3.直接在webapp目录下建一个包含WEB-INF/web.xml的项目应用文件夹,在游览器访问页面时会自动将此项目文件的名件名作为虚拟目录的名称。

4.直接在webapp目录下发布一个打包好的WAR文件,tomcat会自动解压war文件,在游览器访问页面时会自动将此项目文件的名件名作为虚拟目录的名称。
posted @ 2012-02-11 15:09 D10.天地弦 阅读(1) 评论(0) 编辑

 

 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.天地弦 阅读(10) 评论(0)  编辑

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

posted @ 2011-11-03 10:07 D10.天地弦 阅读(17) 评论(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.天地弦 阅读(22) 评论(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.天地弦 阅读(15) 评论(0)  编辑
摘要: functionTStrIntfHashMap.Remove(constKey:string):IInterface;varBucket:PStrIntfBucket;I:Integer;{$IFDEFTHREADSAFE}CS:IInterface;{$ENDIF}begin{$IFDEFTHREADSAFE}CS:=EnterCriticalSection;{$ENDIF}Result:=nil;ifKey=''thenExit;Bucket:=@(FBuckets[FHashFunction(HashString(Key))]);forI:=0toBucket.Count阅读全文
posted @ 2011-10-08 08:26 D10.天地弦 阅读(20) 评论(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) 编辑