科学网

 找回密码
  注册

tag 标签: 自适应

相关帖子

版块 作者 回复/查看 最后发表

没有相关内容

相关日志

有想法没有行动的悲哀
热度 2 realbaryon 2019-5-1 15:25
今天在researchgate上看到一篇文章标题“Towards Uniform Point Density: Evaluation of an Adaptive Terrestrial Laser Scanner”,均匀和自适应立刻吸引了我的注意力,意识到可能和自己以前一个想法很类似。那是2016年产生的一个想法,觉得可以通过预先获取粗略场景,再通过改变激光扫描步长的方式获得适合分辨率的点云,当时起名“智能激光雷达扫描”。 今天看到这篇文章浏览了一下,思路非常类似,也是先粗略扫描场景,再根据距离调整扫描频率,从而得到均匀分布的点云。 很悲哀,虽然想法早了3年,但只是停留在想法上,没有继续。类似的情况还有不少,例如2010年时为了在palm treo 650的480X320像素小屏幕上看pdf文献,自己写程序实现了扫描版pdf段落重排(包括分栏pdf),但仅限于自己使用,没有商业化。 后面几年随着电子书和智能手机兴起,类似多看和K2pdfopt等软件或者kindle等电子书也实现了这个功能,包括扫描版pdf段落重排的概念也是后来才有的。 再一次,我的想法甚至实现都早了几年,但又停留在自娱自乐上了,看来对我来说行动比想法更重要。 专业知识和脑子点子能挣钱吗?谁来拯救我一下?
个人分类: 点子|3715 次阅读|3 个评论
MTP5.50的具体更新(二)——自适应屏幕分辨率
热度 2 陈小斌 2018-4-9 17:43
自适应屏幕分辨率,困扰我十几年,如今终于彻底解决了!! 现在不再受限于屏幕分辨率了。除非是800X600这种很小的屏幕,从1024X768开始,都会有比较好的体验。 解决来自十几年的思考和一时的顿悟! 闲话少说,直接上图! 以下图片中,右上角的红字为当前屏幕分辨率,窗体为运行于当前屏幕分辨率下时显卡上图形的样子。
个人分类: Pioneer|3976 次阅读|4 个评论
提高执政效率:自适应(下)
热度 2 fouyang 2015-3-18 08:36
自适应不仅适用于行政机构,也可以成为国会自我约束的工具。例如名噪一时的“国债封顶”,就是如此。此法规定,当国债到达限度时,必须由国会通过法律提高限额,才能继续举债。初看起来,这个法律很没有道理。政府花钱,举债的数额都是每年国会通过的预算决定的。所以国会既然通过了预算,也就作出了举债的承诺。以后再立法提高限额岂不是多此一举?奥巴马和不少议员就是这样看。但问题是我们面对的不是理性的计算机,而是由人组成的国会。国会在讨论预算时,一向是加钱容易砍钱难。很多实行了四五十年的项目(如农业补助),已经完全与现实脱节了。但终止或改动就等于动了一些人的奶酪,议员们多不愿趟这个浑水。还有些长期的财政问题如医疗成本和养老成本,一直被踢到下一届,总也解决不了。“国债封顶”就是逼迫国会面对现实,再一次审视整个政府收支平衡状况。通常,这是例行公事。但在一定的民意情况下(如2011年),这就可能变成更弦易轍的契机。 这种“自我强迫”常常是以“自残”的形式出现,也就是给自己的不作为预先规定一个惩罚。例如,不通过提高国债限额,就会导致政府停摆。“自残”是克制人性弱点的办法,但也不是万灵妙药。例如2011年的国债危机解决方案中,国会通过了一个“自动减支”( sequestration )法案:如果对于减少赤字的办法不能达成协议,则从2013年1月(后来推迟到3月)开始对于政府开支按比例裁减。当时听起来,这是个高招。按比例裁减是个很糟糕的措施,因为很多对于国计民生很重要的项目会受到影响。另一方面,这个法案留了一年多时间给国会去达成协议,把期限推到了大选以后,难题踢给了下届国会。所以,这个法案给了国会很大的动力和机会去解决赤字问题。谁知道国会要无能,神都挡不住。最后“自动减支”还是生效了。今天很多人骂这个“自动减支”是美国自废武功的蠢举。依我看,这不该怪当时立法之人,而是后来两党不能解套,该打板子。 如果立法者不愿意束缚自己手脚,还有一个办法是设定法律的期限,到时需要更新。这也给了国会一个重新审议修改的机会。这里比较成功的例子是美国的“中小学教育法” (Elementaryand Secondary Education Act) 。这个法律在约翰逊总统时代(1965年)制定,五十年来经过数次更新。克林顿总统和小布什总统都启动了比较大的修改,在联邦教育政策上留下了自己的指纹。目前奥巴马政府也在推动下一轮的更新和修改。 如何设定期限也是一门艺术。例如小布什在2000年代初的减税法案,当初规定是为期十年。这也合理,因为这个减税的理由之一就是联邦预算出现盈余,所以要还利于民。十年后应该根据当时的财务情况再行定夺。但减税过期正值2010年底,美国尚未从经济衰退中恢复,所以减税被延长了两年。到了2012年底,舆论和民意已经普遍把终止这个减税法案看成是增税了。所以即使一直抨击小布什“给富人减税”的民主党也不敢支持终止减税。最后两党达成协议,将大部分的布什减税条款永久化,只有最高收入群丧失了部分的减税利益。(“收回”的减税利益只占总数的五分之一。)可见,法律期限太长,既得利益会固化,再要改变就不容易了。 上面说到的几个“自适应”机制:给行政放权,在法律中允许调整和强迫立法行动以及设定法律期限,在美国的立法实践中都有采用。但看来至今这些都是“直觉”的举措而没有理论指导。这个问题在近年来开始得到重视,但从设想变成常规可行的行为模式还需要假以时日。 举个例子吧。目前国会正在讨论税务改革,估计这也会成为下一次大选的热门议题。税收水平及其在各阶层的分配会影响到社会的各个方面。从经济上说,它对贫富差别和经济成长率都有重大影响,但具体理论尚有争议。那么与其在理论上争论不休,何不用“自适应”的方法,“摸着石头过河”呢?在这个思路下,我们可以授权联储银行根据经济形势在一定范围内调整税率,也可以把税率与失业率,基尼指数,经济成长率等挂钩。对于争议较大的问题(例如取消资本利得的税率优惠是否会影响投资意愿),可以进行有期限的立法,到时候再评估效果。 在国会山的展览厅里有个地图显示国会建筑群扩张的历史。建国以来,美国联邦政府从一个松散的联合体变成了管理世界上最大的军事和经济机器的庞然大物。面对这样的变化,基于两百多年前宪法的立法过程就显得古老了。但这不等于我们不能在宪法的框架内进行优化和改进。民主是一个理念。但在实际操作中,存在着很多需要平衡的问题。民意代表性和行政有效性就是这样一对矛盾。根据不同性质的决策以及当时民意共识的情况,可以有不同的方法来部分克服立法过程低效的问题。努力提高民主制度的执政效率,不光是关系到本国福祉的大事,也是让民主理念发扬光大所不可缺少的一环。而在这个方面,我们不论是理论上还是实践上都有很大的改善空间。 参考文章: David Kamin, “IN GOOD TIMES AND BAD: DESIGNING LEGISLATIONTHAT RESPONDS TO FISCAL UNCERTAINTY”, Bookings Working Paper, 2014, http://www.brookings.edu/research/papers/2014/12/15-legislation-responds-fiscal-uncertainty-kamin 提高执政效率:自适应 (上) http://blog.sciencenet.cn/blog-309766-873577.html 提高执政效率:自适应(下) http://blog.sciencenet.cn/blog-309766-875224.html 有关博文: 从金融危机看着政府的角色(上)  http://blog.sciencenet.cn/blog-309766-870019.html 从金融危机看着政府的角色(下)  http://blog.sciencenet.cn/blog-309766-871735.html
个人分类: 政治经济|4532 次阅读|3 个评论
提高执政效率:自适应(上)
热度 3 fouyang 2015-3-11 06:38
民主制度的低效是众所周知的。在美国国会要通过一个法律,首先要有议员提案,然后经过相关委员会审议,听证,修改。如果委员会同意提交全体会议,那还要经过辩论,然后才是投票。即使侥幸在众议院和参议院都走过了类似程序,如果两院修改的结果不同,那还要产生双方妥协的版本,然后再交两院投票通过。通过后要总统签署才成为法律。如果总统否决,就需要两院都有三分之二的压倒多数才能推翻否决,完成立法。如果总统签字期限内国会已经闭会了,总统也可以不签字,叫做“搁置否决”,那就更复杂了。即使一个无人反对的法案,如果没有“贵人”积极推动的话,要过关斩将也是难于登天。要是有人反对的话,那在很多环节上个别或少数人就能封杀一个提案。上一届美国国会在2013和2014两年间共处理了一万多个提案,其中只有不到三百个成为了法律。一个没有争议的法案拖个两三年才通过,甚至无疾而终,都是很常见的。 美国的立法机制里也结合了一定的“科学态度”。国会所属的非党派性机构国会预算办公室负责对每个提案进行成本分析,预计今后十年对政府预算的影响。这个机构还定期进行经济和预算前景分析,并应议员的要求进行各种政策选项的经济分析。这些预计可以作为国会立法的根据之一,使得法律更符合现在和未来的国情。 但是,经济预计都带有很大的不确定性。特别是经济衰退的发生和结束,不但难以预测,而且往往当时都把握不准,事过几个月才能确认。如果政府需要审时度势随机应变的话,走通常的立法程序就太低效了。另外,有些决策具有长期的影响。如有关社会安全( socialsecurity ),医疗照顾( Medicare )的法律,会影响到一两代人以后的国家经济状况。当发现原来预计不正确时,那时的国会也很难有动力及时立法修正。 民主制度的这种低效可能是一个功能而不是缺陷。民主制度中改变现状很困难,这就减少了政客或民意因为一时冲动酿成大错的可能。为了保护少数群体的利益,防止“多数暴政”,在立法程序中设计了不少“否决”机制。不仅总统可以否决提案,国会内部的审议和辩论过程中如果有个别人强烈反对,往往也能让提案搁浅。但是除了设计中的“减速器”外,政客的人性也是效率低下的原因。小事情往往得不到足够注意力去推行,而大事情则因为两党僵硬的理念立场而难以达成共识,于是就旷日持久地拖延。更有甚者,两党在博弈谈判中常常劫持不相干的提案,也让不少例行公事也“躺着中枪”。 现代国家的管理需要较高的执政效率,而民主立法过程又是低效的。这个矛盾其实并非民主制度衰亡的迹象,而是从一开始就与民主制度形影相随。早在1887年,后来成为美国总统的伍德罗·威尔逊就发表了“行政学”( TheStudy of Administration )的论文,从而跻身公共行政学的创始人之一。在这篇并不长的论文中威尔逊提出:行政学与政治学既有联系也有区别:后者是关于制定怎样的法律和如何制定法律,而前者是关于如何低成本,有效和公平地执行那些法律。所以即使在不同的社会制度下,行政学也有很多共同规律。在当时民主制度如日中天的美国,威尔逊却指出:行政学最发达的是专制制度下的欧洲大陆国家。这是因为行政管理的有效性对于专制者保持权力更为重要,而且民主制度给行政效率带来了更多的困难。所以威尔逊认为,民主制度应该而且可以借鉴别的体制下的行政经验,从而有效地管理一个日趋复杂的国家机器。而其中一个关键的问题,就是如何处理民意与国家管理机构之间的关系。从那以后一百多年,公共行政学基本沿着威尔逊提出的方向发展,也积累了很多研究成果。但威尔逊提出的那些基本问题仍然存在。 威尔逊提出的解决之道,是分割民意机构(立法)与行政机构(执法)。执法机构由精通管理事务的技术官僚组成,只是间接地向民意负责。这个思路和宪法中的三权分立一致,但威尔逊的目的不是为了权力制衡而是为了提高行政效率。这个观念在美国也经过了几十年的争论,在二战以后才逐渐被广泛接受。而“自适应”的概念,也是基于这个思路提高执政效率的一个技术。 “自适应”指的是在法律中预设某些机制,使得政府能对变化的外界情况自动作出反应,而不需要重新通过繁复的立法程序。最简单的“自适应”,就是威尔逊指出的“放权”给行政部门的思路。 美国行政分支(总统领导下的内阁和各部)有些部门本来就有相当的独立性。如司法部门,联邦储蓄银行,联邦通信委员会等,受政治影响较小,主要工作是由专业人员主持。另外,不少专项法律也给予行政部门一定的自由度。2008年,为了应对金融危机而立法设立的“问题资产救援计划”( TARP ),本意是由政府买下风险最高的那部分资产。但法律刚通过,财政部就决定改变策略,用国会授权的这笔钱通过购买优先股的形式向银行注资。结果成功地稳定了市场信心,现在不仅收回成本而且略有盈余。虽然民意对于 TARP “救援肇事者”的做法很有争议,但对于这个策略改变却很少有非议。金融危机之后,也有不少人(如前纽约联储银行总裁,前财政部长盖特纳)提出要给予联储银行,联邦储蓄保险等机构更大的自主权,以便他们能及时应对危机而不需要临时征求国会批准。 当然,行政自主权不等于没有民意的制衡监督。有些时候,这种监督是在程序之中的。例如,联邦通信委员会在制定法规时必须有公众评论的过程。但更多的时候,这种监督是事后的,而且不是通过国会而是通过舆论。这是因为国家管理中有很多事情并没有原则上的争议,而是具体做法策略问题。而这些问题非专业人士很难了解,所以更好地是由专家公开辩论,老百姓得个兼听则明。这种民意与专家结合的治国方式其实至少在美国沿用已久。但它对怎样的事务更适用?其中自主与监督如何平衡?总统在其中又承担何种责任?这些理论问题似乎讨论还不够透彻。但给予行政机构相当程度的自主权,以便它能快速应对局势的变化,这种“自适应”有助于提高行政效率。 除了给予行政机构自主权外,另一个办法是在立法中埋设“自适应”机制。最简单的是建立一个按照当时情况进行微调的“算法”。例如美国社会安全福利的数额,依法按照每年的通货膨胀率进行调整。(至于由此引起了明知通胀率的估算方法不对却不能修正,可算是意外副作用了。)很多其它福利,税收的规定也是如此。这个方法也可以用到更复杂的情形。例如有人提议可以根据当时的空气质量启动或终止某些环保法规,可以根据失业率来决定某些经济刺激措施的力度等。调整的启动可以是基于某些硬指标,也可以授权行政部门依据一定原则自行决定。这样做的好处是比固定的立法灵活,可以应对立法时无法预料的情况。而且这种调整是透明,可预计的,所以便于个人,企业调整自己的行为。 (待续) 提高执政效率:自适应 (上) http://blog.sciencenet.cn/blog-309766-873577.html 提高执政效率:自适应(下) http://blog.sciencenet.cn/blog-309766-875224.html 有关博文: 从金融危机看着政府的角色(上)  http://blog.sciencenet.cn/blog-309766-870019.html 从金融危机看着政府的角色(下)  http://blog.sciencenet.cn/blog-309766-871735.html
个人分类: 政治经济|2963 次阅读|8 个评论
完全自适应遥感图像去霾清晰化技术(演示视频)​
热度 2 YongDuSci 2015-1-8 08:57
演示视频: http://v.youku.com/v_show/id_XODY2OTM3MjI4.html
个人分类: 科研试验|4119 次阅读|3 个评论
自适应网页设计应用于学术出版
dsc70 2013-9-12 11:04
MICHAEL CLARKE JSTOR 近期宣布它已经使用自适应网页设计技术( Responsive Web Design )重新配置了用户界面。他们的新闻稿这样写道: 不同于一个特定设备的APP或者是一个独立的移动网站,我们使用自适应网页设计技术实现一个根本性的改革,来使JSTOR界面自动适应设备的屏幕尺寸。在自适应设计中,网站的页面区域可回流、移动或者隐藏,为研究人员呈现了一种更简单但功能齐全的体验。 为了了解这到底是怎么一回事儿,可使用桌面浏览器登录 JSTOR 网站,然后使浏览器的窗口逐渐缩窄到移动电话的屏幕宽度。你会看到,当浏览器窗口的大小接近移动电话的尺寸并达到某个临界点时,网页内容会进行重排以适应较小的窗口。 你可能会说,这有什么大不了的,很多网站在很多年前就有了移动优化的观念,很多网站可以自动检测用户的设备并显示与设备相适应的视图。确实如此,但是,大多数此类网站检测到一个移动设备后会将用户重定向到一个具有不同 URL 的独立站点,这个 URL 在大多数情况下是专门配置给智能手机的。一些更现代的网站使用相同的 URL ,但在手机上只能显示一个“移动视图”。尽管这种方法对大多数移动设备的使用来说已经足够了,但考虑到不断增加的各种各样的移动设备和不同移动设备的形式等因素,我们需要一种不同的方法来优化。 随着 STM 和学术出版的新生,在很长一段时间内自适应网页设计技术在用户界面设计领域都将很有发展潜力,而且一系列网站已经开始使用自适应网页设计技术。 JSTOR 正在踏出突破性的第一步。这一额外的突破点可以为包括大、小型智能手机以及平板电脑和电子阅读器在内的大量的设备优化内容流网格。用户可以将在平板电脑的阅读优化为一个或两个栏目的模式(而不像在 Kindle 或者 Nook 上阅读的用户体验)。 自适应设计中最值得关注的例子(在 STM 和学术出版领域之外)可能就是《波士顿环球报》。试着再一次用浏览器慢慢扩大和收缩网页,然后看着它从三栏(台式机桌面的理想阅读模式)变成两栏(平板电脑的理想阅读模式),最终变成只有一栏视图(智能手机的理想阅读模式)。然而,该网站并不仅仅是把栏目数减少,而是相应地在全局导航栏、广告位置、图像尺寸以及故事情节位置等方面都有所改变和调整。该网站动态地适应用户使用的设备和使用情境。 自适应网页设计,尤其是在《波士顿环球报》这种复杂的网页上是很难实现的。网页开发者需要比以往更多的不同工作流程。 这个过程可以以传统的框架图和漂亮的设计为开端,但是由于内容流参数以及细节的无数变化,设计师和用户界面开发者应密切合作(或者说用户界面设计者需要具备一系列能够阐释、表达不断变化的设计的技能)。虽然这需要更新技能和再培训, 但最终结果值得这么做。自适应设计为本地设备( iOS , Android )和 HTML5 网页应用程序(即本地缓存的应用程序,如《金融时报》使用 HTML5 ,而不是用 iOS 和 Android 使用的 Objective-C 或者 Java 编程语言)提供了一个相对符合“成本—效益”的替换方案。此外,自适应设计和 HTML5 应用程序之间的界线可能会随着时间的推移而模糊,自适应设计会融入更多像“ APP ”的功能(例如离线使用的内容缓存)。 JSTOR 在 STM 和学术出版领域最早尝试自适应网页设计, 其他众多公司紧随其后,通过更加复杂的模板来提升用户体验,并从网页传播扩展到移动设备 传播的领域。短期内,自适应网页设计很可能给现有产品带来增值和改进。然而,从长远来看,自适应网页设计有从根本上改变产品开发规则的潜力,使出版商在网页环境下工作的同时把移动体验放在产品设计的前沿。(徐淑欣译自 http://scholarlykitchen.sspnet.org/2012/09/28/responsive-web-design-comes-to-scholarly-publishing/ )
个人分类: STM出版|3331 次阅读|0 个评论
Delphi:窗体自适应屏幕分辨率的改进
热度 10 陈小斌 2012-3-6 00:20
在窗体依据屏幕分辨率自适应调整尺度方面,昨天的工作可以说是一个突破点。昨天的工作找到了长期以来我的原有方案的问题所在,这是非常关键的。但是昨天晚上的解决方案并不完美,今天的这个才是比较完美的解决版。 先补充说明一下这个问题的重要性。这本来只是一个很小的技术问题,但在现有的Windows软件开发过程中,这个问题非常常见。一些非常著名的商业化软件,也会发现这方面的问题。Delphi的IDE本身在不同屏幕分辨率的机器上运行时,有些界面也会出现变形和控件找不到的情况;Adobe是家软件大公司,他的PDF编辑器在不同屏幕分辨率的机器上运行时,也会出现按钮不见或者被吃掉一半的情况。 因此,这实际上是软件开发过程中一个小的但又常常让人烦恼的顽疾。 昨天的解决方案中,有一点有所忽略。也就是,由于容器中的控件的位置和尺寸会随着容器尺寸的改变而改变,那么,容器尺寸的改变应该发生在其所包含的控件尺寸调整之前。但是,我并不清楚,一个容器里面到底嵌套了多少级,到底存在多少容器和控件,也不清楚容器中组件的排列方式。昨天的方案在这个地方带有点尝试性,似乎是倒着顺序去调整控件的尺寸,出来的窗体就会比较合理,而顺着序改则会调整不好。这个经验是很久以前试出来的,昨天没有改所以忘了说。 今天的方案是是首先利用递归方法做第一次遍历,一层一层地搜索,直到把所有的控件搜索完毕。搜索过程中将每个控件的原始坐标保存起来。然后按照同样的方式做第二次遍历,利用保存的原始坐标数据计算新的坐标数据。由于搜索是从顶层容器依次往下的,因此先修改的是容器的尺度,然后才修改容器内部控件的尺度,这样明确保证了控件尺度的调整在其宿主容器尺寸调整之后,也就不会再受其宿主容器尺度改变的影响。最后对窗体中所有组件做遍历,修改字体大小。 改进后的源代码如下,经过试验,效果非常完美,用法跟昨天的一样。 unit uMyClassHelpers; {实现窗体自适应调整尺寸以适应不同屏幕分辩率的显示问题。 陈小斌,2012年3月5日 } interface Uses SysUtils,Windows,Classes,Graphics, Controls,Forms,Dialogs, Math, uMySysUtils; Const //记录设计时的屏幕分辨率 OriWidth=1366; OriHeight=768; Type TfmForm=Class(TForm) //实现窗体屏幕分辨率的自动调整 Private fScrResolutionRateW: Double; fScrResolutionRateH: Double; fIsFitDeviceDone: Boolean; procedure FitDeviceResolution; Protected Property IsFitDeviceDone:Boolean Read fIsFitDeviceDone; Property ScrResolutionRateH:Double Read fScrResolutionRateH; Property ScrResolutionRateW:Double Read fScrResolutionRateW; Public Constructor Create(AOwner: TComponent); Override; End; TfdForm=Class(TfmForm) //增加对话框窗体的修改确认 Protected fIsDlgChange:Boolean; Public Constructor Create(AOwner: TComponent); Override; Property IsDlgChange:Boolean Read fIsDlgChange default false; End; implementation constructor TfmForm.Create(AOwner: TComponent); begin Inherited Create(AOwner); fScrResolutionRateH:=1; fScrResolutionRateW:=1; Try if Not fIsFitDeviceDone then Begin FitDeviceResolution; fIsFitDeviceDone:=True; End; Except fIsFitDeviceDone:=False; End; end; procedure TfmForm.FitDeviceResolution; Var LocList:TList; LocFontRate:Double; LocFontSize:Integer; LocFont:TFont; locK:Integer; {计算尺度调整的基本参数} Procedure CalBasicScalePars; Begin try Self.Scaled:=False; fScrResolutionRateH:=screen.height/OriHeight; fScrResolutionRateW:=screen.Width/OriWidth; LocFontRate:=Min(fScrResolutionRateH,fScrResolutionRateW); except Raise; end; End; {保存原有坐标位置:利用递归法遍历各级容器里的控件,直到最后一级} Procedure ControlsPostoList(vCtl:TControl;vList:TList); Var locPRect:^TRect; i:Integer; locCtl:TControl; Begin try New(locPRect); locPRect^:=vCtl.BoundsRect; vList.Add(locPRect); If vCtl Is TWinControl Then For i:=0 to TWinControl(vCtl).ControlCount-1 Do begin locCtl:=TWinControl(vCtl).Controls ; ControlsPosToList(locCtl,vList); end; except Raise; end; End; {计算新的坐标位置:利用递归法遍历各级容器里的控件,直到最后一层。 计算坐标时先计算顶级容器级的,然后逐级递进} Procedure AdjustControlsScale(vCtl:TControl;vList:TList;Var vK:Integer); Var locOriRect,LocNewRect:TRect; i:Integer; locCtl:TControl; Begin try If vCtl.AlignalClient Then Begin locOriRect:=TRect(vList.Items ^); With locNewRect Do begin Left:=Round(locOriRect.Left*fScrResolutionRateW); Right:=Round(locOriRect.Right*fScrResolutionRateW); Top:=Round(locOriRect.Top*fScrResolutionRateH); Bottom:=Round(locOriRect.Bottom*fScrResolutionRateH); vCtl.SetBounds(Left,Top,Right-Left,Bottom-Top); end; End; Inc(vK); If vCtl Is TWinControl Then For i:=0 to TwinControl(vCtl).ControlCount-1 Do begin locCtl:=TWinControl(vCtl).Controls ; AdjustControlsScale(locCtl,vList,vK); end; except Raise; end; End; {按照新的比例设计窗体中各组件的字体} Procedure AdjustComponentFont(vCmp:TComponent); Var i:Integer; locCmp:TComponent; Begin try For i:=vCmp.ComponentCount-1 Downto 0 Do Begin locCmp:=vCmp.Components ; If PropertyExists(LocCmp,'FONT') Then Begin LocFont:=TFont(GetObjectProperty(LocCmp,'FONT')); LocFontSize := Round(LocFontRate*LocFont.Size); LocFont.Size:=LocFontSize; End; End; except Raise; end; End; {释放坐标位置指针和列表对象} Procedure FreeListItem(vList:TList); Var i:Integer; Begin For i:=0 to vList.Count-1 Do Dispose(vList.Items ); vList.Free; End; begin LocList:=TList.Create; Try Try if (Screen.widthOriWidth)OR(Screen.HeightOriHeight) then begin CalBasicScalePars; AdjustComponentFont(Self); ControlsPostoList(Self,locList); locK:=0; AdjustControlsScale(Self,locList,locK); End; Except on E:Exception Do Raise Exception.Create('进行屏幕分辨率自适应调整时出现错误'+E.Message); End; Finally FreeListItem(locList); End; end; { TfdForm } constructor TfdForm.Create(AOwner: TComponent); begin inherited; fIsDlgChange:=False; end; end.
个人分类: 软件开发|17445 次阅读|21 个评论
Delphi:窗体自适应屏幕分辨率
热度 1 陈小斌 2012-3-5 02:16
这是个困惑我很长时间的问题,到今天终于得到解决了。 话说Delphi有个很强的窗体设计器,这一点让VC粉丝垂涎三尺而不可得。但是,Delphi里设计的窗体并没有自动适应屏幕分辨率的属性,也就是说,软件设计时调整完美的窗体控件布局,在不同屏幕分辨率的机器上运行时可能会变得面目全非。控件之间会相互移位,有的甚至移出窗体再也找不到了。 这个问题在网上搜索过多次,但大都依据控件方法ScaleBy或者ChangeScale。采用这两个方法进行自适应调整,我自己都试过,但效果并不理想。后来我自己也写了一个继承自窗体的基类,覆盖构造函数,调用自己的一个设备分辨率自适应方法,该方法遍历窗体上所有控件,并按照设计时的屏幕分辨率和当前屏幕分辨率的比值,逐一计算控件的位置和尺寸。这个想法是不错,效果也是有的,比单纯的采用ScaleBy或者ChangeScale方法要好,但也不是非常理想,没有达到自己设想的要求。原因在哪里,一直不知道。 我原来的代码曾经发布在Delphi盒子和CSDN上。 这个问题今天终于得以彻底解决了!! 原因是,我原以为将所有控件的Align属性设为alnone,Anchors属性设为空 ,它依然会随着窗体尺度的变化而变化。这意味着我需要一个数组事先保存所有控件的原始位置和尺寸。在窗体因为屏幕分辨率的改变而自动调整时,计算的依据依然是不变的原始窗体位置尺寸数据,这样问题就解决了。 闲话少说,上源码。 unit uMyClassHelpers; interface Uses SysUtils,Windows,Classes,Graphics, Controls,Forms,Dialogs, uMySysUtils; Const //记录设计时的屏幕分辨率 OriWidth=1366; OriHeight=768; Type TfmForm=Class(TForm) //实现窗体屏幕分辨率的自动调整 Private fScrResolutionRateW: Double; fScrResolutionRateH: Double; fIsFitDeviceDone: Boolean; fPosition:Array of TRect; procedure FitDeviceResolution; Protected Property IsFitDeviceDone:Boolean Read fIsFitDeviceDone; Property ScrResolutionRateH:Double Read fScrResolutionRateH; Property ScrResolutionRateW:Double Read fScrResolutionRateW; Public Constructor Create(AOwner: TComponent); Override; End; TfdForm=Class(TfmForm) //增加对话框窗体的修改确认 Protected fIsDlgChange:Boolean; Public Constructor Create(AOwner: TComponent); Override; Property IsDlgChange:Boolean Read fIsDlgChange default false; End; implementation Constructor TfmForm.Create(AOwner: TComponent); begin Inherited Create(AOwner); fScrResolutionRateH:=1; fScrResolutionRateW:=1; Try if Not fIsFitDeviceDone then Begin FitDeviceResolution; fIsFitDeviceDone:=True; End; Except fIsFitDeviceDone:=False; End; end; procedure TfmForm.FitDeviceResolution; Var i:Integer; LocList:TList; LocFontSize:Integer; LocFont:TFont; LocCmp:TComponent; LocFontRate:Double; LocRect:TRect; LocCtl:TControl; begin LocList:=TList.Create; Try Try if (Screen.widthOriWidth)OR(Screen.HeightOriHeight) then begin Self.Scaled:=False; fScrResolutionRateH:=screen.height/OriHeight; fScrResolutionRateW:=screen.Width/OriWidth; Try if fScrResolutionRateHfScrResolutionRateW then LocFontRate:=fScrResolutionRateH Else LocFontRate:=fScrResolutionRateW; Finally ReleaseDC(0, GetDc(0)); End; For i:=Self.ComponentCount-1 Downto 0 Do Begin LocCmp:=Self.Components ; If LocCmp Is TControl Then LocList.Add(LocCmp); If PropertyExists(LocCmp,'FONT') Then Begin LocFont:=TFont(GetObjectProperty(LocCmp,'FONT')); LocFontSize := Round(LocFontRate*LocFont.Size); LocFont.Size:=LocFontSize; End; End; SetLength(fPosition,LocList.Count+1); For i:=0 to LocList.Count-1 Do With TControl(LocList.Items )Do fPosition :=BoundsRect; fPosition :=Self.BoundsRect; With LocRect Do begin Left:=Round(fPosition .Left*fScrResolutionRateW); Right:=Round(fPosition .Right*fScrResolutionRateW); Top:=Round(fPosition .Top*fScrResolutionRateH); Bottom:=Round(fPosition .Bottom*fScrResolutionRateH); Self.SetBounds(Left,Top,Right-Left,Bottom-Top); end; i:= LocList.Count-1; While (i=0) Do Begin LocCtl:=TControl(LocList.Items ); If LocCtl.Align=alClient Then begin Dec(i); Continue; end; With LocRect Do begin Left:=Round(fPosition .Left*fScrResolutionRateW); Right:=Round(fPosition .Right*fScrResolutionRateW); Top:=Round(fPosition .Top*fScrResolutionRateH); Bottom:=Round(fPosition .Bottom*fScrResolutionRateH); LocCtl.SetBounds(Left,Top,Right-Left,Bottom-Top); end; Dec(i); End; End; Except on E:Exception Do Raise Exception.Create('进行屏幕分辨率自适应调整时出现错误'+E.Message); End; Finally LocList.Free; End; end; { TfdForm } constructor TfdForm.Create(AOwner: TComponent); begin inherited; fIsDlgChange:=False; end; end. 上面包括两个类,一个是普通窗体类,一个是其子类对话框型窗体类。在实际应用过程中只要自己创建的窗体类继承自以上两个类中的一个,例如 TForm1 = class(TfdForm),则不需添加任何源码,设计出窗体会自动调整其上控件的尺寸,以适应不同的屏幕分辨率。 以上源码经过验证,效果非常好,解决了一个多年未决的问题!
个人分类: 软件开发|13683 次阅读|2 个评论
初识复杂科学
热度 6 estudy 2011-11-13 03:33
复杂科学是一个可以用一生去探求的学问,它或许会改写整个科学、改写经济学,改变人们的思维方式。把整个世界看作一个充满了不确定性的、动态的系统,看作一个矛盾的统一体,任何特定的现象都是必然性和偶然性的结合。作为复杂系统的现象和一般的研究中所假定的现象至少有以下几个区别。一、复杂系统是非线性的。周光召院士解释得好,非线性就是作用和作用所产生的结果不成比例。二、复杂系统是动态的,没有静止的所谓“均衡”状态,或者说均衡也是动态的均衡。三、复杂系统中的主体具有自适应性,能够自我束缚和自我调节,能够在一定程度上自我适应外界的变化和冲击,同时能够自我演化。四、复杂系统通常是开放的,它不断与外界进行信息、能量、物质的交换,它改变外界环境也同时被外界环境所改变,事实上,正是这种信息、能量、物质的交换才促成它的自我演化,有时候甚至是突变。 复杂系统在一定程度上打破了均衡的概念,例如在经济系统中,我们不能再以均衡状态作为目的,一来绝对意义上的均衡是不存在的,二来某些人们通常所关心的主要因素(例如需求和供给)均衡的状态并不是健康的、优化的状态,相反,持续变化、某种静止状态持续被打破的状态可能才是最优的。 既然人们所熟悉的均衡不再是我们研究的目的,我们的模型追求的不再是均衡解和稳态,那么什么问题是我们的研究应该回答的。或者说真理应该长什么样呢?未经深入思考,直觉上我认为,在复杂系统中应该试图弄明白的是,我们所关心的各个因素在不同维度上是如何运动的,有没有规律可循(在一定时空条件下),它们的运动规律是什么?这里所说的不同的维度可以理解成从不同的角度,从不同的角度来看,事物会呈现出不同的运动状态,其运动规律也会有不同的表现形式,从不同的角度的来看待事物,能够帮助我们更全面的认识事物,更重要的是,获得更多的关于未知世界的启发。这里包含了各个因素之间相互作用的规律。一个比较大的问题是,如果考虑的因素很多,一来问题会变得太过复杂而难以用现有的方法来驾驭,二来即使我们有能力研究,所得到的结论势必会不直观,还会因为太过庞杂或者需要做出太多的假设而没有多大价值。进一步的直觉告诉我,所有的因素都可以简化或抽象成两个,一个正的因素、一个是负的因素,一个事物对立的一面,一个是事物统一的一面。任何事物都是一个矛盾的集合体,矛盾就是对立和统一的结合。 事物对立的一面导致其自我变迁,导致其排斥其他事物;事物统一的一面导致其维持原态,导致其吸引其他事物。为什么不能将事物的所有属性都界定为对立和统一(或者正和负,或者阴和阳,或者其他什么名字)的两个方面呢?中医把人体上所有的关系都转换成阴和阳,不是能很好的解决人的健康问题吗?现在连西方医学家也认为癌症的攻克只能依赖中医。在马克思的经济学中,所有的经济因素都被划分成要么是生产关系的内容,要么是生产力的内容,在某种程度上,他所揭示的关于经济危机的规律比现代西方经济学要准确得多。 周光召院士:复杂适应系统与社会
个人分类: 经济思维|7260 次阅读|10 个评论
理论思维关于信息本质的定义
热度 2 infomath 2011-8-24 11:06
我在 2005 年前 , 就针对网上关于信息本质的讨论 , 依据信息学说的历史 , 明确地提出 :" 信息是自组织系统的自适应机制 ". 近来 , 在科学网 , 又与网友进行了讨论 . 针对讨论中的分歧 , 我对自己的前述看法 , 做了如下说明 : 信 息是并且只是 ( 注意 !!) 与自组织系统 - 自适应过程同在 . 信息本质的问题只有在不可逆演化物理 - 自组织系统的自适应机制研究中才能得到解决 ! 通俗地说 , 信息的特征(就其载体而言)正在于被作用物 B 的属性变化中所反映的作用物 A 的属性内容,而不是 B 的变化本身 , 而反映实质是主体 ( 这里是 B), 适应内外环境而对自身加以控制 , 所依据的自身的属性变化。 ( 通俗的解释中 , 前一部分参考了倪鹏云先生的说法 , 特此申明 . 参见 : 就信息本质问题讨论如何深入下去再淡点看法 http://blog.sciencenet.cn/home.php?mod=spaceuid=42499do=blogid=473589 ) 信息本质的问题关系重大 , 倪鹏云先生对讨论的深入展开十分支持 , 特此表示感谢 . 也希望更多网友能关注与参与 . 谢谢 !
个人分类: 信息理论|363 次阅读|2 个评论

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-5-12 21:03

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部