Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 773

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!
Есть задача, нужно изменить определённый текст (типа переменных) в текстовом файле. Есть следующий ужасный код, (работает), но выглядит ужасно...
Вопрос: как сделать всё это дело через 1 компонент memo?

Приложение:
  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.  
  12.  
  13.  
  14.  
  15.  
  16.  
  17.  
  18.  


Сафин Рамиль Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Сафин Рамиль (статус: Посетитель)
Вопрос отправлен: 30 ноября 2010, 11:50
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, Сафин Рамиль!
делаем такой себе такую процедуру.

procedure modify_memo(memo:TMemo; text:String);
begin
memo.Lines.Text:=StringReplace(Memo.Lines.Text, 'wИмя', text, [rfReplaceAll, rfIgnoreCase]);
memo.Linex.Text:= ....; 
// и в таком стиле другие операции с мемо. То есть, место memo1, memo2 пишем просто memo
end;

Теперь основной код.
modify_memo(memo1, edit1.text);
modify_memo(memo2, edit1.text);
//....
modify_memo(memo10, edit1.text);
Теперь, если поменяется последовательность обработки, уже не нужно будет искать каждый раз все включения мемо. Если на форме появиться ещё пара мемо, то просто нужно добавить пару вызовов.

Если же мемо идут строго подряд по номерам, то можно ещё ужать код
for i:= 1 to 10 do 
  modify_memo(TMemo(FindControl('memo'+inttostr(i))), edit1.text);
правда нужно ещё вставить проверку, что memo найдено.

Можно пойти ещё дальше. посмотрим на строку
memo.Lines.Text:=StringReplace(Memo.Lines.Text, 'wИмя', text, [rfReplaceAll, rfIgnoreCase]);
она слишком часто повторяется. Завернем ее в процедуру.
procedure change_memo(memo:TMemo; textname, text:string);
begin
memo.Lines.Text:=StringReplace(Memo.Lines.Text, textname, text, [rfReplaceAll, rfIgnoreCase]);
end;
теперь приведенная выше процедура может быть переписана так
procedure modify_memo(memo:TMemo; text:String);
begin
change_memo(memo, 'wИмя', text);
change_memo(memo, 'wИмя2', text);
// и в таком стиле другие операции с мемо. То есть, место memo1, memo2 пишем просто memo
end;
в результате получается простенько и красиво.


У Вас там слишком много кода и непонятной мне до конца логики замен, но если посмотрите внимательно на приведенный выше код, сможете выкроить себе именно то, что нужно.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 30 ноября 2010, 12:21

Ответ #2. Отвечает эксперт: min@y™

Я бы сбацал что-то вот эдакое:

function MakeSignature(const ATemplatesPath, ASavingPath, AName, ASurname,
  APosition, ADivision, ADepartment, AAddress: string): Boolean;
const
  Flags: TReplaceFlags = [rfReplaceAll, rfIgnoreCase];
  Files: array[0..7] of string = ('RG.htm',
                                  'RG-Olja.htm',
                                  'RG-Arsenal.htm',
                                  'RG-Panorama.htm',
                                  'RG-Diapazon.htm',
                                  'RG-Sreda.htm',
                                  'RG-Ekonom.htm',
                                  'RG-Top.htm');
var
  Index: Integer;
  FileName, Buffer: string;
  List: TStrings;
begin
  Result:= True;
  List:= TStringList.Create;
  try
    for Index:= 0 to High(Files) do // цикл обработки файлов по очереди
      begin
        FileName:= IncludeTrailingPathDelimiter(ATemplatesPath) + Files[Index]; // Файл шаблона
 
        // Загрузка
        try
          List.LoadFromFile(FileName);
        except
          Result:= False;
          ShowMessage('Не могу загрузить файл "' + FileName + '".');
        end;
 
        if not Result
          then Exit; // Выход по ошибке
 
        // Замены данных в шаблоне
        Buffer:= StringReplace(List.Text, 'wИмя', AName, Flags));
        Buffer:= StringReplace(Buffer, 'фам', ASurname, Flags));
 
        if Index = 0
          then begin
                 Buffer:= StringReplace(Buffer, 'wвакансия', APosition, Flags));
                 Buffer:= StringReplace(Buffer, 'wДепарт', ADepartment, Flags));
               end
          else begin
                 Buffer:= StringReplace(Buffer, 'wДолжность', APosition, Flags));
                 Buffer:= StringReplace(Buffer, 'Департ', ADepartment, Flags));
               end;
 
        Buffer:= StringReplace(Buffer, 'Отдел', ADivision, Flags);
        List.Text:= StringReplace(Buffer, 'wАдрес', AAddress, Flags);
        FileName:= IncludeTrailingPathDelimiter(ASavingPath) + Files[Index]; // Файл сохранения
 
        // Сохранение
        try
          List.SaveToFile(FileName);
        except
          Result:= False;
          ShowMessage('Не могу сохранить файл "' + FileName + '".');
        end;
 
        if not Result
          then Exit; // Выход по ошибке
      end;
  finally
    List.Free();
  end;
end;
 
// вызов функции:
var
  Temp: string;
begin
  //...
  if DivComboBox.Text = 'Руководители департаментов'
    then Temp:= ''
    else Temp:= DivComboBox.Text;
 
  if MakeSignature('U:\Отдел ИТ\Подписи\',                  // папка с шаблонами
                   Label10.Caption + '\Microsoft\Шаблоны\'; // папка сохранения
                   Edit1.Text,                              // имя
                   Edit2.Text,                              // фамилия
                   PosComboBox.Text,                        // должность
                   Temp,                                    // подразделение
                   DepComboBox.Text,                        // департамент
                   ComboBox1.Text)                          // адрес
    then ShowMessage('Подпись создана!');
end;

Уверен, что этот код можно сократить, если правильно сделать файлы шаблонов, а именно - заточить их под функцию Format().

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 30 ноября 2010, 13:44
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 5; последнее сообщение — 30 ноября 2010, 12:48; участников в обсуждении: 2.
Сафин Рамиль

Сафин Рамиль (статус: Посетитель), 30 ноября 2010, 11:52 [#1]:

procedure TMainForm.FormShow(Sender: TObject);
begin
memo1.Lines.LoadFromFile('U:\Отдел ИТ\Подписи\RG.htm');
memo2.Lines.LoadFromFile('U:\Отдел ИТ\Подписи\RG-Olja.htm');
memo3.Lines.LoadFromFile('U:\Отдел ИТ\Подписи\RG-Arsenal.htm');
memo4.Lines.LoadFromFile('U:\Отдел ИТ\Подписи\RG-Panorama.htm');
memo5.Lines.LoadFromFile('U:\Отдел ИТ\Подписи\RG-Diapazon.htm');
memo6.Lines.LoadFromFile('U:\Отдел ИТ\Подписи\RG-Sreda.htm');
memo7.Lines.LoadFromFile('U:\Отдел ИТ\Подписи\RG-Ekonom.htm');
memo8.Lines.LoadFromFile('U:\Отдел ИТ\Подписи\RG-Top.htm');
end;

procedure TMainForm.Button1Click(Sender: TObject);
begin
memo1.Lines.Text:=StringReplace(Memo1.Lines.Text, 'wИмя', edit1.text, [rfReplaceAll, rfIgnoreCase]);
memo2.Lines.Text:=StringReplace(Memo2.Lines.Text, 'wИмя', edit1.text, [rfReplaceAll, rfIgnoreCase]);
memo3.Lines.Text:=StringReplace(Memo3.Lines.Text, 'wИмя', edit1.text, [rfReplaceAll, rfIgnoreCase]);
memo4.Lines.Text:=StringReplace(Memo4.Lines.Text, 'wИмя', edit1.text, [rfReplaceAll, rfIgnoreCase]);
memo5.Lines.Text:=StringReplace(Memo5.Lines.Text, 'wИмя', edit1.text, [rfReplaceAll, rfIgnoreCase]);
memo6.Lines.Text:=StringReplace(Memo6.Lines.Text, 'wИмя', edit1.text, [rfReplaceAll, rfIgnoreCase]);
memo7.Lines.Text:=StringReplace(Memo7.Lines.Text, 'wИмя', edit1.text, [rfReplaceAll, rfIgnoreCase]);
memo8.Lines.Text:=StringReplace(Memo8.Lines.Text, 'wИмя', edit1.text, [rfReplaceAll, rfIgnoreCase]);

memo1.Lines.Text:=StringReplace(Memo1.Lines.Text, 'фам', edit2.text, [rfReplaceAll, rfIgnoreCase]);
memo2.Lines.Text:=StringReplace(Memo2.Lines.Text, 'фам', edit2.text, [rfReplaceAll, rfIgnoreCase]);
memo3.Lines.Text:=StringReplace(Memo3.Lines.Text, 'фам', edit2.text, [rfReplaceAll, rfIgnoreCase]);
memo4.Lines.Text:=StringReplace(Memo4.Lines.Text, 'фам', edit2.text, [rfReplaceAll, rfIgnoreCase]);
memo5.Lines.Text:=StringReplace(Memo5.Lines.Text, 'фам', edit2.text, [rfReplaceAll, rfIgnoreCase]);
memo6.Lines.Text:=StringReplace(Memo6.Lines.Text, 'фам', edit2.text, [rfReplaceAll, rfIgnoreCase]);
memo7.Lines.Text:=StringReplace(Memo7.Lines.Text, 'фам', edit2.text, [rfReplaceAll, rfIgnoreCase]);
memo8.Lines.Text:=StringReplace(Memo8.Lines.Text, 'фам', edit2.text, [rfReplaceAll, rfIgnoreCase]);

memo1.Lines.Text:=StringReplace(Memo1.Lines.Text, 'wвакансия', poscombobox.text, [rfReplaceAll, rfIgnoreCase]);
memo2.Lines.Text:=StringReplace(Memo2.Lines.Text, 'wДолжность', poscombobox.text, [rfReplaceAll, rfIgnoreCase]);
memo3.Lines.Text:=StringReplace(Memo3.Lines.Text, 'wДолжность', poscombobox.text, [rfReplaceAll, rfIgnoreCase]);
memo4.Lines.Text:=StringReplace(Memo4.Lines.Text, 'wДолжность', poscombobox.text, [rfReplaceAll, rfIgnoreCase]);
memo5.Lines.Text:=StringReplace(Memo5.Lines.Text, 'wДолжность', poscombobox.text, [rfReplaceAll, rfIgnoreCase]);
memo6.Lines.Text:=StringReplace(Memo6.Lines.Text, 'wДолжность', poscombobox.text, [rfReplaceAll, rfIgnoreCase]);
memo7.Lines.Text:=StringReplace(Memo7.Lines.Text, 'wДолжность', poscombobox.text, [rfReplaceAll, rfIgnoreCase]);
memo8.Lines.Text:=StringReplace(Memo8.Lines.Text, 'wДолжность', poscombobox.text, [rfReplaceAll, rfIgnoreCase]);
if divcombobox.Items.Text='Руководители департаментов' then
divcombobox.Text:='';
memo1.Lines.Text:=StringReplace(Memo1.Lines.Text, 'Отдел', divcombobox.text, [rfReplaceAll, rfIgnoreCase]);
memo2.Lines.Text:=StringReplace(Memo2.Lines.Text, 'Отдел', divcombobox.text, [rfReplaceAll, rfIgnoreCase]);
memo3.Lines.Text:=StringReplace(Memo3.Lines.Text, 'Отдел', divcombobox.text, [rfReplaceAll, rfIgnoreCase]);
memo4.Lines.Text:=StringReplace(Memo4.Lines.Text, 'Отдел', divcombobox.text, [rfReplaceAll, rfIgnoreCase]);
memo5.Lines.Text:=StringReplace(Memo5.Lines.Text, 'Отдел', divcombobox.text, [rfReplaceAll, rfIgnoreCase]);
memo6.Lines.Text:=StringReplace(Memo6.Lines.Text, 'Отдел', divcombobox.text, [rfReplaceAll, rfIgnoreCase]);
memo7.Lines.Text:=StringReplace(Memo7.Lines.Text, 'Отдел', divcombobox.text, [rfReplaceAll, rfIgnoreCase]);
memo8.Lines.Text:=StringReplace(Memo8.Lines.Text, 'Отдел', divcombobox.text, [rfReplaceAll, rfIgnoreCase]);

memo1.Lines.Text:=StringReplace(Memo1.Lines.Text, 'wДепарт', depcombobox.text, [rfReplaceAll, rfIgnoreCase]);
memo2.Lines.Text:=StringReplace(Memo2.Lines.Text, 'Департ', depcombobox.text, [rfReplaceAll, rfIgnoreCase]);
memo3.Lines.Text:=StringReplace(Memo3.Lines.Text, 'Департ', depcombobox.text, [rfReplaceAll, rfIgnoreCase]);
memo4.Lines.Text:=StringReplace(Memo4.Lines.Text, 'Департ', depcombobox.text, [rfReplaceAll, rfIgnoreCase]);
memo5.Lines.Text:=StringReplace(Memo5.Lines.Text, 'Департ', depcombobox.text, [rfReplaceAll, rfIgnoreCase]);
memo6.Lines.Text:=StringReplace(Memo6.Lines.Text, 'Департ', depcombobox.text, [rfReplaceAll, rfIgnoreCase]);
memo7.Lines.Text:=StringReplace(Memo7.Lines.Text, 'Департ', depcombobox.text, [rfReplaceAll, rfIgnoreCase]);
memo8.Lines.Text:=StringReplace(Memo8.Lines.Text, 'Департ', depcombobox.text, [rfReplaceAll, rfIgnoreCase]);


memo1.Lines.Text:=StringReplace(Memo1.Lines.Text, 'wАдрес', combobox1.text, [rfReplaceAll, rfIgnoreCase]);
memo2.Lines.Text:=StringReplace(Memo2.Lines.Text, 'wАдрес', combobox1.text, [rfReplaceAll, rfIgnoreCase]);
memo3.Lines.Text:=StringReplace(Memo3.Lines.Text, 'wАдрес', combobox1.text, [rfReplaceAll, rfIgnoreCase]);
memo4.Lines.Text:=StringReplace(Memo4.Lines.Text, 'wАдрес', combobox1.text, [rfReplaceAll, rfIgnoreCase]);
memo5.Lines.Text:=StringReplace(Memo5.Lines.Text, 'wАдрес', combobox1.text, [rfReplaceAll, rfIgnoreCase]);
memo6.Lines.Text:=StringReplace(Memo6.Lines.Text, 'wАдрес', combobox1.text, [rfReplaceAll, rfIgnoreCase]);
memo7.Lines.Text:=StringReplace(Memo7.Lines.Text, 'wАдрес', combobox1.text, [rfReplaceAll, rfIgnoreCase]);
memo8.Lines.Text:=StringReplace(Memo8.Lines.Text, 'wАдрес', combobox1.text, [rfReplaceAll, rfIgnoreCase]);

c:=GetSpecialPath(CSIDL_APPDATA);

memo1.Lines.SaveToFile(label10.caption+'\Microsoft\Шаблоны\RG.htm');
memo2.Lines.SaveToFile(label10.caption+'\Microsoft\Подписи\RG-Olja.htm');
memo3.Lines.SaveToFile(label10.caption+'\Microsoft\Подписи\RG-Arsenal.htm');
memo4.Lines.SaveToFile(label10.caption+'\Microsoft\Подписи\RG-Panorama.htm');
memo5.Lines.SaveToFile(label10.caption+'\Microsoft\Подписи\RG-Diapazon.htm');
memo6.Lines.SaveToFile(label10.caption+'\Microsoft\Подписи\RG-Sreda.htm');
memo7.Lines.SaveToFile(label10.caption+'\Microsoft\Подписи\RG-Ekonom.htm');
memo8.Lines.SaveToFile(label10.caption+'\Microsoft\Подписи\RG-Top.htm');
showmessage('Подпись создана!');
close;
end;
min@y™

min@y™ (статус: Доктор наук), 30 ноября 2010, 12:10 [#2]:

А зачем всё это делать через TMemo?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Сафин Рамиль

Сафин Рамиль (статус: Посетитель), 30 ноября 2010, 12:14 [#3]:

через что можно попробовать?
Сафин Рамиль

Сафин Рамиль (статус: Посетитель), 30 ноября 2010, 12:16 [#4]:

код этот взял у чела на курс выше. В прошлом году делал такое же задание, но как то выглядит не симатично
min@y™

min@y™ (статус: Доктор наук), 30 ноября 2010, 12:48 [#5]:

Цитата (Сафин Рамиль):

через что можно попробовать?

Через TStringList.

Цитата (Сафин Рамиль):

код этот взял у чела на курс выше.

Ему надо руки из Ж...ы вырвать и в плечи вставить. Халтурщик.

Цитата (Сафин Рамиль):

но как то выглядит не симатично

Выглядит просто отвратительно.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:55
Выполнено за 0.04 сек.