Delphi как передать переносы из Memo в Label?
Главная форма отображает текст из ini-файла. В него записаны настройки и текст из memo второй формы. Текст в оригинале был с кодом на переносы: Контора Рога и Копыта'+#13+'работает с 12:00 до 15:00 часов'+#13+'Личные приёмы с 13:00 до 14:00'
Вопрос, как это передать в Label?
В ini файле сохраняется построчно. В переменную тоже всё построчно принимается. Но на Label выводится лишь первая строка.
Дополнение. В статике всё отлично работает, когда в коде прописан текст label с '+#13'
.
Но дело в том, что решил прикрутить Memo для редактирования текста.
Текст сохраняется в ini.
Т.е. при старте, FormCreate, В label идёт переменная прочитанная из ini. В самом ini есть переносы. Но не в Memo, ни в Label они уже не могут считаться из ini.
Как быть?
запись в ini F.WriteString('main_text', 'text', text1);
переменная tex1 - string
Вид при вводе:
Вид из ini-файла:
результаты:
Ответы (3 шт):
Label умеет отображать многострочный текст:
label1.Caption := 'Контора Рога и Копыта'+#13+'работает с 12:00 до 15:00 часов'+#13+'Личные приёмы с 13:00 до 14:00';
но дело не в Label, а в работе с ini-файлами.
ini-файлы не предназначены для хранения многострочных параметров. При чтении ReadString
использует функцию Windows GetPrivateProfileString
, `которая находит строку вида
key=value
извлекает из неё value
, и ничего не делает с далее идущими строками.
Вы можете при записи многострочного параметра заменять перенос строки на спецсимвол или последовательность, а при чтении выполнять обратную замену (StringReplace)
Возможно, стоит посмотреть в сторону других средств хранения и передачи - например, в JSON5 есть {multiline:
(в стандартном JSON тоже приходится line1\\nline2
делать)
Если стандартными методами Delphi то лучше всего вот так.
implementation
{$R *.dfm}
uses System.IniFiles;
procedure TForm1.LoadBtnClick(Sender: TObject);
begin
if not OpenDialog1.Execute(Handle) then Exit;
memo1.Lines.Clear;
var inif := TIniFile.Create(OpenDialog1.FileName);
try
var Count := inif.ReadInteger('Memo1_Lines', 'Count', 0);
for var I := 0 to Count do begin
memo1.Lines.Add(inif.ReadString('Memo1_Lines', IntToHex(I, 4), ''));
end;
finally
FreeAndNil(inif);
end;
end;
procedure TForm1.SaveBtnClick(Sender: TObject);
begin
if not SaveDialog1.Execute(Handle) then Exit;
var inif := TIniFile.Create(SaveDialog1.FileName);
try
var lines := Pred(Memo1.Lines.Count);
inif.WriteInteger('Memo1_Lines', 'Count', lines);
for var I := 0 to lines do begin
inif.WriteString('Memo1_Lines', IntToHex(I, 4), Memo1.Lines[I]);
end;
finally
FreeAndNil(inif);
end;
end;
end.
На выходе получится вот такой вот файлчик
[Memo1_Lines]
Count=4
0000=Memo1
0001=Is the
0002=perfect
0003=Container for Lines
0004==)
Если нестандартными то просто читаешь файл пока не встретишь нужную секцию, после читаешь до следующей секции.
Решение подсказано #MBo (и прочитано на старом delphibasics-ru).
//читаем из ini
text1:=F.ReadString('main_text', 'text', 'сюда получаем текст из ini, содержащий это \\, это и будет наш символ переноса строки');
//далее делаем реплейсмент:
text2:= StringReplace(text1, '\\', #13, [rfReplaceAll, rfIgnoreCase]);
Label1.Caption := text2;