2011年01月06日

Delphi_将被其他窗体遮住的窗体弹到最前面 
 
 
unit SysFocus;
interface

uses

Windows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs;

type

TSysFocus=class(TComponent)

public

function GetSysFocus:integer;

function SetSysFocus(hwnd:integer):integer;

end;
implementation
function TSysFoucs.GetSysFocus;//取当前活动窗口

var

hOtherWin,OtherThreadID,hFocusWin:integer;

begin

hOtherWin:=GetForegroundWindow;

OtherThreadID:=GetWindowThreadProcessID(hOtherWin,nil);

if AttachThreadInput(GetcurrentThreadID,OtherThreadID,True) then

begin

hFocusWin:=GetFocus;

result:=GetFocus;

if HFocusWin<>0 then

try

//SendMessage(GetFocus,WM_COPY,0,0);//书上是这么写的

finally

AttachThreadInput(GetcurrentThreadID,OtherThreadID,False);

end;

end

else result:=GetFocus;

end;
function TSysFocus.SetSysFocus(hwnd:integer):integer;//设置某窗口为活动窗口

var

hOtherWin,OtherTHreadID,hFocusWin:integer;

begin

hOtherWin:=GetForegroundWindow;

OtherThreadID:=GetWindowThreadProcessID(hOtherWin,nil);

if AttachThreadInput(GetcurrentThreadID,OtherThreadID,True) then

begin

hFocusWin:=GetFocus;

SetFocus(hwnd);

//SendMessage(hwnd,WM_COPY,0,0);

if hFocusWin<>0 then

try

//SendMessage(GetFocus,WM_COPY,0,0);

finally

AttachThreadInput(GetCurrentTHreadID,OtherTHreadID,False);

end;

end

else result:=SetFocus(hwnd);

end;
end.

2010年05月17日

select right(‘00000000′ + cast(1 as varchar(8)),8)

显示效果

1—>  00000001

2008年01月04日

LQ-670K爱普生针式打印机打印增值税发票字体变大

 

一、现象描述:

爱普生针式打印机打印增值税发票时,会出现字体变大的现象,参见图(1)、图(2)。

图(1)打印增值税发票字体偏大

图(2)打印增值税发票字体正常

二、原因分析:
       
计算机在处理数据时有两种数据格式分别为R AWEMF。由于两种数据格式的处理方式不同,就会造成软件和系统之间的兼容性问题。
RAW*
:原始图像数据存储格式。电脑发送的作业直接由打印机的驱动程序编译处理,处理后将数据发送给spooler管理器,进行打印。
EMF*
:电脑发送的作业通过系统GDI函数处理,处理过后在将数据发送给打印机的驱动程序进行编译和处理,最终将数据发送给spooler管理器,进行打印。

三、解决方法:   
1. Windows 2000/XP
操作系统
1.1
选择开始”—“设置打印机(打印机与传真)-鼠标右键点击所使用的针式打印机,然后选择属性
1.2 
选择高级打印处理器”—默认的数据类型选择为“RAW”,点击确定即可,如
图(3

图(3)选择默认数据类型

2. Windows98操作系统
2.1
选择开始”—“设置打印机-鼠标右键点击所使用的针式打印机,然后选择属性
2.2
选择详细资料后台打印设置-在数据格式中选择“RAW”,点击确定即可。

Variant WorkExcel, WorkBook, WorkSheet, CellsRange; WorkExcel = Variant::CreateObject("Excel.Application");//Start Excel WorkExcel.OlePropertySet("Visible",true);//Open Excel WorkBook = WorkExcel.OlePropertyGet("Workbooks"); WorkBook.Exec(Procedure("Add"));//Add a new workbook WorkBook = WorkExcel.OlePropertyGet("ActiveWorkbook"); WorkSheet = WorkBook.OlePropertyGet("ActiveSheet"); WorkSheet.OlePropertyGet("Cells").OlePropertyGet("Item",1,1).OlePropertySet("Value","Title"); WorkSheet.OlePropertyGet("Cells").OlePropertyGet("Item",2,1).OlePropertySet("Value","row(y)=2,column(x)=1"); CellsRange = WorkSheet.OlePropertyGet("Range","A1:C1"); CellsRange.OlePropertyGet("Cells").OleFunction("Select"); CellsRange.OlePropertyGet("Cells").OleFunction("Merge"); WorkSheet.OlePropertyGet("Range","A2").OlePropertyGet("Cells").OleFunction("Select"); //WorkSheet.OlePropertyGet("Range","A2").OlePropertyGet("Cells").OlePropertySet("HorizontalAlignment","xlCenter"); WorkSheet.OlePropertyGet("Cells").OlePropertyGet("Item",5,5).OlePropertySet("Value","123456.123"); WorkSheet.OlePropertyGet("Range","E:E").OlePropertyGet("Cells").OleFunction("Select"); WorkSheet.OlePropertyGet("Range","E:E").OlePropertyGet("Cells").OlePropertySet("Style","Comma"); WorkSheet.OlePropertyGet("Range","A2").OlePropertyGet("Cells").OleFunction("Select"); WorkSheet.OlePropertyGet("Range","A2").OlePropertyGet("Cells").OleFunction("Activate"); AnsiString abc = WorkSheet.OlePropertyGet("Cells",5,5).OlePropertyGet("Value"); ShowMessage(abc); return; Query1->Active = False; Query1->SQL->Clear(); Query1->SQL->Add("select * from T_Department"); Query1->Active = True; int i, row = 3, column = 1; AnsiString T_Value; for (i = 0; i < Query1->FieldCount; i++) { WorkSheet.OlePropertyGet("Cells").OlePropertyGet("Item",row,column + i).Exec(PropertySet("Value") << Query1->Fields->Fields[i]->FieldName.c_str()); } Query1->First(); while (!Query1->Eof) { ++row; for (i = 0; i < Query1->FieldCount; i++) //WorkSheet.OlePropertyGet("Cells").OlePropertyGet("Item",row,column + i).Exec(PropertySet("Value") << Query1->Fields->Fields[i]->AsString.c_str()); WorkSheet.OlePropertyGet("Cells",row,column + i).OlePropertySet("Value",Query1->Fields->Fields[i]->AsString.c_str()); Query1->Next(); } Query1->Active = False; CellsRange = WorkSheet.OlePropertyGet("Range","A1:IV65536"); CellsRange.OlePropertyGet("Cells").OleFunction("Select"); CellsRange.OlePropertyGet("Cells").OlePropertyGet("Font").OlePropertySet("size",10); CellsRange.OlePropertyGet("Columns").OleFunction("AutoFit");

主板USB接法大全

20070209 星期五 11:10

一、概述

  因为每个USB接口能够向外设提供+5V500MA的电流,当我们在连接板载USB接口时,一定要严格按照主板的使用说明书进行安装。绝对不能出错,否则将烧毁主板或者外设。相信有不少朋友在连接前置USB插线时也发生过类似的冒烟事见。这就需要我们能够准确判别前置USB线的排列顺序如果我们晓得USB接口的基本布线结构,那问题不是就迎刃而解了吗。

二、USB接口实物图

主机端:
接线图:
 
VCC
Data

Data

GND
实物图:
 

设备端:

接线图:

VCC
GND
Data

Data

 

三、市面上常见的USB接口的布线结构

  这两年市面上销售的主板,板载的前置USB接口,使用的都是标准的九针USB接口,第九针是空的,比较容易判断。但是多数品牌电脑使用的都是厂家定制的主板,我们维修的时候根本没有使用说明书;还有像以前的815主板,440BX440VX主板等,前置USB的接法非常混乱,没有一个统一的标准。当我们维修此类机器时,如何判断其接法呢?
  现在,把市面上的比较常见的主板前置USB接法进行汇总,供大家参考。(说明:代表有插针,代表有针位但无插针。)

1、六针双排

  这种接口不常用,这种类型的USB插针排列方式见于精英P6STPFL(REV1.1)主板,用于海尔小超人766主机。其电源正和电源负为两个前置USB接口共用,因此前置的两个USB接口需要6根线与主板连接,布线如下表所示。
■DATA1+
■DATA1-
■VCC
■DATA2-
■DATA2+
■GND

2、八针双排

  这种接口最常见,实际上占用了十针的位置,只不过有两个针的位置是空着的,如精英的P4VXMS(REV1.0)主板等。该主板还提供了标准的九针接法,这种作是为了方便DIY在组装电脑时连接容易。

■VCC
■DATA

■DATA

□NUL
■GND
 
■GND
□NUL
■DATA

■DATA

■VCC

  微星MS-5156主板采用的前置USB接口是八针互反接法。虽然该主板使用的是Intel 430TX芯片组,但首先提供了当时并不多见的USB1.0标准接口两个,只不过需要使用单独的引线外接。由于该主板的USB供电采用了限流保护技术,所以即使我们把USB的供电线接反,也不会导致主板无法启或烧毁USB设备的情况产生。
■VCC
■DATA

■DATA

■GND
 
■GND
■DATA

■DATA-
■VCC

  以下这种接口比较常见,多使用于815,或440BX较早的主板上。

■VCC
■DATA

■DATA

■GND
 
■VCC
■DATA

■DATA-
■GND

  以下这种接口现在不多见,也见于20012002年时期的主板上。

■VCC
■DATA

■DATA

□NUL
■GND
■VCC
■DATA

■DATA

□NUL
■GND

3、九针双排

  这种前置USB接口最常见,大多数主板都使用这种接口,有的还带有插槽来限位。如:精英P6IEAINTEL D845GLVA主板,L4IBMGL2(REV1.0B),精英865PE-A(REV2.0),捷波P4X400DA主板,捷波JP4MFM
■VCC
■DATA

■DATA

■GND
■NC
■VCC
■DATA

■DATA

■GND
□NUL
  

  有的主板的第十针也接地了,但这对性能改变不大,也没有多大差别,可以接也可以不接。
■VCC
■DATA

■DATA

■GND
■GND
■VCC
■DATA

■DATA

■GND
□NUL
  

  有的主板上不但带有限位设计,同时也明确标明了每一根针的定义,如微星MS-845GLML主板。

  捷波生产的几款主板的前置USB接口虽然也是九针,但空针的位置有所有同和其他厂家有点特殊,空针的位置正好相反,如845GPRO,845DBA845DBAR2等主板,空针的位置正好是第十针,而非第九针。

  精英L4S5M主板也是九针前置USB接口,但空针的位置是第七针,同时第四针是不使用的,两个USB接口的正好互反。对于互反的USB接口,我们一定要注意不能接错,因为这种情况因为我们接对了一个,往往按经验来判断连接另一个,造成部件损坏。

■GND
■NC
■DATA

■DATA

■VCC
■VCC
■DATA

■DATA

□NUL
■GND

4、十针双排

  精英P6STM主板,神舟电脑使用的FC810T主板使用十针双排USB接口,第九,十两名为闲置插针,两个USB接口的接法相同。

■VCC
■DATA

■DATA

■GND
■NC
■VCC
■DATA

■DATA

■GND
■NC

  像微星845 Ultra VER1主板,虽然使用的也是十针双排接法,但两组USB接法相反,并且使用了双地线。

■VCC
■DATA

■DATA

■GND
■GND
■GND
■GND
■DATA

■DATA

■VCC

  微星815E PRO(VER1)N1996

■VCC
■DATA

■DATA

■GND
■NC
■NC
■GND
■DATA

■DATA

■VCC

 
5
、十五针双排

  这种接口不多见,见于佰钰P4X266(PR22S),硕泰克SL65KV2主板上面,虽然插针多,但USB接口也只是两个,多余的上面一排都是地线,是为了减少USB线间的干扰,提高工作性能设计的。

■GND 
 NULL
■GND
■GND
■GND
■GND
■GND
■GND
■VCC
■DATA

■DATA

■GND
■VCC
■DATA

■DATA

■GND
实物:
 

  以下这种接口不多见,多见于一些OEM主板上面。

■GND 
■GND
■DATA+
■DATA-
■VCC
□NUL
■DATA+
■GND
■VCC
■DATA

■DATA

■GND
■GND
□NUL
■VCC
■DATA-

6、四针单排

  见于华硕CUSL2-C(REV1.02),三帝P651ML,精英L4VXA2等主板。

■VCC
■DATA+
■DATA-
■GND
□NUL

 

四、机箱端的接法

  目前市场上销售的DIY机箱的USB接头也有两种,一种是散的,一种是组合的,分别对应使用于非标USB接口和标准USB接口。

1、散线接头
 
2
、标准组合接头
 

  一般情况下,机箱使用的USB接头都使用4种不同颜色的线来使用之区别,其中黑色线为地线(GND),红色线为电源正级(VCC或+5Volt),白色线为数据负线(USB Port-Data-),绿色线为数据正线(USB Port+Data+)

  无论是散头接法还是组合接法,我们一定确定我们的安装正确无误后(特别是电源正负的接法),才能加电试机,否则就必须使用万用表来帮助我们判断板载USB插针的正确接法。

 


五、USB接口的基本判断方法

  USB线的插头方法最多,有六针的,也有八针,九针,十针的,但是因为USB线使用+5V电源和地线,这就为我们判别其正确定义提供了帮助。因为计算机在使用过程中会向空气中发射频带很宽的大量的电磁波,为了防止这些电磁波对其他家用电器的干扰,都使用了全钢机箱,并且箱体安全接地。

  还有一点需要大家明白,不但机箱接地,同时机箱也是开关电源次级的电源地,即我们通常所说的电源负极。所以在我们判别USB接口的地时,只要把万用表置于*1档或导通档,测试USB接口中那根针与机箱是导通的,这样就可以马上判断出地线。只要知道地线了,与其隔两根针的就是电源正,即VCC端。其余就可以按位置排列了。

基本方法:

  将万用表置于通断档或电阻档的*1档。

  用黑表笔接触主板的地线,如USB接口或键盘接口,固定螺丝位置的边缘,这些位置都是地线。

  黑表笔不动,用红表笔记逐个接触前置USB接口的插针。

  当接到某一插针时,万用表发出鸣叫或电阻档指示为0或较小数值时,就表示此时红表笔接触的前置USB插针是地线(GND)。接下来再根据USB连线的基本布局就可以判断电源正(VCC)和其他两根数据线了。

  如果还不放心,我们还可以继续判断电源正。因为USB使用的+5V电源,是由ATX20针电源插头的+5V(红色)或者是+5VSB(紫色)供应的,只要测量有哪根针与ATX电源的红或紫导通就可以了。

  一些高档主板的USB供电不是直接由电源提供的,而是通过功率电源管按制USB供电当故障发生时切断对外设供电,或者使用限流ICUSB接口的输出电流限定为500MA。我们可以通过观察PCB板上线路连接来判断电源正的接法;也可以通过使用万用表的电阻档测量,与USB接口相连的保险电阻或控制电源管导通的插针,就是USB接口的正极。


六、USB接口的供电方法

1、采用+5VSB或+5V供电

  一些低端主板生产厂家出于生产成本的考虑,有的是直接使用开关电源送出的+5VSB或+5V供电,其间有一个或根本没有保险电源或限流电阻。这样做的话会导致如是USB接口或USB外设出现故障时会造成主机不能加电或无法启动。如果是主机正在工作时插入了问题USB外设就会导致主板立即重启。

  中档主板的生产厂家多数都在USB供电回路中设计了电源滤波和可恢复保险电阻以保护主板稳定工作,避免受到热插拔USB外设时出现死机或重启现象。如下图因为生产厂家采用简单供电,导致供电回路中的滤波电感比较严重的烧毁。

  因为后置USB接口与键盘接口相近,所以大部分主板在设计时都采用了后置USB接口和键鼠一起供电的做法,在键盘接口附近一般会有一个JB1跳线,用户可以选择是使用+5VSB(可以提供键鼠开机功能,网络唤醒功能,但电流较小,无法满足移动硬盘供电)供电;或者是使用+5V电源供电(提供电流较大,但无法键鼠开机)。不过一些主板在设计时就取消了跳线,所以当电脑关机时键鼠灯常亮,这种情况只能在电脑关机后拔下主机的电源插头才能彻底断电。

  像映泰KBNHAG主板为了使用主板后置USB接口的供电更稳定,把键鼠和USB供电进行了分离。

2、采用+5V电源通过限流IC供电或使用电源管可控供电

  这种设计一般见于中高档主板,在USB供电回路中有电容滤波,保险电阻,限流IC或功率电源管,这种设计可以保证主板的每个USB接口向外设提供最大500MA的供电电流,同时当外设短路时,限流IC会自动切断USB接口的供电,保证主机正常稳定的工作。不过,因为最大供电电流只有500MA,所以当我们使用移动硬盘时,往往就会出现无法认盘,认盘后文件读取不易,只能拷贝小文件不能拷贝大文件,拷贝文件容易死机等情况。

 

七、注意事项

  六针的USB接口,其中的电源正和电源地是共用的。九针和十针的USB接口,第九针为空,是为了定位,防止USB接口反接,造成烧主板的情况。如果我们在判断时有疑问,我们还可以通过万用表辅助判断,以确定连接准确无误。

 


八、与其他接口的区别

1、九针的COM接口

  现在因为USB接口和1394接口的迅速普及,二者的连接安装方便,可以带电拔插,所以原来经常使用的COM端口现在已经较少出现在主板上了。生产厂家为了兼顾不同的客户群,只是在主板保留COM口的插针,供有需要的用户单独外接使用。

  由于COM使用的也是九针接口,一些用户在连接前置USB接口时经常会出现错误。注意二者的区别,COM口的第十针是空的,同时外围一般会有一个图形框,再就是有明显的“COM”字母标注。

2、九针的前置音频接口

  虽然前置音频接口(J_AUDIO)也是九针,但空针一般为第七针,同时该接口通常在声卡或后置耳麦接口附近。

 10针前置音频接口(隽星845PEML),该音频接口与普通常见的九针前置音频接口有所不同,1,9是右声道,2,10是左声道,3,47为地,5VCC6MIC IN8为空脚。


3
、九针的前置面板接口

  前置面板接口就是通常的电源开关,复位键,硬盘灯,电源灯。这几根线通常组合在一起,也正好是九根针,如果没有图示说明,那和前置USB接口非常相似。不过,我们可以注意到空针的为置也是第10针,特别是新的主板该接口都用明显的颜色加以区别,因此不容易出现错误。

4、九针INFOLINK接口

见于技嘉GA-IG1000-G主板。

5、九针的SPDIF接口

  见于技嘉和微星主板,不过该接口空针的位置为第五针。

69JDB接口

  见于微星MS-65666580等主板上,要注意该接口与前置USB接口非常相似,也是空缺第九针。

7、单排五针接口
  
红外接口

:红外接口的针脚定义和USB相似,也有VCCGND两脚,再就是发送和接收两脚,不过红外接口用的单排五针空的是第四针,而非第五针。


  
网络唤醒接口:

该接口虽然也是单排五针,但它的五针齐全。

8、五针接口

  主板上的五针接口也有好几种,如红外,SPDIF接口,SUB_CEN接口,这几种接口虽然使用的双排六针,但只有五根针,一般不会当成USB接口使用。

9、十五针接口
  
主板集成VGA接口:

该接口的使用在810之前的主板较常见,目前的主板一般都是直接使用板载VGA接口替代COM2接口的位置。

软猫接口:

如精英P6SET-ML,这种猫在370接口的主板上较常见,需要占用一定的CPU资源来完成数据的调制和解调功能,属专用接口,只能与厂家自己生产的软猫配套使用。类似的还有网卡接口等。

GAME接口:

因为游戏手柄也越来越多的使用了即插即用的USB接口,所以声卡附带的15GAME接口使用的机会也越来越少,所以部分生产厂家就在主板后置接口中省去了该接口,但在主板提供了扩展可能。

  

14针接置音频接口:

  该前置音频接口见于技嘉U8668D(七喜快乐2004),在其他主板上没有多见,最右边多余的四根针可以用来直接使用跳线帽来短接,使前后置音频接口同时起作用。否则后置接口将受前置接口的控制,当前置耳麦接口中插入话筒或耳机时,会自动切断后置接口的输入。

 

自动保存窗体状态的控件
——————————————————————————–
作者:未知  来源于:Delphi共和国  发布时间:2006-1-15 22:44:53
一些比较专业的软件都有自动保存窗口运行状态的功能,具体的方法都是在窗口关闭前将其状态保存到注册表中或ini文件中,而这些代码一般都是相同的,所以可以将其集中在一起,重复使用。本文将相应的代码用一个控件TPosition来实现,使用时只要将此控件放到相应的Form上即可,不需要增加任何代码,从而实现了“零”代码保存窗口运行状态。

  下面是这个控件的主要实现文件Position.pas的内容,包括相应的注释。为了保持注册表的整洁,这里把信息保存到ini文件中。

  unit Position;

  interface

  uses

  Forms, Classes, SysUtils, Windows, IniFiles;

  type

  //TPosition是不可视控件,由TComponent继承

  TPosition = class(TComponent)

  private

  //用此变量保存父窗口的OnDestroy事件

  FOnDestroy: TNotifyEvent;

  //用此函数替换父窗口的OnDestroy事件

  procedure FormDestroy(Sender: TObject);

  protected

  //在控件加载时恢复父窗口状态

  procedure Loaded; override;

  end;

  //恢复窗口位置函数

  procedure ReadFormPos(Form:TForm);

  //保存窗口位置函数

  procedure SaveFormPos(Form:TForm);

  //控件注册函数

  procedure Register;

  implementation

  //连接此控件的图标

  {$R Position.Dcr}

  //恢复窗口位置函数,窗口状态存放在ini文件中。

  procedure ReadFormPos(Form : TForm);

  var

  RegFile : TIniFile;

  SectName : string;

  begin

  //ini文件中存放Form信息的节名称

  SectName := Form.Name + ‘ Position’;

  //打开与可执行文件名相同的ini文件

  RegFile := TIniFile.Create(

  ChangeFileExt(Application.ExeName,’.ini’));

  //恢复窗口状态

  with Form do begin

  Left := RegFile.ReadInteger(SectName,’Left’,Left);

  Top := RegFile.ReadInteger(SectName,’Top’,Top);

  Width := RegFile.ReadInteger(SectName,’Width’,Width);

  Height := RegFile.ReadInteger(SectName,’Height’,Height);

  WindowState := TWindowState(

  RegFile.ReadInteger(SectName,’WindowState’,0));

  end;

  //关闭ini文件

  RegFile.Free;

  end;

  //保存窗口位置函数

  procedure SaveFormPos(Form:TForm);

  var

  RegFile : TIniFile;

  SectName : string;

  begin

  SectName := Form.Name + ‘ Position’;

  RegFile := TIniFile.Create(

  ChangeFileExt(Application.ExeName,’.ini’));

  with Form do begin

  RegFile.WriteInteger(SectName,’WindowState’,

  integer(WindowState));

  //最大化时,不保存窗口位置

  if WindowState <> wsMaximized then begin

  RegFile.WriteInteger(SectName,’Left’,Left);

  RegFile.WriteInteger(SectName,’Top’,Top);

  RegFile.WriteInteger(SectName,’Width’,Width);

  RegFile.WriteInteger(SectName,’Height’,Height);

  end;

  //当要保存状态的窗口是程序主窗口时,要特殊处理。因为主窗口收到最小化消息时,只是把此消息转至Application处理,本身并不最小化。所以我们要判断Application的状态。

  if Form = Application.MainForm then begin

  if IsIconic(Application.Handle) then begin

  Reg File.Write Integer(Sect Name,’WindowState’,

  Integer(wsMinimized));

  end;

  end;

  end;

  RegFile.Free;

  end;

  //注册控件

  procedure Register;

  begin

  RegisterComponents(‘XDCtls’, [TPosition]);

  end;

  //TPositon类的实现

  //当主窗口Destroy时,调用此函数,此函数又调用保存的OnDestoy事件处理函数

  procedure TPosition.FormDestroy(Sender: TObject);

  begin

  SaveFormPos(Owner as TForm);

  if Assigned(FOnDestroy) then FOnDestroy(Sender);

  end;

  //控件加载时,恢复父窗口位置,并对父窗口的OnDestroy事件进行替换

  procedure TPosition.Loaded;

  begin

  inherited Loaded;

  //非设计状态才进行处理

  if not (csDesigning in Componentstate) then begin

  ReadFormPos(Owner as TForm);

  FOnDestroy := (Owner as TForm).OnDestroy;

  (Owner as TForm).OnDestroy := FormDestroy;

  end;

  end;

  end.

  完成此单元后,新建一个Package,将此单元包含在其中,编译、安装即可。资源文件Position.dcr,可自行创建合适的图标。使用时,只要将这个控件放到相应的Form即可。下面是我测试时的窗体代码,不用加任何语句就可以自动保存窗体状态。

  unit Unit1;

  interface

  uses

  Windows, Messages, SysUtils, Classes, Graphics,

  Controls, Forms, Dialogs,Position;

  type

  TForm1 = class(TForm)

  Position1: TPosition;

  private

  public

  end;

  var

  Form1: TForm1;

  implementation

  {$R *.DFM}

  end.

  此程序在PWIN97+Delphi5.0下通过
 
 
 

IE框架中访问不同域的网页不能带入COOKIE————是IE浏览器的一个BUG?
偶然中发现一个IE浏览器的问题:
        站点aa.com的页面a.aspx中存在一个iframe,iframe的src为站点bb.com的b.aspx。b.aspx设置了一个COOKIE(不管临时保存还是长期保存),然后刷新aa.com/a.aspx,bb.com/b.aspx也会被刷新,这时候会发现第二次向bb.com/b.aspx的请求里面并没有带入第一次设置的COOKIE。
     更确切地说:IE浏览器丢掉了框架中不同域的COOKIE。

    查看浏览器的隐私选项,默认是“中”。现在把隐私的等级修改成“低”,再次做上面的测试,然后发现框架中的COOKIE可以被带入了。
   从这个现象来看,应该是IE出于安全考虑而做了限制。但是!!!处于不同的两个域的的页面,应该被看成打开了两个互不相关的浏览器窗口,大家各自设置自己的COOKIE,各自带入到下次请求中,只要互不影响,不应该受到限制。
      恩,那么,为什么要限制呢?看来还是微软的程序员对自己浏览器的安全没什么信心,担心同一浏览器窗口不同域的情况下,黑客仍可能获取另一域的COOKIE,所以干脆把其中一个域的COOKIE干掉!!!人家FireFox为什么就没这种限制?

===========================================================================

问题根源:

IE6/IE7支持的P3P(Platform for Privacy Preferences Project (P3P) specification)协议默认阻止第三方无隐私安全声明的cookie,Firefox目前还不支持P3P安全特性,firefox中自然也不存在此问题了。Mircosoft对此的具体描述可以参见 Privacy in Internet Explorer 6

解决方法:

很简单,在要嵌入的内容中(iframe指向的站点)输出P3P的主机头声明,步骤如下(Session variables are lost if you use FRAMESET in Internet Explorer 6 [http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q323752]):

1.打开IIS管理器 inetmgr
2.选择被嵌入iframe源站点或者目录,右键点击打开属性框
3.切换到HTTP头
4.添加
5.自定义HTTP头名: P3P
6.自定义HTTP头值: CP="CAO PSA OUR"
7.关闭属性框退出,即刻生效
至于上面CAO PSA OUR的具体意思,还是请参考前面的文章:Privacy in Internet Explorer 6[http://msdn2.microsoft.com/en-us/library/ms537343.aspx]

BEGIN TRANSACTION
  DECLARE @JobID BINARY(16)
  DECLARE @ReturnCode INT
  SELECT @ReturnCode = 0
IF (SELECT COUNT(*) FROM msdb.dbo.syscategories WHERE name = N’[Uncategorized (Local)]‘) < 1
  EXECUTE msdb.dbo.sp_add_category @name = N’[Uncategorized (Local)]‘

  — Delete the job with the same name (if it exists)
  SELECT @JobID = job_id
  FROM   msdb.dbo.sysjobs
  WHERE (name = N’DB_Shokei backup ‘)
  IF (@JobID IS NOT NULL)
  BEGIN
  — Check if the job is a multi-server job
  IF (EXISTS (SELECT  *
              FROM    msdb.dbo.sysjobservers
              WHERE   (job_id = @JobID) AND (server_id <> 0)))
  BEGIN
    — There is, so abort the script
    RAISERROR (N’Unable to import job ”DB_Shokei  backup” since there is already a multi-server job with this name.’, 16, 1)
    GOTO QuitWithRollback
  END
  ELSE
    — Delete the [local] job
    EXECUTE msdb.dbo.sp_delete_job @job_name = N’DB_Shokei backup’
    SELECT @JobID = NULL
  END

BEGIN

  — Add the job
  EXECUTE @ReturnCode = msdb.dbo.sp_add_job @job_id = @JobID OUTPUT , @job_name = N’DB_Shokei backup’, @owner_login_name = N’sa’, @description = N’No description available.’,  @category_name = N’[Uncategorized (Local)]‘, @enabled = 1, @notify_level_email = 0, @notify_level_page = 0, @notify_level_netsend = 0, @notify_level_eventlog = 2, @delete_level= 0
  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

  — Add the job steps
  EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID, @step_id = 1, @step_name = N’Step 1′, @command = N’declare @bakname varchar(100)
declare @dbname varchar(100)
declare @sql varchar(8000)
set @bakname=”bkDB_Shokei_”+cast(getdate() as varchar(11))
–星期日到星期六对应备份文件是bak0到bak6
set @dbname=”DB_Shokei”
set @sql=”BACKUP DATABASE [''+@dbname+''] TO DISK=N””C:\Program Files\Microsoft SQL Server\MSSQL\Backup\”+@bakname+”.bak”” WITH INIT,NOUNLOAD,NOSKIP,STATS=10,NOFORMAT”
exec(@sql)
‘, @database_name = N’master’, @server = N”, @database_user_name = N”, @subsystem = N’TSQL’, @cmdexec_success_code = 0, @flags = 0, @retry_attempts = 0, @retry_interval = 0, @output_file_name = N”, @on_success_step_id = 0, @on_success_action = 1, @on_fail_step_id = 0, @on_fail_action = 2
  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
  EXECUTE @ReturnCode = msdb.dbo.sp_update_job @job_id = @JobID, @start_step_id = 1

  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

  — Add the job schedules
  EXECUTE @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id = @JobID, @name = N’Schedule 1′, @enabled = 1, @freq_type = 8, @active_start_date = 20070616, @active_start_time = 0, @freq_interval = 1, @freq_subday_type = 1, @freq_subday_interval = 0, @freq_relative_interval = 0, @freq_recurrence_factor = 1, @active_end_date = 99991231, @active_end_time = 235959
  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

  — Add the Target Servers
  EXECUTE @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @JobID, @server_name = N’(local)’
  IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

END
COMMIT TRANSACTION
GOTO   EndSave
QuitWithRollback:
  IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
EndSave:

 

sql日期格式转换

2007-02-19 18:12在sql中,smalldatetime及datetime型的数据显示不是那么让人满意,因此我找了些格式化的方法列出来"

convert(char(10),datetime,101)

在数据库取出来的时候就转换好
 select getdate()
 
 2006-05-12 11:06:08.177
 
 我整理了一下SQL Server里面可能经常会用到的日期格式转换方法:
 
 举例如下:
 select Convert(varchar(10),getdate(),120)

2006-05-12
 select CONVERT(varchar, getdate(), 120 )
 2006-05-12  11:06:08

 select replace(replace(replace(CONVERT(varchar, getdate(), 120 ),’-',”),’ ‘,”),’:',”)
 20060512110608
 
 select CONVERT(varchar(12) , getdate(), 111 )
 2006/05/12
 
 select CONVERT(varchar(12) , getdate(), 112 )
 20060512

 select CONVERT(varchar(12) , getdate(), 102 )
 2006.05.12
 
 其它几种不常用的日期格式转换方法:

 select CONVERT(varchar(12) , getdate(), 101 )
 0612/2005 select CONVERT(varchar(12) , getdate(), 103 )
 12/09/2004

 select CONVERT(varchar(12) , getdate(), 104 )
 12.05.2006

 select CONVERT(varchar(12) , getdate(), 105 )
 12-05-2006

 select CONVERT(varchar(12) , getdate(), 106 )
 12 05 2006

 select CONVERT(varchar(12) , getdate(), 107 )
 05 12, 2006

 select CONVERT(varchar(12) , getdate(), 108 )
 11:06:08
 
 select CONVERT(varchar(12) , getdate(), 109 )
 0512 2006 1

 select CONVERT(varchar(12) , getdate(), 110 )
 09-12-2004

 select CONVERT(varchar(12) , getdate(), 113 )
 12 052006

 select CONVERT(varchar(12) , getdate(), 114 )
 11:06:08.177

2006年11月21日

SQL Server
选择"Windows身份验证"进入,不需要输入密码,只要你是本机的系统管理员或者域管理员,此时自动成为SQL Server的管理员;
在查询分析器窗口中输入下面的语句直接更改SA密码:
sp_password Null,’ok\’,\’sa\’
运行后sa的密码变为"ok"

sp_password存储过程的功能是更改SQL Server登录的密码;
语法格式:
sp_password [ [ @old = ] \’old_password\’ , ]
{ [ @new =] \’new_password\’ }
[ , [ @loginame = ] \’login\’ ]
参数说明
[@old =] \’old_password\’ :
旧密码;
[@new =] \’new_password\’ :
要指定的新密码
[@loginame =] \’login\’ :
要指定的用户
返回值: 0(成功)或 1(失败)

以上方法的关键原理在于,"查询分析器"中以"Windows身份验证"连接SQL Server,只要你是本机的系统管理员或者域管理员,此时自动成为SQL Server的管理员.