明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2819|回复: 11

[函数] 按照定长将字符串分割成表

[复制链接]
发表于 2014-10-23 20:20 | 显示全部楼层 |阅读模式
如果从数据库中调用的长文本字符串,要在dcl对话框的列表框中显示,由于dcl列表框的局限(没有水平滑动条),会发现超出列表框范围的字符无法显示,为了解决这个问题,可以采用将长字符串按最大长度分割成表,这样可以解决这个问题。
以下是我编写的支持汉字的字符串定长分割成表的函数,希望朋友们指正!
  1. ;;  按照一定的长度,将字符串进行分割成表(支持汉字双字节)
  2. ;;  参数
  3. ;;      str:要处理的字符串
  4. ;;      MaxLen:分割成表的字符串最大长度
  5. ;;  返回: 分割为字符串最大长度为MaxLen的表
  6. (defun StrWrap (str MaxLen / alist pf strc strlist)
  7.   (setq  alist (vl-string->list str)
  8.   pf    0
  9.   strc  ""
  10.   )
  11.   (while alist
  12.     (if  (< pf MaxLen)
  13.       (progn (setq pf (1+ pf))
  14.        (if (< (car alist) 129)  ;car返回表中的第一个元素
  15.          (setq strc  (strcat strc (chr (car alist)))
  16.          alist (cdr alist)  ;返回去掉了第一个元素的表
  17.          )
  18.          (setq strc  (strcat strc (chr (car alist)) (chr (cadr alist)))
  19.           ;cadr返回表的第二个元素
  20.          alist (cddr alist)  ;cddr返回去掉了前两个元素的表
  21.          )
  22.        )
  23.       )
  24.       (progn
  25.   (setq strlist (cons strc strlist)
  26.         pf      0
  27.         strc    ""
  28.   )
  29.       )
  30.     )
  31.     (if  (not alist)
  32.       (setq strlist (cons strc strlist))
  33.     )          ;将最后不够最大长度的字符串加进表中
  34.   )
  35.   (reverse strlist)
  36. )
实例:(StrWrap "出席这次全会的有,中央委员199人,候补中央委员164人。中央纪律检查委员会常务委员会委员和有关方面负责同志列席了会议。党的十八大代表中部分基层同志和专家学者也列席了会议。" 10)结果:_$
STRWRAP
("出席这次全会的有,中" "央委员199人,候补" "中央委员164人。中" "央纪律检查委员会常务" "委员会委员和有关方面" "负责同志列席了会议。" "党的十八大代表中部分" "基层同志和专家学者也" "列席了会议。")
_$



"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2014-10-23 20:26 | 显示全部楼层
我在我的尺寸公差查询中就采用这个函数来显示注解。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

点评

这么经典的大作不要独享啊  发表于 2014-10-23 23:16
发表于 2014-10-23 20:29 来自手机 | 显示全部楼层
xianaihua 发表于 2014-10-23 20:26
我在我的尺寸公差查询中就采用这个函数来显示注解。

说好的公差源码呢?
发表于 2014-10-23 23:13 | 显示全部楼层
热烈欢迎xianaihua大师重出江湖! 希望看到您更多的杰作!

点评

一直忙于新产品开发,等有时间将一些压箱底的东西奉献给各位同好!  发表于 2014-10-24 22:32
发表于 2014-10-24 14:04 | 显示全部楼层
本帖最后由 自贡黄明儒 于 2014-10-24 14:28 编辑

昨天很奇怪,楼主出来了,高飞也出来了,飞诗也出来了。楼主只是画了一个烧饼。
都是难得出来一下的高手 呀

  1. ;;文字按给定长度分段
  2. ;;(MtextDivde (getpoint)  (getpoint) '("A" "B" "C" "D" "E" "F" "G") 3)=>
  3. ;;(("A" "B" "C") ("D" "E" "F") ("G"))
  4. (defun MtextDivde (p p1 L Textheigh / L1 LST SCOR STR1 STR2 W W0 X)
  5.   (setq Lst L)
  6.   (setq w (abs (- (car p) (car p1))))          ;方框宽度
  7.   (setq w (abs (- w Textheigh Textheigh)))        ;左右间隙半个字高
  8.   (while (setq L1 (car Lst))
  9.     (setq Lst (cdr Lst))
  10.     ;;(cond ((and scor (not str1)) (setq str1 (cons "    " str1))));加4个空格
  11.     (setq str1 (cons L1 str1))
  12.     (setq str2 (apply 'strcat str1))
  13.     (setq W0 (abs (car (apply 'mapcar (cons '- (HH:String:Len "" str2 Textheigh 1))))))
  14.     (cond ((> w0 w)
  15.      (setq scor (cons str1 scor))
  16.      (setq str1 nil)
  17.     )
  18.     )
  19.   )
  20.   (cond (str1 (setq scor (cons str1 scor))))
  21.   (reverse (mapcar '(lambda (x) (reverse x)) scor))
  22. )

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

点评

看起来不错!  发表于 2014-10-24 22:33
发表于 2014-10-24 14:31 | 显示全部楼层
本帖最后由 xyp1964 于 2014-10-24 14:46 编辑

建议使用paragraph的对话框属性

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

点评

你的函数,估计原理都差不多。  发表于 2014-10-24 15:02
 楼主| 发表于 2014-10-24 22:27 | 显示全部楼层
xyp1964 发表于 2014-10-24 14:31
建议使用paragraph的对话框属性

院长的看起来很整齐!
发表于 2014-10-25 08:38 来自手机 | 显示全部楼层
xianaihua 发表于 2014-10-24 22:27
院长的看起来很整齐!

大师,放出编译版给我们用用也行啊
发表于 2014-10-25 21:59 | 显示全部楼层
大师,先感谢您了!同行的骄傲! 也代表同行感谢您了!
发表于 2014-10-25 22:45 | 显示全部楼层
xianaihua 发表于 2014-10-23 20:26
我在我的尺寸公差查询中就采用这个函数来显示注解。

很给力,呵呵!谢谢同行前辈
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-4-26 04:48 , Processed in 0.266439 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表