自定义COMbobox加入三列字符串对齐问题(100)

  • 主题发起人 主题发起人 sivee
  • 开始时间 开始时间
S

sivee

Unregistered / Unconfirmed
GUEST, unregistred user!
自定义COMbobox加入三列字符串,三列分别从数据库中读取, A1+A2+A3 比如 A001 中化123ABC A500 A002 中国(中化) A400 但加入列表中后,会出现列不对齐的情况,比如 A001 中化123ABC A500 A002 中国(中化) A400 行2中的第三列可能会出现不对齐列的情况, 使用过网上的N种方法都不行,copy,format,widestring等都不行,请高手解答,最好是任意字符截取后,加入COMBOBOX下拉列表后,长度都一致,不会出现走样。
 
加入前formatformat('%50S%50S%50S',[A1,A2,A3]) format('%-50S%-50S%-50S',[A1,A2,A3])
 
var s1,s2:string; i:integer; begin cmb1.clear; with adoquery do adoquery.Close; adoquery.SQL.Clear; adoquery.SQL.Add('Select * from hstable'); adoquery.Open; for i:=0 to 4 do begin s1:=adoquery.fieldbyname('ht002').AsString;// s2:=adoquery.fieldbyname('ht003').AsString;// delete(s2,5,100); cmb1.Items.Add(s1+' '+s2+' '+adoquery.fieldbyname('ht004').AsString); s1:=''; s2:=''; adoquery.Next; end; end;
 
Format没用啦,都说过了PART_CODE PART_NAME PART_MODEL0101 蛋壳 500g0102 旺旺仙贝 500g0103 元朗蛋卷王1 454g0104 元朗蛋卷王2 908g0105 金得利瑞士糖 800g0106 瑞士糖(扁盒) 450g0107 德芙果仁巧克力 47g0108 德芙牛奶巧克力 47g0109 品客薯片(原味) 195g0110 品客薯片(葱味) 190g0201 娃哈哈AD钙奶1 4*200ml0202 娃哈哈AD钙奶2 6*100ml0203 杨协成豆奶 4*200ml0204 杨协成黑豆奶 4*250ml0205 光明纯牛奶 6*250ml0206 光明酸酸乳 4*250ml0207 罐装健力宝 4*355ml0208 第五季汽水 3*555ml0209 雀巢冰红茶 600ml0210 雀巢冰爽茶 600ml0301 太仓丝苗米 10kg0302 太仓香软米 10kg0303 粮源东北米 5kg0304 粮源泰国米 5kg0305 花旗调和油1 1.8L0306 花旗调和油2 900ml0307 英唛花生油1 1.8L0308 英唛花生油2 900ml0309 厨宝粟米油1 1.8L0310 厨宝粟米油2 900ml0401 安纺毛巾 60*30cm0402 安纺浴巾 150*75cm0403 维达卷纸 10卷装0404 维达面巾纸 10包装0405 三笑牙刷 2支装0406 中华牙膏 250g0407 白猫洗衣粉 500g0408 好迪洗发水 240ml0409 浪奇洗洁精 555ml 0410 雪肤沫浴露 960ml0501 三角牌电饭煲 750W0502 幸福牌压力煲 12KG0503 樱花牌抽油烟机 单抽风0504 柏特煤气灶 双灶头0505 劲力电热器 1000W0506 卓力电烫斗 13880507 婴科热水器 5升0508 康明电吹风 850W0509 冠乐电热水瓶 1000W0510 渴望电话机 8型0601 双喜乒乓球拍 单胶面0602 双喜乒乓球拍 双胶面0603 天翔羽毛球拍 普通装0604 天翔羽毛球拍 精装0605 中国象棋 木制0606 中国围棋 胶制0607 陆战棋 木制0608 五子棋 胶制0609 乒乓球 三个装0610 羽毛球 三支装0703 签字笔 十支装0704 软皮抄 五本装0705 涂改液 三个装0706 2B铅笔 十支装0707 铅笔刨 手摇型0708 橡皮擦 五个装0709 文具盒 学生用0710 水彩笔 十六色0801 运费 你把上面数据加进去试
 
我的方法只考虑到全部是长字段~~没有考虑到短字段~~需要在delete(s2,5,100); 前面加一个字符串长度判断~~
 
哎,自己加一个函数就行了麻:例如Function ProcStr(a:string;len:word):string; begin if length(a)>len then result:=copy(a,1,len) else while length(a)<len do a:=a+' '; end;ProcStr(A1,你需要的长度)+ProcStr(A2,你需要的长度)+ProcStr(A3,你需要的长度);
 
呵呵,呵呵。依葫芦画瓢就行了。
 
楼上的还是不行,我试过了,加入列表后还是不对齐的
 
似乎有1个字节的差异,不过整个效果大致可以了,如果楼主要求完全对齐,自己Draw吧。
 
有中英文,数字混排的很难达到你要的效果。用listview吧,简单,快捷。
 
测试了一下,用draw 可以实现这个效果。
 
delhpi能给点代码提示吗?
 
将ComboBox的Style设置为csOwnerDrawFixed然后将数据加入到ComboBox的Items里面,中间用空格隔开procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);var s,s2:string; i:Integer;begin ComboBox1.Canvas.FillRect(rect); s:=ComboBox1.Items[Index]; i:=Pos(' ',s); s2:=Trim(Copy(s,1,i-1)); Delete(s,1,i); s:=trim(s); ComboBox1.Canvas.TextOut(Rect.Left,Rect.Top+1,s2); i:=Pos(' ',s); s2:=Trim(Copy(s,1,i-1)); Delete(s,1,i); s:=trim(s); ComboBox1.Canvas.TextOut(Rect.Left+60,Rect.Top+1,s2); //60依具体长度而设定 s2:=s; ComboBox1.Canvas.TextOut(Rect.Left+200,Rect.Top+1,s2); //200依具体长度而设定end;
 
Combobox1.style:=csOwnerDrawFixed;自己填充一些数据procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);begin ComboBox1.Canvas.FillRect(Rect);//具体怎么取每列的数据,根据你的情况,自己写代码。下面只是演示 ComboBox1.Canvas.TextOut(Rect.Left + 1, Rect.Top + 1, Copy(ComboBox1.Items.Strings[Index], 1, 2));//第一列 ComboBox1.Canvas.TextOut(Rect.Left + 1+50, Rect.Top + 1, Copy(ComboBox1.Items.Strings[Index], 3, 20));//第二列 ComboBox1.Canvas.TextOut(Rect.Left + 1+50+200, Rect.Top + 1, Copy(ComboBox1.Items.Strings[Index], 24, 20));//第三列end;
 
设为csOwnerDrawFixed就不能输入了
 
那就用format,总体效果可以了。如果要求高,那就自动多动脑筋哦
 
format('%-50S%-50S%-50S',[trim(A1),trim(A2),trim(A3)])我觉得不可能的吧!
 
以下测试通过~~var s1,s2:string; i,l:integer; begin l:=10;//combobox中第二列的长度; cmb1.clear; with adoquery do adoquery.Close; adoquery.SQL.Clear; adoquery.SQL.Add('Select * from hstable'); adoquery.Open; for i:=0 to 4 do begin s1:=adoquery.fieldbyname('ht002').AsString;// 第一列 s2:=adoquery.fieldbyname('ht003').AsString;// 第二列 if length(s2)<l then//如果小于预定的字段长度 begin repeat s2:=s2+' '; until length(s2)=l; end else begin delete(s2,11,100); end; cmb1.Items.Add(s1+' '+s2+' '+adoquery.fieldbyname('ht004').AsString); s1:=''; s2:=''; adoquery.Next; end; end;
 
呵呵 估计不行的,根本的原因是中英文混排,让控件自动画的话,总有点不对齐的。除非自己画。
 
呵呵~~是有细微的一点~~
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部