控件:
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
2254

被折叠的 条评论
为什么被折叠?



