![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
RichEdit: Загрузка из rtf-файла только текста
shadow © (2015-06-24 14:20:00)Добрый день.
Никак не могу разобраться(
Хочу из rtf-файла взять толь ко данные, без тегов.
Текст берётся вместе с тегами. Причём отображается не в красивом, отформатированном виде, а в виде :
{\rtf1\adeflang1025\ansi\ansicpg1251\uc1\adeff1\deff0\stshfdbch0\stshfloch0\s tshfhich0\stshfbi0\deflang1049\deflangfe1049\themelang1049\themelangfe0\themelan gcs0{\fonttbl{\f0\fbidi \froman\fcharset204\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f1\fbidi \fswiss\fcharset204\fprq2{\*\panose 020b0604020202020204}Arial;}
{\f2\fbidi \fmodern\fcharset204\fprq1{\*\panose 02070309020205020404}Courier New;}{\f3\fbidi \froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}{\f4\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0504020202020204}Helvetica;}
{\f5\fbidi \fmodern\fcharset0\fprq1{\*\panose 02070409020205020404}Courier;}{\f6\fbidi \froman\fcharset0\fprq2{\*\panose 02020603040505020304}Tms Rmn;}{\f7\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604020202030204}Helv;}
Делаю вот так:
procedure TfMain.DefoultFormat(Sender: TObject);
begin
if OpenDialog1.Execute then //Вызываем диалог открытия
begin
RichEdit1.WordWrap:=False;
RichEdit1.PlainText:=true; // текст без тегов
RichEdit1.Enabled:=False;
RichEdit1.Lines.BeginUpdate;
RichEdit1.Lines.LoadFromFile(OpenDialog1.FileName); // загрузка
RichEdit1.Lines.EndUpdate;
RichEdit1.Enabled:=True;
RichEdit1.Text; // всё-равно текст с тегами
end;
end;
Германн (2015-06-26 01:41:00) [1]
> MBo © (25.06.15 07:56) [19]
>
> По исходникам посмотри.
> Я увидел, что при назначении свойства PlainText никакой
> работы не происходит, и оно используется только при загрузке-
> выгрузке в поток.
Ну в общем, как бы, это давно известно. Свойство PlainText имеет смысл только при вызове методов TRichEdit.Lines SaveTo и LoadFrom. Причём SaveTo вроде бы никогда не вызывал нарекания (могу и ошибаться, давно не интересовался), а вот метод LoadFrom вызывал.
shadow (2015-06-25 11:37:00) [2]Уже нет времени разбираться. И так кучу времени потратил на такую ерунду.
Главное работает.
Спасибо все огромное.
sniknik (2015-06-25 09:38:00) [3]> Вы знаете, заработал след код:
все станьше и страньше ... не обратил поначалу внимания. ЭТОТ код работать не должен, по определению, т.к. нет никаких действий после присваивания
> RichEdit1.PlainText:=True;
sniknik (2015-06-25 08:05:00) [4]+
для гарантии, проверь свой код в новом свежесозданном проекте, без лишних модулей, не меняя никаких свойств у компонент, просто брось на форму и все.
MBo (2015-06-25 07:59:00) [5]З.Ы. Что-то может ещё быть связано с тем, что используется древнейшая версия ричедитной длл-ки (в RX, возможно, чуть поновее, но тоже прошлого века).
sniknik (2015-06-25 07:58:00) [6]вообще что то подобное завязанное на длину было -
http://delphimaster.net/view/2-1133101760
давно и неправда, не вспомню уже подробностей, но глюк был. сейчас не воспроизводится... у тебя какая дельфя? D5? если D7 то все ли "сервиспаки стоят", их 2 было 1 и 1.1 апдейты, у меня стоят оба, а тогда возможно нет. может в этом причина?
MBo (2015-06-25 07:56:00) [7]По исходникам посмотри.
Я увидел, что при назначении свойства PlainText никакой работы не происходит, и оно используется только при загрузке-выгрузке в поток.
Преобразование происходит под капотом виндов при обработке сообщения EM_STREAMIN/OUT.
Если глюки, связанные с размером, действительно существуют, покопайся в этом направлении.
shadow (2015-06-25 07:43:00) [8]Всё-таки отчего такое поведение у компонента? Кто-нибудь сталкивался?
Всем отозвавшимся, кстати, большое спасибо за помощь
shadow (2015-06-25 07:41:00) [9]Германн, вот это юмор! Пошутил так пошутил. Без опыта нахождения в дет. сад для детей наркоманов такой юморок не освоить
Германн (2015-06-25 01:38:00) [10]
> Вы знаете, заработал след код:
Завтра он перестанет работать, не волнуйся.
shadow (2015-06-24 23:33:00) [11]Вы знаете, заработал след код:
procedure TfMain.DefoultFormat(Sender: TObject);
var
Stream: TMemoryStream;
begin
if OpenDialog1.Execute then
begin
RichEdit1.MaxLength := $7FFFFFF0;
RichEdit1.PlainText:=false;
RichEdit1.Lines.LoadFromFile(OpenDialog1.FileName);
RichEdit1.PlainText:=True;
end;
end;
Причём начал работать и предыдущий. И случилось это, если я не ошибся, после того как я включил ScrollBar.
Сначала включил оба скрулбара - текст был мелким шрифтом и смазан
Включил вертикальный скрулбар - небольшой rtf-документ начал отображаться как следует. Большой (4,5 мб) отображался с тегами, но повторный запуск процедуры отрабатывал быстро и выдавал уже без тегов
Потом отключил скрулбары - маленький документ отображается с первого раза корректно. Большой - со второго
Добавил строку RichEdit1.MaxLength := $7FFFFFF0; - большой документ отображается корректно с первого раза.
ЧТО за мистика???
shadow (2015-06-24 20:46:00) [12]Пробовал другой rtf-файл. Такая же байда.
Delphi5, компонент стандартный TRichEdit
shadow (2015-06-24 20:03:00) [13]Может у меня файл какой-нито "неправильный"? нарушена разметка или что-нито в этом духе. Хотя блокнот открывает, да и word тоже без проблем.
Сейчас попробую другой файл.
И попробую RxRichEdit
shadow (2015-06-24 20:01:00) [14]Содержание RichEdit:
{\rtf1\adeflang1025\ansi\ansicpg1251\uc1\adeff1\deff0\stshfdbch0\stshfloch0\stsh fhich0\stshfbi0\deflang1049\deflangfe1049\themelang1049\themelangfe0\themelangcs 0{\fonttbl{\f0\fbidi \froman\fcharset204\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f1\fbidi \fswiss\fcharset204\fprq2{\*\panose 020b0604020202020204}Arial;}
{\f2\fbidi \fmodern\fcharset204\fprq1{\*\panose 02070309020205020404}Courier New;}{\f3\fbidi \froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}{\f4\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0504020202020204}Helvetica;}
Содержание Memo:
{\rtf1\adeflang1025\ansi\ansicpg1251\uc1\adeff1\deff0\stshfdbch0\stshfloch0\stsh fhich0\stshfbi0
\deflang1049\deflangfe1049\themelang1049\themelangfe0\themelangcs0{\fonttbl{\f0\ fbidi
\froman\fcharset204\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f1\fbidi
\fswiss\fcharset204\fprq2{\*\panose 020b0604020202020204}Arial;}
{\f2\fbidi \fmodern\fcharset204\fprq1{\*\panose 02070309020205020404}Courier New;}{\f3\fbidi
\froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}{\f4\fbidi \fswiss\fcharset0
\fprq2{\*\panose 020b0504020202020204}Helvetica;}
{\f5\fbidi \fmodern\fcharset0\fprq1{\*\panose 02070409020205020404}Courier;}{\f6\fbidi \froman
\fcharset0\fprq2{\*\panose 02020603040505020304}Tms Rmn;}{\f7\fbidi \fswiss\fcharset0\fprq2
{\*\panose 020b0604020202030204}Helv;}
shadow (2015-06-24 20:00:00) [15]Код такой же как у MBo:
var
s: TMemoryStream;
if OpenDialog1.Execute then
begin
s := TMemoryStream.Create;
RichEdit1.PlainText := False;
RichEdit1.Lines.LoadFromFile(OpenDialog1.FileName);
RichEdit1.PlainText := True;
RichEdit1.Lines.SaveToStream(s);
s.Position := 0;
RichEdit1.Lines.LoadFromStream(s);
RichEdit1.Text; // в дебаге смотрю...с тегами
Memo2.Lines := RichEdit1.Lines; // на всякий вывожу в мемо...тоже с тегами
end;
sniknik (2015-06-24 18:07:00) [16]> Так пробовал:
> RichEdit1.PlainText:=False;
> загрузить
> RichEdit1.PlainText:=true;
> Результат такой же.
результат где? само собой оно нигде не поменяется после присвоения true, нужно что-то сделать - сохранить/передать куда нибудь текст/т.д.
sniknik (2015-06-24 18:01:00) [17]> Где косяк....не пойму
знаю где знаю, в коде! вот!
в твоем коде если точнее, т.к. вон в коде у MBo его нет.
MBo (2015-06-24 17:52:00) [18]У меня работает - загружается rtf с разными стилями и размерами шрифтов (что видно, если убрать последнюю строку), преобразуется в однородный текст (при наличии последней строки), разбивка на строки сохраняется
shadow (2015-06-24 15:31:00) [19]Как надо не работает.
Можно подумать, что PlainText - не работает, но:
Richedit1.PlainText := False; - очень быстрая загрузка
Richedit1.PlainText := true; - медленная
Судя по форумам должно работать. Где косяк....не пойму
MBo (2015-06-24 15:02:00) [20]Ну это псевдокод и был ;)
s: TMemoryStream;
begin
s := TMemoryStream.Create;
Richedit1.PlainText := False;
RichEdit1.Lines.LoadFromFile('e:\q.rtf');
Richedit1.PlainText := True;
RichEdit1.Lines.SaveToStream(s);
s.Position := 0;
RichEdit1.Lines.LoadFromStream(s);