在Delphi中如何在string中包含换行符?
我想要创build一个string跨越多行来分配给标签标题属性。 delphi如何做到这一点?
在System.pas(自动使用)中定义了以下内容:
const sLineBreak = {$IFDEF LINUX} AnsiChar(#10) {$ENDIF} {$IFDEF MSWINDOWS} AnsiString(#13#10) {$ENDIF};
这是Delphi 2009(注意使用AnsiChar和AnsiString)。 (由我添加的换行)
所以,如果你想让你的TLabel包装,确保AutoSize设置为true,然后使用下面的代码:
label1.Caption := 'Line one'+sLineBreak+'Line two';
在自从sLineBreak被引入之后,所有版本的Delphi都可以使用,我相信这是Delphi 6。
这是一个更短的方法:
my_string := 'Hello,'#13#10' world!';
my_string := 'Hello,' + #13#10 + 'world!';
#13#10
是十进制的CR / LF字符
也可以使用^ M + ^ J快捷键。 所有的偏好问题。 “CTRL-CHAR”代码由编译器翻译。
MyString := 'Hello,' + ^M + ^J + 'world!';
你可以在^ M和^ J之间加上+,但是你会得到编译器的警告(但它仍然可以正常编译)。
在一边,一个可能有用的技巧:
如果您在TStrings中保存多个string,则只需使用以下示例中的TStrings的Text属性即可。
Label1.Caption := Memo1.Lines.Text;
你会得到你的多线标签…
var stlst: TStringList; begin Label1.Caption := 'Hello,'+sLineBreak+'world!'; Label2.Caption := 'Hello,'#13#10'world!'; Label3.Caption := 'Hello,' + chr(13) + chr(10) + 'world!'; stlst := TStringList.Create; stlst.Add('Hello,'); stlst.Add('world!'); Label4.Caption := stlst.Text; Label5.WordWrap := True; //Multi-line Caption Label5.Caption := 'Hello,'^M^J'world!'; Label6.Caption := AdjustLineBreaks('Hello,'#10'world!'); {http://delphi.about.com/library/rtl/blrtlAdjustLineBreaks.htm} end;
plattform不可知的方式将是'sLineBreak': http ://www.freepascal.org/docs-html/rtl/system/slinebreak.html
写('你好'+ sLineBreak +'世界!');
ShowMessage('Hello'+Chr(10)+'World');
我没有delphi的手副本,但我相当肯定,如果您将wordwrap属性设置为true,并将autosize属性设置为false,它应该包装任何文本,你把它放在你做标签的大小。 如果你想在某个地方换行,那么如果你设置了上面的设置并从文本编辑器粘贴,它可能会工作 。
希望这可以帮助。
弗朗索瓦:
你的方法Label1.Caption := Memo1.Lines.Text;
不是什么好事!
示例多行文本:
'' // Empty one, no line at all #13#10 // One empty line 'One' // One non empty line 'One'#13#10 // Two lines, first not empty, last empty #13#10'One' // Two lines, first empty, last not empty etc
将每个string分配给Lines.Text会导致不期望的事情…
换一种说法:
MyLabel.Caption:='One Line'; // One single line with no line break on it, with just 8 chars Memo1.Lines.Text:=MyLabel.Caption; ShowMessage(IntToStr(Length(MyLabel.Caption)+' - '+IntToStr(Length(Memo1.Lines.Text)));
将显示(在Windows上):8 – 10
注意:至less发生在我的Turbo Delphi 2006上。
这是因为.Text实现在每行之后添加一个新的换行符(窗口上的两个字符),所以总是以一个新行结束。
这也是这样的:
MyLabel.Caption:=''; // Empty string, length=0 Memo1.Lines.Text:=MyLabel.Caption; ShowMessage(IntToStr(Length(MyLabel.Caption)+' - '+IntToStr(Length(Memo1.Lines.Text)));
将显示(在Windows上):0 – 2
所以它需要一个“小”的修复…删除最后一个中断线添加,但这可能是非常棘手的…
我解释一下:
如果你这样做:
MyLabel.Caption:='Non Empty Line'+#13#10; // #13#10 is Windows break line (16 chars in total) Memo1.Lines.Text:=MyLabel.Caption; ShowMessage(IntToStr(Length(MyLabel.Caption)+' - '+IntToStr(Length(Memo1.Lines.Text)));
将显示(在Windows上):16 – 16
它没有添加任何换行符,因为最后一个string是空的时候被分配到.Text
这个问题真的在里面。文本,没有简单的工作,因为你必须知道最后一行是空的。
希望有一天,这将是固定的! 到那时…我会用其他方式来处理多行string。
有时我不想混乱我的代码空间,尤其是静态标签。 只需要使用表单定义它,在表单上input标签文本,然后在相同表单上的任意位置右键单击。 select“查看文本”。 您现在将看到所有devise的对象,但仅作为文本。 向下滚动或search您的文字。 当你find它时,编辑标题,看起来像这样:
字幕='1号线'#13'线2'#13'线3'
#13意味着一个序号13,或ascii回车。 Chr(13)是相同的想法,CHR()将数字更改为序数types。
请注意,在Delphi的这个特定方面没有分号,使用“=”而不是“:=”。 每行的文字用单引号括起来。
完成后,再次右键单击并select“以表格forms查看”。 您现在可以进行任何格式设置,如粗体,右alignment等。您不能重新编辑表单上的文本,否则会丢失换行符。
我也使用“查看文本”进行多个更改,我只想滚动并replace等。快速。
戴夫
private { Private declarations } {declare a variable like this} NewLine : string; // ok // in next event handler assign a value to that variable (NewLine) // like the code down procedure TMainForm.FormCreate(Sender: TObject); begin`enter code here` NewLine := #10; {Next Code To show NewLine In action} //ShowMessage('Hello to programming with Delphi' + NewLine + 'Print New Lin now !!!!'); end;