|
Вопрос # 4 773/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты!
Есть задача, нужно изменить определённый текст (типа переменных) в текстовом файле. Есть следующий ужасный код, (работает), но выглядит ужасно...
Вопрос: как сделать всё это дело через 1 компонент memo?
 |
Вопрос задал: Сафин Рамиль (статус: Посетитель)
Вопрос отправлен: 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™ (статус: Доктор наук), 30 ноября 2010, 12:10 [#2]:
А зачем всё это делать через TMemo?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Сафин Рамиль (статус: Посетитель), 30 ноября 2010, 12:14 [#3]:
через что можно попробовать?
|
|
Сафин Рамиль (статус: Посетитель), 30 ноября 2010, 12:16 [#4]:
код этот взял у чела на курс выше. В прошлом году делал такое же задание, но как то выглядит не симатично
|
|
min@y™ (статус: Доктор наук), 30 ноября 2010, 12:48 [#5]:
Цитата (Сафин Рамиль):
через что можно попробовать?
Через TStringList.
Цитата (Сафин Рамиль):
код этот взял у чела на курс выше.
Ему надо руки из Ж...ы вырвать и в плечи вставить. Халтурщик.
Цитата (Сафин Рамиль):
но как то выглядит не симатично
Выглядит просто отвратительно.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|