Форум программистов, компьютерный форум, киберфорум
Наши страницы

Delphi для начинающих

Войти
Регистрация
Восстановить пароль
 
 
SHD1
0 / 0 / 0
Регистрация: 14.02.2016
Сообщений: 20
#1

RichEdit - запись строки и сохранение - Delphi

22.02.2016, 23:09. Просмотров 869. Ответов 17

Помогите пожалуйста, снова с RichEdit.
Есть форма свидетельства:
RichEdit - запись строки и сохранение
Эта форма в формате RTF загружается в RichEdit (на форме 2).
Программа берёт данные из файла Excel, затем при выборе прибора данные из ячеек соответствующей таблицы записываются в RichEdit, но при этом форма видоизменяется - подчеркивания (которые были в форме) слезают на новые строки, а если строка не полностью заполняется, то подчеркивается только то, что копируется из таблицы (нижнее подчеркивание текста в коде реализовано). И при сохранении файла в том же формате изначальное форматирование текста слетает.
Скажите, можно ли сделать так, чтобы форма заполнялась правильно? Так, как в шаблоне, без смещений и потери формата. И чтобы потом это можно было распечатать на А5 формате и сохранить в файл новый.
Ниже архив с программой и код для кнопки заполнения RichEdit (немного урезанный, только для первой таблицы, потому что больше не влезло):
METR-SV.7z
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
procedure TForm1.Button2Click(Sender: TObject);
Var
 i,j:integer;
 s,f,g,k,h,t:string;
begin
form2.RichEdit1.Lines.LoadFromFile('C:\METR-SV\sv.rtf');
begin
with ListBox1 do
 begin
   if ItemIndex >= 0 then
     begin
     form2.Show;
     edit1.Text:=listbox1.Items[listbox1.itemindex];
     end
   else
    ShowMessage('Выберите СИ');
 end;
begin
if combobox1.Text='КФК' then
begin
  With StringGrid1 do
  begin
    for i:=0 to ColCount-1 do
      begin
        for j:=0 to RowCount-1 do
          begin
            if Cells[i,j]= Edit1.text then
            begin
            s:=StringGrid1.Cells[0,j];
            g:=StringGrid1.Cells[1,j];
            k:=StringGrid1.Cells[3,j];
            h:=StringGrid1.Cells[4,j];
            t:=StringGrid1.Cells[5,j];
             form2.richedit1.Lines.Strings[6]:=('СВИДЕТЕЛЬСТВО № ' + edit2.Text);
                  form2.RichEdit1.SelStart:=pos(edit2.Text,form2.RichEdit1.Text)-1;
                 form2.RichEdit1.SelLength:=length(edit2.Text);
                 form2.RichEdit1.SelAttributes.Style:=form2.RichEdit1.SelAttributes.Style+[fsUnderline];
             form2.richedit1.Lines.Strings[13]:=('Средство измерения ' + s + ' ' + g + ', ' + 'рег. № ' + k);
                  form2.RichEdit1.SelStart:=pos(s,form2.RichEdit1.Text)-1;
                 form2.RichEdit1.SelLength:=length(s);
                 form2.RichEdit1.SelAttributes.Style:=form2.RichEdit1.SelAttributes.Style+[fsUnderline];
                  form2.RichEdit1.SelStart:=pos('рег. № ',form2.RichEdit1.Text)-1;
                 form2.RichEdit1.SelLength:=length('рег. № ');
                 form2.RichEdit1.SelAttributes.Style:=form2.RichEdit1.SelAttributes.Style+[fsUnderline];
                  form2.RichEdit1.SelStart:=pos(', ',form2.RichEdit1.Text)-1;
                 form2.RichEdit1.SelLength:=length(', ');
                 form2.RichEdit1.SelAttributes.Style:=form2.RichEdit1.SelAttributes.Style+[fsUnderline];
                  form2.RichEdit1.SelStart:=pos(g,form2.RichEdit1.Text)-1;
                 form2.RichEdit1.SelLength:=length(g);
                 form2.RichEdit1.SelAttributes.Style:=form2.RichEdit1.SelAttributes.Style+[fsUnderline];
                  form2.RichEdit1.SelStart:=pos(k,form2.RichEdit1.Text)-1;
                 form2.RichEdit1.SelLength:=length(k);
                 form2.RichEdit1.SelAttributes.Style:=form2.RichEdit1.SelAttributes.Style+[fsUnderline];
             form2.richedit1.Lines.Strings[22]:=('Поверено в соответствии с ' + h);
                  form2.RichEdit1.SelStart:=pos(h,form2.RichEdit1.Text)-1;
                 form2.RichEdit1.SelLength:=length(h);
                 form2.RichEdit1.SelAttributes.Style:=form2.RichEdit1.SelAttributes.Style+[fsUnderline];
             form2.richedit1.Lines.Strings[25]:=('С применением эталонов ' + t);
                  form2.RichEdit1.SelStart:=pos(t,form2.RichEdit1.Text)-1;
                 form2.RichEdit1.SelLength:=length(t);
                 form2.RichEdit1.SelAttributes.Style:=form2.RichEdit1.SelAttributes.Style+[fsUnderline];
            Exit;
            end;
          end;
      end;
  end;
end;
 
 
end;
end;
end;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.02.2016, 23:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос RichEdit - запись строки и сохранение (Delphi):

Сохранение из RichEdit - Delphi
Здравствуйте,мне нужно сохранить всю информацию,которая находить в РичЕдите,но при этом должна создаваться папка с именем Save и в эту...

сохранение RichEdit в Record - Delphi
Возникла необходимость сохранить два RichEdit в Record с последующим сохранением в файл. Написал вот такой вариант: procedure...

Сохранение текста написанного в RichEdit - Delphi
Хочу сохранить написанное. Нажимаю сохранить выходит ошибка: Cannot create file "". А если заменить FFileName=SUntitled на...

Сохранение текста с RichEdit в разные форматы - Delphi
Здраствуйте. Подскажите как можно сохранить текст из RichEdit в текстовый файл(.тхт) в кодировке ANSI - Кирилица (1251). По возможности...

Сохранение содержимого richedit в переменную вместе с настройками шрифта - Delphi
Доброго времени суток. Есть программка, работает хорошо, но есть неувязочка. В процессе работы программы в richedit записывается...

Запись в txt с RichEdit - Delphi
Здраствуйте. проблема вот такая. есть RichEdit, где я ввел текст, а мне в файл его записало как ...

17
SHD1
0 / 0 / 0
Регистрация: 14.02.2016
Сообщений: 20
27.02.2016, 09:02  [ТС] #16
unifikator,
Цитата Сообщение от unifikator Посмотреть сообщение
Что бы отрегулировать перенос нужно подобрать длину строк в Word
- Пытался подобрать, но обязательно какой-нибудь прибор неправильно перенесётся Шаблон немного переделал, и там переносы не нужны. Как теперь их убрать?

Цитата Сообщение от unifikator Посмотреть сообщение
Можно открыть и заполнять два документа Word.
- Пытался выделить процедуру открытия Word и замены меток и прописать её для других кнопок (открытия протокола и извещения о непригодности), но потерпел поражение ввиду оооочень малых знаний (практически нулевых) в области подключения и работы с Word в Delphi (и с Excel тоже)
- Как прописать для каждой кнопки (кроме оборотной стороны) запуск процедуры открытия своего шаблона? При условии, что в Edit1 или ComboBox1 текст совпадёт с нужным - для каждого типа прибора свой шаблон (с проверкой, все ли поля заполнены).
- И так же заполнять "Извещение о непригодности" для выбранного прибора (с проверкой, все ли поля заполнены)
- В коде всё завязано на RichEdit1 на Form2, верно? Можно ли убрать вообще RichEdit1? Ибо он не нужен уже Там ещё и подчёркивания прописаны, но убрать их не получилось, компилятор говорит, что всё это нужно А код получается громоздким. На Form2 останется только RichEdit2, в который будут загружаться файлы оборотной стороны (это уже сделал). И печать.

Цитата Сообщение от unifikator Посмотреть сообщение
Закрывать документ вручную и создавать защиту не нужно. Я сделал так, что когда новый документ открывается в Word, то прежний закрывается. В конце программы Word закрывается.
- Это круто Только если случайно закрыть MS Word , то выход из программы и заполнение другого свидетельства невозможны Появляется ошибка "Сервер RPC недоступен"
Можно ли сделать так, чтобы при случайном закрытии Word программа всё равно закрывалась? И документы новые заполнялись?
- И при запуске программы также проверить, есть ли шаблоны Word (sv.docx, izv.docx, temp.docx, а также файлы протоколов) и Excel (111.xlsx), и если их нет, то просто сообщение показывалось "Нет такого-то шаблона". В коде это присутствует, но если нет шаблона Word, то следом за сообщением появляется ошибка "Acces violation at address 0047616F...". И если шаблонов нет, то программу запускать не нужно. Зачем она нужна, без шаблонов.
- Проверку наличия MS Word и Excel на компьютере можно сделать?


При запуске программы на одном из рабочих компьютеров появилась проблема - вначале появляется ошибка Excel

"AppName: excel.exe AppVer: 14.0.6112.5000 AppStamp:4e9b2bb3
ModName: msvbvm60.dll ModVer: 6.0.98.2 ModStamp:48038259
fDebug: 0 Offset: 000e47f2"

Затем открывается пустая книга. Но в программе все таблицы заполнены. Можно ли как-то это исправить без переустановки MS? В Google ошибку искал, но ничего не нашел

Архив проекта и данные:
METR-SV.7z

ошибка Excel.txt

Справка по извещению.txt

справка по протоколам.txt
0
unifikator
484 / 342 / 176
Регистрация: 29.03.2015
Сообщений: 667
27.02.2016, 22:12 #17
Убрал лишний код, в том числе переносы, и сократил всю программу с помощью новых функций.
Сделал обработку кнопок "Заполнить протокол" и "Заполнить извещение о непригодности".
Открытие шаблона осуществляется функцией function qopenword(qshablon,qtemp:string):boolean;, где qshablon - название шаблона в папке программы, qtemp - название заполненного шаблона. Если шаблона нет, то функция возвращает false, иначе true. Заполнение шаблона для определённого значения combobox1 осуществляет процедура procedure qreplaceallcom(f,t,c:string;s:tstringgrid);, где f - название шаблона в папке protokol, t - заполненный шаблон, c - значение combobox1, s - соответсвующий stringgrid. Заполнение шаблона для определённого значения edit1 осуществляет процедура procedure qreplaceallkfk(f,t,c:string);, где f - название шаблона в папке protokol, t - название заполненного шаблона, c - значение edit1 при значении combobox равном КФК. Наподобие этих процедур можно создать свои.
Убрал RichEdit1.
Теперь если программу запускать не из Delphi, а из папки, и закрыть вручную Word, то сообщения об ошибке не будет, и при дальнейшей работе Word откроется. Но запуская программу из Delphi, будет редко появляться сообщение об ошибке и выделяться строка кода. При этом нужно нажать клавишу F9 для дальнейшего продолжения работы программы.
Сделал проверку на наличие шаблона Excel. Если другие шаблоны не существуют, то при заполнении выходит сообщение об ошибки с указанием имени файла.
Сделал проверку на наличие MS Excel и MS Word.
Там где появляется ошибка Excel лучше переустановить Excel.
Прилагаю проект с изменениями.
1
Вложения
Тип файла: zip METR-SV.zip (936.1 Кб, 4 просмотров)
SHD1
0 / 0 / 0
Регистрация: 14.02.2016
Сообщений: 20
28.02.2016, 09:35  [ТС] #18
unifikator,
Спасибо огромное
0
28.02.2016, 09:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.02.2016, 09:35
Привет! Вот еще темы с ответами:

Сохранение форматирования RichEdit - Delphi
Скажите , возможно ли сохранить форматированный текст из RichEdit в файл так, чтобы при открывании файла исходное форматирование...

Richedit строки - Delphi
В Richedit при добавлении строк внизу получается место около 2-х пустых строк когда скролбары включены. Как это убрать?

Раскрасить строки в RichEdit - Delphi
Подсчет чисел из диапазона min-max в RichEdit, вывод в Label: procedure TForm1.Button1Click(Sender: TObject); var min, max,...

RichEdit Строки и Столбцы - Delphi
Доброе утро, подскажите, как сделать так чтобы в статус баре при нажатии на любой символ в richedit показывалась его строка и столбец.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru