Форум: "Прочее";
Текущий архив: 2016.01.24;
Скачать: [xml.tar.bz2];
ВнизКак вам более понятно? Найти похожие ветки
← →
Кто б сомневался © (2015-05-21 00:45) [40]Первый, но измененный.
Я бы весь текст вынес в отдельную строку константу и использовал 1 вызов Format. В комментах указал бы что есть что.
Так еще удобней, т.к. возможно текст может измениться, или может быть переведен - его проще менять в будущем - напр. обычным юзерам, которые решили перевести помочь.const MyString = "ID перевода: %s" +#13#10+ #13#10+ // aID
"Номер перевода: %s" +#13#10+ // aTRN
"Код точки: %s" +#13#10; итд //aPP_CODE
sBody := Format(MyString, [aID, aTRN, aPP_CODE]);
Но если код очень часто вызывается, то второй.
← →
Кто б сомневался © (2015-05-21 00:55) [41]
> его проще менять в будущем - напр. обычным юзерам
Если текст грузится с текстового файла.
← →
sniknik © (2015-05-21 10:36) [42]> Если текст грузится с текстового файла.
В [0] видно, что это код.
Если бы грузился юзерский файл, то, ИМХО, лучше подошёл бы вариант с парсером "аля PhP" предложенный выше, так чтобы переменные явно в текст записывались. Но вообще это офтопик. В обсуждении исключительно код + программист, и никаких юзеров.
← →
Дмитрий Белькевич © (2015-05-21 11:41) [43]+ за [40], типа такого что-то:
FormatStr :=
"ID перевода: %s" + CRLF + CRLF +
"Номер перевода: %s" + CRLF +
"Код точки: %s" + CRLF +
"Дата: %s" + CRLF + CRLF +
"Номер претензии: %s"+ CRLF +
"Комментарий: %s" + CRLF +
"Имя клиента: %s" + CRLF +
"Телефон: %s" + CRLF +
"Почта: %s";
sBody := Format(FormatStr, [aID, aTRN, ...]);
Номер претензии обрабатывать отдельно, до или после присвоения FormatStr.
← →
Дмитрий Белькевич © (2015-05-21 11:46) [44]Или const вместо FormatStr, да. Ничего же не меняется. ИМХО - наилучший вариант, но - тебе решать, конечно. Если нужна максимальная производительность - лучше вообще и без конкатенации и формата делать - копированием в длинную строку, с указателем на текущую вершину, мне кажется. Но, понятно, наглядность и прозрачность сильно пострадают. Названия переменных, опять же - плохие.
← →
sniknik © (2015-05-21 12:09) [45]> но - тебе решать, конечно
?
Как? На что повлияет "решение"? (или решил, что я спрашиваю для себя, свой стиль переформировать?)
Обычно я сталкиваюсь с таким постфактум, когда уже поздно "воспитывать" (это если для других) но нужно разбираться с проблемой/глюком (к счастью не в этом случае).
И обычно чужой код очень трудно понять... нелогичный, запутанный, будто специально куча усложнений.
Ну вот "твой"+[40] вариант, думаешь понятнее для чтения из-за "наведенного косметического сахара"?
Сталкивался. + То же самое у него, вот писал
> запросы вынесены в константы (+ поэтапное внесение... т.е. константу в переменную, а переменную после в CommandText)
Запрос в одном месте, использование в другом, а то и по разным модулям разнесено, параметры передаются через какие-то обезличенные наборы, и т.д.
Хотя, вроде бы просто, напиши прям там где используешь, и не нужно "мотаться" из модуля в модуль чтобы просто посмотреть как, и из чего сформируется запрос/письмо.
Вот сам прикинь, поставь себя на место читающего... в твоем случае. Вот тебе заявка "там с письмом что-то не то, данные не на месте вроде". Ну вот и проверь правильно ли у тебя соотносятся порядковые %s с какой нибудь переменной, не перепутан ли порядок... будет их 50, и что? Без переноса функции в тестовую прогу и задание явных значений (на месте проверить в 90% случаев нельзя/сложнее) получится? Просто прочитав код, дашь гарантию?
Хотя, ладно, чего я вообще убеждать начал... просто + еще пара человек чей код я бы не хотел получить на проверку.
← →
Дмитрий Белькевич © (2015-05-21 17:58) [46]>Просто прочитав код, дашь гарантию?
В [0] такая задача (над-модульный рефакторинг + проверки "на вшивость") не ставилась, как я вижу и понимаю, всё читать и плотно вникать в чужие проблемы, извини, нет времени. Для того, что написано в [0] локального случая, мне кажется, нормальное решение.
Я так бы вообще не делал, а делал бы шаблоны в файлах с названиями полей + парсер + данные в базе, у себя есть несколько немного похожих мест. Мне кажется - тянуть эту всю муть в код вообще не стоит, хотя, как я написал, дело твоё - ты задачу лучше знаешь и видишь.
← →
virex(home) © (2015-05-24 08:10) [47]свой формат с блекждеком
из стрингреплейс
[var1] и [var2] вместо %s в массиве параметров
а еще лучше: вместо массива искать свойство объекта из рантайма по имени
tmyobj = class
var1:string;
var2:string;
end;
myobj:=tmyobj.create...
myformat("text [var1] [var2]", myobj)
function myformat(s:string; obj:tobject)...
begin
... вытаскиваем из obj свойства и stringreplace на их содержимое
вот такой аналог синтакс сахара из си шарпа
← →
virex(home) © (2015-05-24 20:30) [48]в D7 можно так:
//{$M+} - включает rtti для TObject
//TMyObj можно наследовать и от TComponent, тогда модификатор не нужен
{$M+}
type TMyObj = class
private
Fvar1,Fvar2:string;
published
property var1:string read Fvar1 write Fvar1;
property var2:string read Fvar2 write Fvar2;
end;
{$M-}
function myformat(text:string; obj:TObject):string;
var
i,propCount:integer;
propInfo: PPropInfo;
propType: PPTypeInfo;
propList: PPropList;
begin
result:=text;
PropList := AllocMem(SizeOf(PropList^));
try
GetPropInfos(obj.ClassInfo, propList);
propCount := GetPropList(obj.ClassInfo, propList);
for i := 0 to propCount - 1 do
begin
propInfo := propList^[i];
propType := propInfo^.PropType;
case propType^.Kind of
tkString, tkLString, tkWString:
result:=StringReplace(result,"["+propInfo^.Name+"]",GetStrProp(obj, propInfo),[rfReplaceAll, rfIgnoreCase]);
end;
end;
finally
FreeMem(PropList);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var obj:TMyObj;
begin
obj:=TMyObj.Create;
obj.var1:="hello";
obj.var2:="world";
Memo1.Text:=myformat("text: [var1] [var2]",obj);
end;
в Delphi 2010 и выше можно подключить rtti (псевдокод):function myformat(text:string; obj:TObject):string;
var ctx : TRttiContext;
rt : TRttiType;
prop : TRttiProperty;
value : TValue;
begin
result:=text;
ctx := TRttiContext.Create();
try
rt := ctx.GetType(obj.ClassType);
for prop in rt.GetProperties() do begin
case prop.PropertyType.TypeKind of
tkString, tkLString, tkWString, tkUString:
result:=StringReplace(result,"["+propInfo^.Name+"]",GetStrProp(obj, propInfo),[rfReplaceAll, rfIgnoreCase]);
else continue;
end;
end;
finally
ctx.Free();
end;
end;
← →
virex(home) © (2015-05-24 20:40) [49]
> virex(home) © (24.05.15 20:30) [48]
GetPropInfos тут лишнее конечно
и во втором варианте propInfo без ^
← →
Игорь Шевченко © (2015-05-25 11:04) [50]"Я нашел, как применить здесь
нестирающиеся шины из полиструктурного волокна с вырожденными аминными
связями и неполными кислородными группами. Но я не знаю пока, как
использовать регенерирующий реактор на субтепловых нейтронах. Миша, Мишок!
Как быть с реактором?"
← →
virex(home) © (2015-05-25 18:43) [51]думаю при 50+ переменных которые нужно вывести в удобочитаемый вид в качестве отчета, лучше напрячь rtti чем лепить конкатенацию на каждую переменную
← →
virex(home) © (2015-05-25 18:55) [52]А еще проще: сделать отдельный класс для отчетности
Добавлять переменную в виде пары ключ-значение
report.add("mail","office@mail.com")
report.add("call","8800-000-000")
...
report.print("почта: [mail], телефон: [call]")
← →
mike-d © (2015-05-25 19:13) [53]to Игорь Шевченко © (25.05.15 11:04) [50]
"Присмотревшись к устройству, я без труда узнал велосипед."
:)
Страницы: 1 2 вся ветка
Форум: "Прочее";
Текущий архив: 2016.01.24;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.003 c