工作总结

 ①添加皮肤 

控件:
ExpressBars / TdxRibbon
Dev Express / TdxSkinController /  双击

TdxRibbon属性:
ShowTabGroups false
ShowTabHeaders false
Support... True

页面:

uses dxRibbonForm,dxskinsdxribbonpainter;
type
  TMainForm = class(TdxRibbonForm)

 

②连接MySql

新建FORM单元 / TSQLConnection
属性:

ConectionName=MySQLConnection
Params:
  HostName=192.168.10.188
  DataBase=stu_test
  User_name=root
  Password=FLC315CLF
  ServerCharSet=gb2312

 

③运行时调试OutPutDebugString(''); 

 

④最近掌握的WM

两个程序之间用消息传递数据WM_COPYDATA

问题 : 我想用 SendMessage 和自定义消息在两个程序之间传递一个字符串 ,问题是如果这个字符串是一个常量 ,SendMessage(h,CM_MYMESSAGE,0,integer(pchar('abcdef'))); 另外一个程序对 CM_MYMESSAGE 进行处理可以收到 'abcdef'。

             然而 ,把 abcdef 变成一个 pchar 或者 string 进行传递 ,就无法正常使用了!如何解决呢?


解答 : 可以利用 WM_COPYDATA 来做。

进程一中:

procedure Init;
var
  s  : pchar;
  h  : hwnd;
  buf:tagCOPYDATASTRUCT;
begin
  h := FindWindow('TForm1', 'Form1');
  if h <> 0 then
  begin
    GetMem(s,100);
    buf.lpData :=s;
    buf.cbData:=100;
    buf.dwData :=100;
    strpcopy(s, ParamStr(0));
    SendMessage(h, WM_COPYDATA, 0, integer(@buf));
  end;
end;


进程二中:

procedure TForm1.WM_COPYDATA(var msg: TMessage);
var
  P:^tagCOPYDATASTRUCT;
begin
  p:=Pointer(Msg.lParam);
  ShowMessage(strpas(p.lpData)); //strpas 将指定的字符串转换为AnsiString类型字符串对象
end;

 

进程1:

procedure TForm1.Button1Click(Sender: TObject);
var
  h: HWND;
  Size: Integer;
  cdds: TCopyDataStruct;
begin
  h := FindWindow(nil, '接收窗口'); { 按标题查找目标窗口 }
  if h > 0 then
  begin
    cdds.lpData := Pchar(FIE.LocationURL + #0);               { 要发送的字符串, #0 表示 PChar 结束}
    cdds.dwData := WM_COPYDATA;                                     { 指定消息类型}
    cdds.cbData := ByteLength(FIE.LocationURL) + 2;        {指定要发送的数据的大小,多出的两个字节用于后面的 #0}
    SendMessage(h, WM_COPYDATA, 0, Integer(@cdds)); { 发送 }
  end;
end;

 

进程2: 

procedure MyCopyDataMsg(var Msg: TMessage); Message WM_COPYDATA;

procedure TForm_Main.MyCopyDataMsg(var Msg: TMessage);
var
  cdds: TCopyDataStruct;
  p: pchar;
  i: integer;
  WebURL: array [0 .. 260] of Char;
begin
  if Msg.Msg = WM_COPYDATA then
  begin
    cdds := PCopydataStruct(Msg.LParam)^;
    p := AllocMem(260);
    CopyMemory(p, cdds.lpData, cdds.cbData); // 取定长度
    i := integer(p);
    PostMessage(self.Handle, WM_ADDBSINFO, i, 0); // 活用参数传递
    FreeMem(p);
  end;
end;


-------------------------------------------------------------------------------------------------------------------------------------------------

WM_SYSCOMMAND:

procedure WMSysCommand(var message: TWMsysCommand); message WM_SYSCOMMAND;

procedure TForm_Main.WMSysCommand(var message: TWMsysCommand);
begin
  if message.CmdType = SC_CLOSE then
  begin
    Application.Terminate;
    exit;
  end;
  if message.CmdType = SC_MINIMIZE then
  begin
  end;
  inherited;
end;


-------------------------------------------------------------------------------------------------------------------------------------------------

WM_NCHITTEST:

这个消息是当鼠标移动或者有鼠标键按下时候发出的。
对无标题窗口的拖动,我们一般是采用:响应WM_NCHITTEST消息,返回HTCAPTION来实现。
但是,如果在这同时还要处理鼠标的消息,如WM_LBUTTONDOWN、WM_LBUTTONUP、WM_RBUTTONUP、WM_MOUSEMOVE,你会发现,这些消息都收不到了。
为什么? 因为你在WM_NCHITTEST中处理了鼠标消息,把他定位成HTCAPTION,也就是鼠标在标题栏上,而标题栏属于非客户区(NC);非客户区的事件消息都是以WM_NC开头的。也就是说,当你的WM_NCHITTEST返回HTCAPTION时,原来可以用WM_LBUTTONUP处理的消息, 现在你只能用WM_NCLBUTTONUP来处理。

“HITTEST”就是“命中测试”的意思,WM_NCHITTEST消息用来获取鼠标当前命中的位置。

WM_NCHITTEST的消息响应函数会根据鼠标当前的坐标来判断鼠标命中了窗口的哪个部位,消息响应函数的返回值指出了部位,例如它可能会返回HTCAPTION,或者HTCLIENT等。(其返回值有很多,请查阅MSDN)。

为了便于理解,我先描述一下Windows对鼠标键按下的响应流程:

1. 确定鼠标键点击的是哪个窗口。Windows会用表记录当前屏幕上各个窗口的区域坐标,当鼠标驱动程序通知Windows鼠标键按下了,Windows根据鼠标的坐标确定它点击的是哪个窗口。

2. 确定鼠标键点击的是窗口的哪个部位。Windows会向鼠标键点击的窗口发送WM_NCHITTEST消息,来询问鼠标键点击的是窗口的哪个部位。(WM_NCHITTEST的消息响应函数的返回值会通知Windows)。通常来说,WM_NCHITTEST消息是系统来处理的,用户一般不会主动去处理它(也就是说,WM_NCHITTEST的消息响应函数通常采用的是Windows默认的处理函数)。

3. 根据鼠标键点击的部位给窗口发送相应的消息。例如:如果WM_NCHITTEST的消息响应函数的返回值是HTCLIENT,表示鼠标点击的是客户区,则Windows会向窗口发送WM_LBUTTONDOWN消息;如果WM_NCHITTEST的消息响应函数的返回值不是HTCLIENT(可能是HTCAPTION、HTCLOSE、HTMAXBUTTON等),即鼠标点击的是非客户区,Windows就会向窗口发送WM_NCLBUTTONDOWN消息。

我们有必要详细讨论一下:如果WM_NCHITTEST的消息响应函数的返回值是HTCAPTION,即指示了鼠标点击了标题栏,接下去Windows的处理是怎样的?

上面已经提到,接下来,Windows会向窗口发送WM_NCLBUTTONDOWN消息。

 

⑤.

1.dxbarmanager 问题
 (1):paintstyle设置为psCaptionGlyph用来显示图片和文字
 (2):wholerow或者 ismainmanu 设置为 true用来拉伸toolbar
 (3):borderstyle设置为bbsnone 可是去掉来回拖动toolbar
 (4):allowquickcustomizing 设置为false 去掉toolbar 的下三角
2.pagecontrol tabsheet里面设置index改变index顺序

3.

TcxImageList/双击Add Images;

TdxBarManager/ImageOptions/Images=TcxImageList.name;

TdxRibbonPopupMenu/BarManger=TdxBarManager.name;
/双击添加下拉子按钮
/按钮添加图标/ImageIndex=1....
/按钮隐藏/Visible=ivNever;

4.常用控件使用

Listbox

添加:lst1.Items.Add('------NO.' + IntToStr(m_list.Count) + '------');

 lst1.Items.Append((StuInfo(m_list.Items[m_list.Count-1]^)).academy);

取值: lst1.Items[lst1.ItemIndex];

     lst1.Items.Strings[lst1.ItemIndex];

删除: lst1.Items.Delete(lst1.ItemIndex);

     lst1.Items.clear;

 

ListView

if not assigned(lv1.Selected) then  exit;

//if lv1.Selected = nil then  Exit;

lv1.RowSelect := True;

添加: with lv1.Items.Add do

     begin

       Caption := (StuInfo(m_list.Items[i]^)).academy;

       SubItems.Add((StuInfo(m_list.Items[i]^)).special);

       SubItems.Add((StuInfo(m_list.Items[i]^)).stuclass);

       SubItems.Add((StuInfo(m_list.Items[i]^)).stuname);

       data := StuInfo(m_list.Items[i]^); 

     end;

取值: lv1.Items.Item[lv1.ItemIndex].Caption;

     lv1.Items.Item[lv1.ItemIndex].SubItems.Strings[0];

     lv1.Items.Item[lv1.ItemIndex].SubItems.Strings[1];

     lv1.Items.Item[lv1.ItemIndex].SubItems.Strings[2];

     lv1.Items.Item[lv1.ItemIndex].SubItems.CommaText;

     lv1.Items.Item[lv1.ItemIndex].SubItems.Text;

删除: lv1.Items.Item[lv1.ItemIndex].Delete;

 

Memo

   mmo1.Lines.Add(lv1.Items.Item[lv1.ItemIndex].Caption);

     mmo1.Lines.Append(lv1.Items.Item[lv1.ItemIndex].SubItems.Text);

 

ComboBox

添加: cbb1.AddItem('计算机信息技术系',cbb1);

取值: cbb1.Items[cbb1.ItemIndex];

cbb1.Text

 

TreeView

   if not assigned(cxTreeView1.Selected) then  exit;

单击TreeView选择:

if cxTreeView1.Selected.Text = '应用程序' then

  cxPageControl1.ActivePageIndex := 0;

 

 PageControl

cxPageControl1.HideTabs := true;

cxPageControl1.ActivePageIndex := 0;

 

TdxNavBar

nb_config.AllowSelectLinks := TRUE;

 nb_SysConfigGrpSelectedLinkChanged;

 

控件布局:

cxPageControl1.AlignWithMargins := True;

with cxPageControl1.Margins do

begin

Bottom := 4;

Left := 4;

Right := 4;

Top := 4;

end;

 

⑥.

一:并通过菜单 Project → View Souse 打开工程源文件;

program pro_sso;
uses
  Forms,
  frm_Login in 'frm_Login.pas' {Form_login},

{$R *.res}  //包含 Windows系统默认图标,光标等资源,如删除该句就没了delphi默认的icon图标等
begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm_login, Form_login);
  Application.Run;
end.


二:新建一个 Text 文件保存为.rc文件
  编辑:  capturecursor cursor "f:\sso11.10\image\CursorCapture.cur"
其中的路径可以随便给, 但(.cur文件等)可以按路径找到; 另外其中的所有大小写无关, 路径两边的双引号也可以省略。
资源文件名(spy.rc)别和你的.exe的文件名相同,这里把光标的资源文件存为其它的文件名spy.rc。

MainIcon ICON "c:\temp\my.ico"  把它保存为: Project1.rc ; 注意要保存在程序相同目录, ICON资源文件名和工程文件名相同, 后缀是.rc。
 其中ICON 说明这是一个图标资源, MainIcon 是该资源的标识符, 这个标识符应该是可以自定义的, 不过在这个特例中, 只能使用 MainIcon , 因为程序要从同名的资源文件中查找标识为MainIcon 的资源做图标(删除 {$R *.res}).

三:把spy.rc添加到工程组:

program pro_sso;
{$R 'spy.res' 'spy.rc'}
uses
  Forms,
  frm_Login in 'frm_Login.pas' {Form_login},

{$R *.res}  //包含系统默认加载的图标,光标等资源,删除该句就没了icon图标等

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm_login, Form_login);
  Application.Run;
end.


四:这时工程源文件自动添加了一行: {$R 'spy.res' 'spy.rc'}
五:制作加载完成,这时在工程组的任何单元中都可以加载该资源.cur。
单元中加载使用自定义光标.cur

Screen.Cursors[CAPTURE_CURSOR] := LoadCursor(HInstance, 'capturecursor');
Application.Icon.Handle := LoadIcon(HInstance, 'MainIcon ');//加载图标icon


总结:
此时的spy.rc被编译成了spy.res,
此时的CursorCapture.cur文件被编译进spy.res,
此时的spy.res文件也被编译到工程.exe 中了。

 

CREATE PROCEDURE `insert_app_log`(in userid int(11),in oprate int(11),in appname varchar(260),in webaddr varchar(260),in macpar varchar(260),in ippar varchar(260))
BEGIN
  DECLARE apptype INT DEFAULT 0;
  DECLARE username VARCHAR(260);
  DECLARE groupname varchar(260);

  SELECT sua.app_type INTO apptype FROM sys_app sua  WHERE app_name = appname;

  SELECT user_name INTO username FROM sys_user_info WHERE id = userid;

  SELECT sug.group_name INTO groupname FROM sys_user_group sug 
  LEFT JOIN sys_user_info sui 
  ON sui.group_id=sug.id WHERE sui.id=userid;

  INSERT INTO log_app_operation_ex(app_name,app_type,web_addr,opration,user_name,user_group,mac,ip,time,state) VALUES (appname,apptype,webaddr,oprate,username,groupname,macpar,ippar,now(),0);
END

 

CREATE PROCEDURE `update_login_user_pwd_by_userid`(in idpar int(11), in oldpwd varchar(260),in newpwd varchar(260),in macpar varchar(260),in ippar varchar(260))
BEGIN
 DECLARE num INT DEFAULT 0;
 DECLARE outparam1 INT DEFAULT 0;
 DECLARE pwdid INT DEFAULT 0;
 DECLARE newpwdlen INT DEFAULT 0;
 DECLARE pwdlength INT DEFAULT 0;
 DECLARE pwdcomplex INT DEFAULT 0;
 DECLARE i,t1,j INT DEFAULT 0;
 DECLARE str CHAR DEFAULT '';
 DECLARE username varchar(260);
 DECLARE  groupname varchar(260);
VDOOR:BEGIN
	 SELECT COUNT(*) INTO num FROM sys_user_info WHERE id = idpar AND passwd=BINARY oldpwd ;
	 IF num=0 THEN
		SET outparam1 = 1;
#原密码不正确

	 LEAVE VDOOR;
	 END IF;
   
   SELECT pwd_id INTO pwdid FROM sys_user_info WHERE id = idpar;
   SELECT len,limits INTO pwdlength,pwdcomplex  FROM sys_password_policy WHERE id = pwdid;
    SET newpwdlen = CHAR_LENGTH(newpwd);
    #记录新密码的长度
    IF newpwdlen < pwdlength THEN
     SET outparam1 = 2;

    LEAVE VDOOR;
    END if;
#新密码长度小于密码策略规定最小长度

   IF (pwdcomplex & 16) > 0 THEN 
     SET  i = 1;
     SET  t1 = 0;
     WHILE i <= newpwdlen do
      BEGIN
       SET str = SUBSTRING(newpwd FROM i FOR 1);
       SET  j = ascii(str);
       IF (j > 64) and (j <91) then
        SET  t1 = 1 ;
       end if;
       IF (j  > 96) and (j <123) then
         SET  t1 = 1;
       END IF;
       if t1 = 1 then
        SET  i = newpwdlen;#退出while循环
       END IF;
      SET  i = i +1;
     END;
    END while;
    IF t1 = 0 then
     SET outparam1=3;
     LEAVE VDOOR;
    END if;
  END if;   
#是否有字母
   IF (pwdcomplex & 8) > 0 THEN
     SET i =1 ;
     SET t1 = 0;
     WHILE i <= newpwdlen DO
      BEGIN
         SET str = SUBSTRING(newpwd FROM i FOR 1);
        SET j = ASCII(str);
        IF (j > 96) AND (j < 123) THEN
         SET t1 = 1;
        END IF;
        IF t1 = 1 THEN
         SET i = newpwdlen;
        END IF;
        SET i = i + 1;
      END;
     END WHILE;
     IF t1 = 0 then
       SET outparam1=4;
     LEAVE VDOOR;
    END if;
   END IF;

#是否有小写字母
   IF (pwdcomplex & 4) > 0 THEN
     SET i =1 ;
     SET t1 = 0;
     WHILE i <= newpwdlen DO
      BEGIN
        SET str = SUBSTRING(newpwd FROM i FOR 1);
        SET j = ASCII(str);
        IF (j > 64) AND (j < 91) THEN
         SET t1 = 1;
        END IF;
        IF t1 = 1 THEN
         SET i = newpwdlen;
        END IF;
        SET i = i + 1;
      END;
     END WHILE;
     IF t1 = 0 then
       SET outparam1=5;
     LEAVE VDOOR;
    END IF;
   END IF;
 #是否有大写字母
   IF (pwdcomplex & 2) > 0 THEN
     SET i =1 ;
     SET t1 = 0;
     WHILE i <= newpwdlen DO
      BEGIN
        SET str = SUBSTRING(newpwd FROM i FOR 1);
        SET j = ASCII(str);
        IF (J > 32) and (J<48) then
         set t1 = 1;
        end if;
        if (J > 57) and (J<65) then
         set t1 = 1;
        end if;
        if (J> 90) and (J<97) then
         set t1 = 1;
        end if;
        if (J> 122) and (J<127) then
         set t1 = 1;
        end if;
        IF t1 = 1 THEN
         SET i = newpwdlen;
        END IF;
       SET i = i + 1;
      END;
     END WHILE;
     IF t1 = 0 then
       SET outparam1=6;
     LEAVE VDOOR;
    END if;
   END IF;
#是否有特殊字母
    IF (pwdcomplex & 1) > 0 THEN
     SET i =1 ;
     SET t1 = 0;
     WHILE i <= newpwdlen DO
      BEGIN
        SET str = SUBSTRING(newpwd FROM i FOR 1);
        SET j = ASCII(str);
        IF (j > 47) AND (j < 58) THEN
         SET t1 = 1;
        END IF;
        IF t1 = 1 THEN
         SET i = newpwdlen;
        END IF;
        SET i = i + 1;
      END;
     END WHILE;
     IF t1 = 0 then
       SET outparam1=7;
     LEAVE VDOOR;
    END IF;
   END IF;
#是否有数字

   UPDATE sys_user_info SET passwd = newpwd,user_state = 2 WHERE id = idpar ;	
   SET outparam1 = 0;
#成功

#添加修改密码成功的日志类型为2
    SELECT user_name INTO username FROM sys_user_info WHERE id = idpar ; 

    SELECT sug.group_name INTO groupname FROM sys_user_group sug 
    LEFT JOIN sys_user_info sui 
    ON sui.group_id=sug.id WHERE sui.id=idpar;
   
    INSERT INTO log_user_operation(type,user_name,group_name,mac,ip,time,state) VALUES (2,username,groupname,macpar ,ippar ,CAST(NOW() AS datetime),0);  
LEAVE VDOOR;
END;
   SELECT outparam1;  
END
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值