delphi事务处理 - CSDN博客

mikel阅读(1619)

 

来源: delphi事务处理 – CSDN博客

1、这是直接在delphi中使用事务
procedure TForm1.Button1Click(Sender: TObject);
begin
ADOConnection1.BeginTrans;
Try
aq2.close;
aq2.SQL.clear;
aq2.SQL.add(‘update bank set currentMoney=currentMoney-1 where customerName=”张三”’);
aq2.ExecSQL;
aq2.sql.Clear;
aq2.sql.add(‘update bank set currentMoney=currentMoney+1 where customerName=”李四”’);
aq2.ExecSQL;
ADOConnection1.CommitTrans;
Application.MessageBox(‘提交成功’,”);
Except
ADOConnection1.RollbackTrans;
Application.MessageBox(‘提交失败’,”);
End;
end;
2、在存储过程里使用,然后再调用。
procedure TForm1.Button3Click(Sender: TObject);
begin
with aq2 do
begin
close;
SQL.Clear;
SQL.Add(‘exec mmm’);
try
ExecSQL;
Application.MessageBox(‘提交成功’,’存储过程’);
except
Application.MessageBox(‘提交失败’,’存储过程’);
end;
end;
end;
创建存储过程 代码:
create proc mmm
as
begin
/**//*–开始事务–*/
begin transaction
declare @errorSum int    –定义变量,用于累计事务执行过程中的错误
set @errorSum=0
update bank set currentMoney=currentMoney-1 where customerName=’张三’
set @errorSum=@errorSum+@@error    –累计是否有错误
update bank set currentMoney=currentMoney+1 where customerName=’李四’
set @errorSum=@errorSum+@@error –累计是否有错误
/**//*–根据是否有错误,确定事务是提交还是回滚–*/
if @errorSum<>0
begin
print ‘交易失败,回滚事务.’
rollback transaction
end
else
begin
print ‘交易成功,提交事务,写入硬盘,永久保存!’
commit transaction
end
print ‘查看转帐事务后的余额’
select * from bank
end
表:if exists(select* from sysobjects where name=’bank’)
drop table bank
create table bank
(
customerName char(10),    –顾客姓名
currentMoney money        –当前余额
)
go
/**//*–添加约束,帐户不能少于元–*/
alter table bank add
constraint CK_currentMoney check(currentMoney>=1)
/**//*–插入测试数据–*/
insert into bank(customerName,currentMoney)
select ‘张三’,1000 union
select ‘李四’,1
呵呵。。。以上存储过程是在网上找的,加以修改的。注:以在查询器中执行无误。。数据库是MSSQL2000

对mysql事务提交、回滚的错误理解 - jae - 博客园

mikel阅读(1590)

来源: 对mysql事务提交、回滚的错误理解 – jae – 博客园

一、起因

begin或者START TRANSACTION开始一个事务

rollback事务回滚
commit 事务确认

人们对事务的解释如下:事务由作为一个单独单元的一个或多个SQL语句组成,如果其中一个语句不能完成,整个单元就会回滚(撤销),所有影响到的数据将返回到事务开始以前的状态。因而,只有事务中的所有语句都成功地执行才能说这个事务被成功地执行。

这句话本身没有什么问题,问题是我给理解错了,我测试中问题描述为如下:

mySQL事务中有两条insert语句,其中第二条语句是错误的,在运行完事务后,第一条仍然插进去了,代码如下。

复制代码
 //创建表:
CREATE TABLE `test_tab` (
`f1`  int(11) NOT NULL ,
`f2`  varchar(11)  DEFAULT NULL ,
PRIMARY KEY (`f1`)
)
ENGINE=InnoDB

//执行事务:
START TRANSACTION;
INSERT INTO test_tab VALUES    (1, '2');
INSERT INTO test_tab VALUES    (1, '3');
COMMIT;
复制代码

(错误:这只是我一开始的认为)一开始认为只要把事务写出来,最后用commit提交一下,数据库会自动判断这些语句是否全执行成功,如果成功则把所有的数据插入到数据库,如果有一条失败就自动回滚至原始状态!显然我认为错了。

我执行上面的语句后的结果是:

[SQL]START TRANSACTION;

受影响的行: 0

时间: 0.000s

[SQL]

INSERT INTO test_tab VALUES (1, ‘2’);

受影响的行: 1

时间: 0.001s

[SQL]

INSERT INTO test_tab VALUES (1, ‘3’);

[Err] 1062 – Duplicate entry ‘1’ for key ‘PRIMARY’

我们看结果可以知道INSERT INTO test_tab VALUES (1, ‘3’);这一句因为主键冲突运行失败,从而这一条下面的commit也没有执行。

需要注意的是:这时已经开启了一个事务,并且已经执行了一条正确的插入语句,虽然没有体现在数据库中,但如果以后在该连接中又执行了一条commit 或begin或start transaction(新开一个事务会将该链接中的其他未提交的事务提交,相当于commit!)你会发现已经将刚才的INSERT INTO test_tab VALUES (1, ‘2’);写进了数据库。

 

所以事务的回滚不是这么理解的,正确的理解应该是,如果事务中所有sql语句执行正确则需要自己手动提交commit;否则有任何一条执行错误,需要自己提交一条rollback,这时会回滚所有操作,而不是commit会给你自动判断和回滚。

 

二 解决办法

  1. C++调用方式:(简单示例)

先定义一个变量标志bool m_flag=true;

再执行事务和sql语句如:(execute为自己写的函数,如下)

execute( m_sqlCon, “begin”);

execute(m_sqlCon,”INSERT INTO test_tab VALUES (1, ‘2’)”);

execute(m_sqlCon,”INSERT INTO test_tab VALUES (1, ‘3’)”);

如果执行过程中任意一语句出错则将该标志m_flag置为false。

这时不应该去提交commit,而是用一个函数去判断标志是否为false,如果为false说明执行的sql语句中有失败的,就执行rollback,否则说明全部正确,执行commit。如下面的 commit_transaction()方法。

 

代码大致如下,如使用需要修改!

复制代码
 1 privat void execute(MYSQL m_sqlCon, string sqlStatement)
 2 {
 3 r = mysql_real_query(m_sqlCon, sqlStatement, (unsigned long)strlen(sqlStatement));
 4     if (r)
 5         m_flag = false; // 出错则标记一下
 6 }
 7 public bool commit_transaction()
 8 {
 9         int ret_error = 0;
10         if (!m_flag)
11         {
12             cancel_transaction();
13             return false;
14         }
15         else
16         {
17             if (!(ret_error = mysql_commit(m_sqlCon)))
18             {
19                 cancel_transaction();
20                 return true;
21             }
22         }
23         return true;
24 }
复制代码

 

2.利用存储过程:

复制代码
复制代码
 1 CREATE PROCEDURE PRO2()
 2 BEGIN
 3     DECLARE t_error INTEGER;
 4     DECLARE    CONTINUE HANDLER FOR SQLEXCEPTION SET t_error = 1;
 5 
 6     START TRANSACTION;
 7         INSERT INTO test_tab VALUES    (1, '2');
 8         INSERT INTO test_tab VALUES    (1, '3');
 9         
10         IF t_error = 1 THEN
11             ROLLBACK;
12         ELSE
13             COMMIT;
14         END IF;
15 END
复制代码

 

复制代码

然后调用 CALL  PRO2()

这个直接可以利用mysql去决定他应该是回滚还是提交。

mysql存储过程游标的嵌套 - CSDN博客

mikel阅读(1191)

我们使用mySQL存储过程的时候 有时候我们会遍历很多数据,那么选择游标是个不错的办法

来源: mysql存储过程游标的嵌套 – CSDN博客

我们使用mySQL存储过程的时候 有时候我们会遍历很多数据,那么选择游标是个不错的方法 它会帮助我们获取数据的.但是大多数时候,我们会需要嵌套游标的组合解决实际项目中的

问题.好了废话少说,我们先来认识简单的游标:

//定义循环标记

DECLARE useraccountid INT DEFAULT 0; #用户编号

DECLARE done TINYINT(1) DEFAULT 0;

//查询表中的账号编号 存入变量cur1中
DECLARE cur1 CURSOR FOR    SELECT user_account_id  FROM user_account_info ‘;

#基本上每个使用游标的人都有这句话
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;   #循环终止的标志,游标中如果没有数据就设置done为1

#打开游标

OPEN cur1;
FETCH cur1 INTO useraccountid;
WHILE (done=0) DO
FETCH cur1 INTO useraccountid;

//逻辑处理

//结束循环
END WHILE ;
//关闭游标
CLOSE cur1;

上面的就是个简单的 游标模板 ,当游标中没有数据的时候 done=1 退出循环.
今天需要用到嵌套游标 在网上找了好多例子,基本上看不懂 因为本人也是第一次接触这个.既然存储过程也可以理解为一门新的编程语言,那么语言 应该是相同的.

借助于java语言的嵌套循环问题,那么游标是不是也可以这么实现了.我们就动手试试看能不能

DECLARE useraccountid int DEFAULT 0;
DECLARE daiid int DEFAULT 0;
DECLARE done TINYINT(1) DEFAULT 0;#是否未找到数据标记
DECLARE cur1 CURSOR FOR select agent_account_id from agent_account_info where parent_id in ( select agent_account_id from agent_account_info where grandpa_id in (select agent_account_id from agent_account_info where agent_account=CONCAT(agentAcc)) or parent_id in (select agent_account_id from agent_account_info where agent_account=CONCAT(agentAcc)) or agent_account=CONCAT(agentAcc)) or agent_account=CONCAT(agentAcc);
DECLARE cur2 CURSOR For select user_account_id from user_account_info WHERE user_account_type=2 and parent_id=CONCAT(daiid);
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;   #循环终止的标志,游标中如果没有数据就设置done为1
#打开游标
OPEN cur1;
FETCH cur1 INTO daiid;#获取数据
WHILE done=0 DO
open cur2;
fetch cur2 into  useraccountid;
WHILE done=0 DO

fetch cur2 into  useraccountid;
END WHILE ;
CLOSE cur2;

SET done = 0; //记得这个就行 其他的就按照你熟悉的编程语言来弄
FETCH cur1 INTO daiid;#获取数据
END WHILE ;
CLOSE cur1;
如果没有上面的set done=0的话 默认执行内层循环标记done=1就会终止外层的循环 也就是只能执行一次操作就会推出.

mysql 游标与事务共同使用

mikel阅读(893)

需要注意声明的顺序:


DELIMITER $$

USE `my_db`$$

DROP PROCEDURE IF EXISTS `test1`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `test1`()
BEGIN
DECLARE vi VARCHAR(50);
— 声明一个标志done, 用来判断游标是否遍历完成
DECLARE done INT DEFAULT 0;
— 事务错误变量
DECLARE t_error INT DEFAULT 1;
— 获取手机型号数量游标
DECLARE cur CURSOR FOR SELECT a FROM b ;

— 在游标循环到最后会将 done 设置为 1
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
— 事务过程中出错处理
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=0; — 出错处理
START TRANSACTION;
— 执行查询,打开游标
OPEN cur;
— 遍历游标每一行
REPEAT
— 把一行的信息存放在对应的变量中
FETCH cur INTO vi;

IF NOT done THEN
INSERT INTO a(f) VALUES(vi*10);
END IF;

UNTIL done END REPEAT;
CLOSE cur;
— 结束事务
IF t_error=0 THEN

ROLLBACK; — 事务回滚
ELSE
COMMIT; — 事务提交
END IF;
END$$

DELIMITER ;

成功解决织梦5.7SP2手机版上一篇下一篇链接错误问题

mikel阅读(887)

来源: 成功解决织梦5.7SP2手机版上一篇下一篇链接错误问题

成功解决织梦5.7SP2手机版上一篇下一篇链接错误问题

织梦5.7 年更新后增加了手机移动站的模板,但是织梦58小编在做手机站的模板时发现文章页中,得到当前文章的上一篇文章或下一篇文章时,得到的是电脑版本的连接且到最上一条时候链接错误,难怪官方的手机模板中都故意把这一小段注释掉了。原来官方可能是偷懒或什么原因没有把{dede:prenext get=’pre’/}标签修改更新好。下面织梦58小编就为大家提供解决这个问题的方法,只需要增加一点点代码就可以了。

找到目录下的\include\arc.archives.class.php文件 {dede:prenext get=’pre’/}标签就在这个文件中。

1:打开文件后查询$this->PreNext[‘pre’] = “上一篇:<a href=’$mlink’>{$preRow[‘title’]}</a> “;

在这一段代码后面增加一行 $this->PreNext[‘prem’] = “上一篇:<a href=’view.php?aid={$preRow[‘id’]}’>{$preRow[‘title’]}</a> “;

2:打开文件后查询$this->PreNext[‘next’] = “下一篇:<a href=’$mlink’>{$nextRow[‘title’]}</a> “;

后面增加一行$this->PreNext[‘nextm’] = “下一篇:<a href=’view.php?aid={$preRow[‘id’]}’>{$nextRow[‘title’]}</a> “;

3:打开文件后查询 else if($gtype==’nextimg’){ $rs = $this->PreNext[‘nextimg’]; }

后面增加

else if($gtype==’prem’){ $rs = $this->PreNext[‘prem’]; } else if($gtype==’nextm’) { $rs = $this->PreNext[‘nextm’]; }

对就是需要增加这三个地方。就可以了。

增加好后,我们就多了两个手机版本专用用的标签 {dede:prenext get=’prem’/} {dede:prenext get=’nextm’/}

成功解决织梦5.7SP2手机版上一篇下一篇链接错误问题

排错 : You have an error in your SQL syntax_百度经验

mikel阅读(707)

来源: 排错 : You have an error in your SQL syntax_百度经验

  1. 写的是创建存储过程的SQL,这个存储过程的功能主要是插入数据到数据库,写好后,运行SQL,却出错了如图所示的错误。

    排错 : You have an error in your SQL syntax
  2. 为了排错,把存储过程的内容简单化,修改sql代码,如图

    排错 : You have an error in your SQL syntax
  3. 重新执行sql,出现了同样的错误。

    为什么这样?sql本身已经很简单了,为什么还会有语法错误?

    排错 : You have an error in your SQL syntax
  4. 点击出错信息,Message里的信息,在下面看到完整的出错信息,提示说的就是语法错误。

    排错 : You have an error in your SQL syntax
  5. 点击左边的Query语句,在下面看到详细信息,为什么只有一部分的sql?后面的呢?end去哪里了?问题出在这里?

    排错 : You have an error in your SQL syntax
  6. 再次修改存储过程的内容,在begin语句里加多一条sql语句,如图

    排错 : You have an error in your SQL syntax
  7. 执行后,既然通过,没问题了…

    才想起,在存储过程里,如果有多条sql语句的,需要用begin,end。但如果只有一条语句的,则是不能有begin, end的….

    排错 : You have an error in your SQL syntax
  8. 再次修改存储过程,改成只用一条select语句,且把beign,end关键字注释掉。

    执行后,果然顺利通过了。

    排错 : You have an error in your SQL syntax

MySQL修改root密码的多种方法 - liufei - 博客园

mikel阅读(896)

来源: MySQL修改root密码的多种方法 – liufei – 博客园

在 Navicat for MySQL 下面直接执行  SET PASSWORD FOR ‘root’@’localhost’ = PASSWORD(‘newpass’);   就可以

 

 

方法1: 用SET PASSWORD命令

mySQL -u root

mySQL> SET PASSWORD FOR ‘root’@’localhost’ = PASSWORD(‘newpass’);

方法2:用mysqladmin

mysqladmin -u root password “newpass”

如果root已经设置过密码,采用如下方法

mysqladmin -u root password oldpass “newpass”

方法3: 用UPDATE直接编辑user表

mysql -u root

mysql> use mysql;

mysql> UPDATE user SET Password = PASSWORD(‘newpass’) WHERE user = ‘root’;

mysql> FLUSH PRIVILEGES;

在丢失root密码的时候,可以这样

mysqld_safe –skip-grant-tables&

mysql -u root mysql

mysql> UPDATE user SET password=PASSWORD(“new password”) WHERE user=’root’;

mysql> FLUSH PRIVILEGES;

Delphi 7皮肤控件VCLSkin 5.60的使用 - CSDN博客

mikel阅读(1840)

 

来源: Delphi 7皮肤控件VCLSkin 5.60的使用 – CSDN博客

VCLSkin是一个能够用于创建Delphi/C++ Builder应用程序美化界面的皮肤组件。它允许允许软件开发人员不用修改程序代码便把软件界面变得非常漂亮。它的美化支持窗体和控件和菜单。VCLSkin同时也提供了大量高质量的skin(皮肤)让你应用于你的程序。

官方网站http://www.link-rank.com /

CSDN下载地址:http://download.csdn.net/detail/wozengcong/5189629

其中一个皮肤的效果载图:

安装步骤:

1.从http://download.csdn.net/detail/wozengcong/5189629下载VCLSkin,我这里下载到的是5.6 Full Source版本,解压到硬盘;

2.打开Delphi 7→菜单栏→Tools→Environment Options→Library→(第一个路径)Library path→点击右边的〖…〗,添加刚才解压的VCLSkin目录下package文件夹和source文件夹,如下图所示:

注意:选择第一个library path添加,选择其他的添加,运行会报找不到WinSkinStore.dcu


3.下面打开Delphi 7使用的VCLSkin版本,菜单栏→File→Open→…/VCLSKIN/package/WinSkinD7R.dpk ,弹出对话框提示找不到资源文件,如下:

Cannot find resource file: F:/***/VCLSKIN/package/WinSkinD7R.res.  Recreated.

点击OK,就会重建了。

然后,在Package对话框点击Options,在Description选项卡→Usage Options,选中Designtime and runtime ,再点击OK确定按钮,再点击Compile自动完成就可以了。

如下图所示:

保存文件,关闭文件。


4.跟上面步骤一样打开…/VCLSKIN/package/WinSkinD7D.dpk ,也一样弹出找不到资源文件,按OK重建。点击Compile,然后再点Install(上一步没有install安装按钮,为灰色的,这一次有此按钮),安装顺利的话就会弹出安装成功对话框,提示新组件 WinSkinData.TSkinData, WinSkinStore.TSkinStore注册完成,

如下图所示:

保存文件,关闭文件。在面板上多了VCLSkin面板,下面2个组件,分别为TSkinData 和TSkinStore ,TSkinData 主要用于美化你的程序, 只要把TSkinData控件放下去,它就能自动美化所有窗体;TSkinStore 能让你在设计模式时储存多个skin文件。

5.下面开始测试应用。新建一个应用程序,拖动SkinData控件到窗体上,设置其SkinStore 属性,这是可以把skin文件储存在应用程序当中,然后设置Active 属性为True,编译运行程序,

效果如下图所示:

 

CSDN下载地址:http://download.csdn.net/detail/wozengcong/5189629

——————————————————————以下为转帖——————————————————————

学习DELPHI时为了美化程序,

所以在网上找到了这个插件!

1. VCLSkin综述
VCLSkin是一个能让Delphi程序变得非常漂亮的控件包. 它允许允许软件开发人员不用修改程序代码便把软件界面变得非常漂亮。它的美化支持窗体和控件和菜单。VCLSkin同时也提供了大量高质量的skin(皮肤)让你应用于你的程序。
2. VCLSkin特点
VCLSkin是一个用于让用户的程序界面更加漂亮的扩展控件。 它允许软件开发人员不用修改源代码就能让他们的程序界面更加漂亮。一个标准的程序界面能在窗体放入VCLSkin控件后变得非常漂亮,而这公公需要几分钟的时间。
VCLSkin 能做些什么 ?
不像其它控件那样,你需要修改源代码才能构建一个漂亮的界面, VCLskin 能让Delphi的标准控件在一下子就变得非常漂亮,而这一切都不用修改源代码。
VCLSkin 支持以下的窗体:
  • Delphi Form
  • MDIform . (normal,Maximized, MInimized)
  • Common Windows dialogs (Open/Save,Font,Print,Color).
  • MsgBox.
  • Exception MsgBox.
VCLSkin 支持的标准控件:
  • The title bar of TForm
  • The title bar buttons
  • The borders of Tform
  • Tbutton,TBitbtn.
  • Tradiobutton and Tcheckbox
  • Tmainmenu and Tpopupmenu
  • Toolbar buttons
  • TTabcontrol and TPageControl
  • T Progressbar
  • TStatusbar
  • TCustomCombox,Tcombobox, TDbCombobox
  • TPanel and TGroupbox
  • TMemo, TListBox,TListView,TTreeview
  • TRadioGroup , TDBRadioGroup.
  • TCustomGrid,TStringgrid,TDrawgrid,Tdbgrid.
  • Third party component, Enlib, AdvGrid ..
同时也支持大量的第三方控件。
3.安装
你可以像安装其它控件一样安装这夽控件,其实就这几步:
  • 解压缩 Vclskin2.zip 到任意目录
  • 在 Delphi IDE 环境中选择菜单 “File. Open…”, 然后找到连接库vclskindX.dpk, 按着点击Compile按钮。
  • 在 Environment 添加VCLSkin控件所在的路径。
DX – Delphi X, X – version CBX – CBuilder X, X – version
1. TSkinData
TSkinData 主要用于美化你的程序, 只要把TSkinData控件放下去,它就能自动美化所有窗体。
属性
Active: 使用或取消对程序的美化。
DisableTag: 取消对某个特定的组件的美化; 把组件的Tag属性设为99就行了。
(control.tag mod 100=disabletag)
SkinControls:指定哪类组件能被美化.
SkinFile: skin(皮肤)文件的包含路径的文件名,在运行时加载。
SkinStore: 在设计模式时储备的skin文件.
SkinFormType:能使用多种美化方式.
方法
LoadFromStream(Stream: TStream);
LoadFromFile(value:string);
LoadFromCollection(astore:TSkinStore;aindex:integer);
在运行时装载skin文件.
UpdateSkinControl(fParent:Tform);
UpdateMenu(fParent:Tform);
在运行时组件创建时进行美化。
事件
OnFormSkin(Sender:TObject;aName:string;Var DoSkin:boolean);
OnFormSkin 事件的发生先于美化窗体, 如果 Doskin 为 true, Vclskin 就会美化这个窗体, 如果为false,Vclskin 就会跳过这个窗体. aName 是窗体的类名.
OnSkinChangned(Sender:TObject);
OnSkinChanged 发生在skin文件改变之后。
2. TSkinStore
TSkinStore 能让你在设计模式时储存多个skin文件。
TSkinData 能在运行时从 TSkinStore 装载skin文件:
TSkinData.LoadFromCollection(astore:TSkinStore;aindex:integer),
3. 怎么美化程序界面
你可以在几分钟内构建一个漂亮的程序.
1 把 TSkindata 控件放在主窗体上。
2设置Skindata.skinstore属性 , 把skin文件储存在你的程序中。
3 设置Skindata.active = true
4 编译运行你的程序。
4.  VCLSkin   FAQ
1 如果我的工程中有14个窗体,用不用每个窗体都放一个skin控件?
不用,你只需要放置一个Tskindata在你的主窗体,Vclskin就能自动美化每个窗体。
2 怎样美化一个内嵌的窗体 ?
Vclskin 不能自动美化内嵌窗体,你要手动控制它。压缩包中有一个”NestedForm”的例子,讲的是在运行状态美化内嵌窗体、框架的。
3 怎样美化动态控件 ?
你需要手动控制它。代码如下:
control:=Tmycontrol.create(form1);
skindata1.UpdateSkincontrol(form1); // add this line to skin dynamic control.
4 怎样美化依靠窗体 ?
Vclskin 支持停靠窗体. 例程代码如下:
procedureTDockableForm.FormShow(Sender: TObject);
begin

if MainForm.skindata1.active then MainForm.skindata1.skinform(handle);

end;

5 怎么美化动态的右键菜单 ?
例程代码如下:
popup:=Tpopupmenu.create(form1);
….. add menuite
skindata1.UpdateMenu(form1); //add this line
popup.popup(x,y);
6 怎样美化动态窗体 ?
Vclskin 可以美化动态窗体 , 但不能自动美化内嵌窗体.点击这儿查看如何美化内嵌窗体.
7 找不到文件 ‘c:\program files\borland\delphi7\SM\winskindata.pas’
Delphi7 试用版Delphi7正式版的Dcu文件格式是不一样的。
如果你使用的是正式版,你可以安装一个演示包。vclskin2.zip.
如果你使用的是试用版,你可以安装一个演示包。D7trial.zip.
8 使用 FastReport 时,出现了“无效操作,控件没有父窗体的的错误提示 ?
设置TSkindata.skincontrols.xcFastReport = true就可以解决这个问题。
9 使用 ReportBuilder 出现了“无效操作,控件没有父窗体的错误提示?
你可以在TSkindata.OnformSkin事件中取消美化这个控件。 代码如下 :
procedureTform1.SkinData1FormSkin(Sender: TObject;
aName: String; var DoSkin: Boolean);
begin

//’TppPrintPreview’ 就是要取消美化的窗体名称。
if aName=’TppPrintPreview’ then doskin:=false;

end;

10 如何存取skin文件的颜色?
你可以借助Tskindata.colors[]属性来存取颜色。
比如说 , 窗体的背景色是 :skindata.Colors[csButtonFace].
TShemeColor=(csText,csTitleTextActive,csTitleTextNoActive,
csButtonFace,csButtonText,
csButtonHilight,csButtonlight,csButtonShadow,csButtonDkshadow,
csSelectText,csSelectBg,csHilightText,csHilight,
csMenuBar,csMenuBarText,csMenuText,csMenubg,
csScrollbar,csTextDisable);
TShemeColors=array[csText..csTextDisable] of Tcolor;
Skindata.Colors: TShemeColors;
11 用户能自定义那些可视化控件的外观吗?
你可以使用skin builder自定义细节.
12 怎样取消美化某个窗体或控件?
设置form.tag=99 取消美化这个窗体。
13 如何在美化一个工程的窗体标题栏和菜单的风格?
设置TSkindata.skincontrols.xcMainmenu = false.

 

//==========

通用控件安装方法:
———-
基本安装
1、对于单个控件,Componet–>install component..–>PAS或DCU文件–>install;
2、对于带*.dpk文件的控件包,File–>Open(下拉列表框中选*.dpk)–>install即可;
3、对于带*.bpl文件的控件包,Install Packages–>Add–>bpl文件名即可;
4、如果以上Install按钮为失效的话,试试Compile按钮;
5、是run time lib则在option下的packages下的runtimepackes加之。
如果编译时提示文件找不到的话,一般是控件的安装目录不在Delphi的Lib目录中,有两种方法可以解决:
1、反安装的源文件拷入到Delphi的Lib目录下;
2、或者Tools–>Environment Options中把控件源代码路径加入到Delphi的Lib目录中即可。
注意:所安装的控件是否与你所用的Delphi版本相适应。
———-
控件删除
在Component/Install Packages中删除。
选Component/configure Palette…
有pages和components两个区域
双击components区域,选中要删除得控件,下面有得Delete按钮
但系统提供的控件只能Hide,不能delete。
打开控件所在的包文件(*.dpk),从中删除控件那个文件,再重新编译该包即可。

如果是整个控件包都要删除的话,project->Option->Packages,删掉那个packages,收工。

VCLSkin5.60:点击下载

VCLSkin皮肤(233种):点击下载

VCLSkin皮肤制作工具:我的网盘

VCLSkin皮肤制作方法

阿里云配置MYSQL远程连接 - CSDN博客

mikel阅读(1014)

来源: 阿里云配置MYSQL远程连接 – CSDN博客

想要远程连接阿里云服务器安装的mySQL(不是RDS,RDS申请外网地址即可)需要两个步骤,

第一步是修改允许连接mySQL的权限,具体操作如下:

  1. 首先登录: mysql -u root -h localhost -p password
  2. 打开mysql数据库: use mysql;
  3. 将host设置为%表示任何ip都能连接mysql,当然您也可以将host指定为某个ip:
    update user set host=’%’ where user=’root’ and host=’localhost’;
  4. 刷新权限表,使配置生效: flush privileges;

备注:也可以添加一个用户名为yuancheng,密码为123456,权限为%(表示任意ip都能连接)的远程连接用户。命令参考如下:

grant all on *.* to 'yuancheng'@'%' identified by '123456';
flush privileges;
  • 1
  • 2

原文地址:http://my.oschina.net/ecnu/blog/295304

第二步需要修改一下mysql的配置文件:

文件路径是:/etc/mysql/mysql.conf.d/mysqld.cnf

  1. 打开此文件,找到bind-address = 127.0.0.1这一行,在前面加上#号注释掉这一行;
  2. 执行 /etc/init.d/mysql restart 命令重启mysql服务。

原文地址:http://blog.csdn.net/xx1710/article/details/52446703

到此就可以远程连接mysql了。

dedeCMS设置会员登陆跳转页面 | 无忧主机

mikel阅读(1109)

 

来源: dedeCMS设置会员登陆跳转页面 | 无忧主机

很多用户都有一个习惯,在网站浏览一段时间,才会登陆会员(当然,很大一部分是因为需要登录才会登陆),但是您会发现,有一些网站登陆后是跳转到会员空间的,这个时候对客户来说,还要回去找原来的页面,虽然说只是多了一步,但是对于用户体验来说其实是一个不佳的体验。

下面无忧主机小编详细说明下dedecms如何设置会员登陆跳转页面:

让会员登录时不跳转,停留在当前页面按下面的要求修改下代码,就可以实现这个功能了。首先在根目录下找到 member文件夹下的index_do.php文件,会员登陆后跳转返回首页需要修改以下语句

if(empty($gourl) || preg_match(“#action|_do#i”, $gourl))

{

ShowMsg(“成功登录,5秒钟后转向系统主页…”,”index.php”,0,2000);

}

修改成:

if(empty($gourl) || eregi(“action|_do”,$gourl))

{

ShowMsg(“登录成功,正在转向网站首页…”,”/”,0,2000);

}

通过代码可以看出,只是修改了一下跳转的地址。如果是登录后返回当前页面呢?只需要改为如下的代码即可:

ShowMsg(“成功退出登录!”,”-1″,0,2000);

echo “<script>location.href = document.referrer;</script>”;

改成“-1”以后,页面就会返回之前登录的页面。

 

如果想实现织梦DedeCMS会员退出系统时,也返回到织梦DedeCMS网站主页,可以采用相同的办法,在index_do.php文件中搜索下面这句:

ShowMsg(“成功退出登录!”,”index.php”,0,2000);

替换成:

ShowMsg(“成功退出登录!”,”/”,0,2000);