![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Форматирование строк в Delphi!
Василий2 © (2002-11-09 14:25:00)В языке C++ есть много всяких форматирующих функций. Например: printf, sprintf и т.д. Когда их вызываешь, то кол-во параметров неограниченно, например:
char name[255];
DWORD age;
char addr[255];
printf("\n Name: %s\n Age: %d\n Address: %s\n", name, age, addr);
Можно ли сделать какую-нибудь подобную функцию для Delphi???
Eugen Honeker (2002-11-14 00:01:00) [1]что то у тебя проблемы с параметрами.
вот тебе пример
const
fmt = "%s %s %s %s [0x%.08x] %c";
...
MessageBox(0, @Format(fmt, ["ich","bin","ein","lammer", 43962, "."])[1], nil, 144);
выдаёт на экране:
ich bin ein lammer [0x0000abba] .
Василий2 (2002-11-13 19:11:00) [2]Еще вопросик: А почему форматируются только 2 параметра, хотя я указывал 3?
Anatoly Podgoretsky (2002-11-12 19:57:00) [3]А как вызывал программу, для начала проверь ParamStr(0)]));
Василий2 (2002-11-12 19:30:00) [4]Ой, извиняюсь. Не
writeln(format("Program: %s.", ["MyProg"]));, а
writeln(format("Param1: %s.", [ParamStr(1)]));
В строке написано: "Param1: ."
Василий2 (2002-11-12 19:26:00) [5]Eugen Honeker -> Спасибо за попытку помочь, но почему-то когда я вызываю эту функцию, она форматированные данные не выводит. Например: writeln(format("Program: %s.", ["MyProg"])); В консоли написано: "Program ."
Anatoly Podgoretsky (2002-11-11 17:26:00) [6]Мочить
Eugen Honeker (2002-11-11 17:25:00) [7]->Игорь Шевченко
так лучше, или чего тебе герою непонравилось?
try
n:= wvsprintf(buf, @Format[1], PChar(@ap[0]));
SetString(Result, buf, n);
except
result:= "";
end;
Игорь Шевченко (2002-11-11 17:17:00) [8]try
....
except
end;
Давить надо за такой стиль
Eugen Honeker (2002-11-11 17:15:00) [9]вот аналог от Format(SysUtils) на читом api, кому надо
function Format(const Format: string; const Args: array of const): string;
type
array_of_pointer = array[0..0]of pointer;
var
n: integer;
ap: ^array_of_pointer;
buf: array[0..1023]of char;
begin
result:= "";
n:= length(Args);
if (n = 0) then exit;
getmem(ap, n * sizeof(Pointer));
for n:= 0 to (n-1) do
ap[n]:= Args[n].VPointer;
try
n:= wvsprintf(buf, @Format[1], PChar(@ap[0]));
SetString(Result, buf, n);
except
end;
freemem(ap);
end;
Ketmar (2002-11-11 16:25:00) [10]2Игорь Шевченко:
вот и я говорю: некрасиво. видите, как мы сошлись во мнении?
Satanas Nobiscum! 11-Nov-XXXVII A.S.
Игорь Шевченко (2002-11-11 16:05:00) [11]Ketmar © (11.11.02 14:17)
Ой, некрасиво...
Василий2 © (11.11.02 14:35)
А если идет борьба за уменьшение размеров, то имеет смысл обратиться в сторону программ на языке ассемблера - там не только SysUtils, а даже system не используется - экономия поразительная. Можно из одного байта работающую программу написать.
Василий2 (2002-11-11 14:35:00) [12]Ketmar -> Верно!
Ketmar (2002-11-11 14:17:00) [13]2Игорь Шевченко:
а SysUtils большой. а вырезать функцию Format запрещает этика и эстетика (некрасиво файлы на куски резать! %-).
Satanas Nobiscum! 11-Nov-XXXVII A.S.
Игорь Шевченко (2002-11-11 13:08:00) [14]Василий2 © (11.11.02 12:59)
А SysUtils не используется по религиозным соображениям ? Или из духа Ивана Кулибина, который является по ночам и шепчет: "Изобретай велосипед, сынку, и будет тебе почет и уважение"...
Василий2 (2002-11-11 12:59:00) [15]Alex44 -> Стандартный format из SysUtils, который я не использую.
Внук -> Я посмотрел... Попробую разобраться... Главное - чтобы @args в третьем параметре работало! (const args : array of const)
Внук (2002-11-10 14:46:00) [16]Пример на wvsprintf тут http://delphibase.endimus.com/?action=viewtopic&topic=strchange:))
Alex44 (2002-11-10 12:21:00) [17]Chto est" wsprintf? Vy uvereny, chto ej imenno takie parametry nuzhny?
Net proverki na c < Length(args).
I naposledok: a zachem etinavoroty? Eto zhe prosto standartnyj Format?
Незнайка2 (2002-11-10 09:41:00) [18]Ошибка из-за push args[c], наверно. А как бороться - НЕ ЗНАЮ!
Василий2 (2002-11-10 08:12:00) [19]Использовал дин. массив, только ошибка вылезает, помогите.
function format(value : string; const args : array of const) : string;
var
format : pchar;
buffer : pchar;
c : dword;
begin
result := "";
format := "";
buffer := "";
c := 0;
while pos("%", value) <> 0 do
begin
result := result + copy(value, 1, pos("%", value) - 1);
format := pchar(copy(value, pos("%", value), 2));
delete(value, 1, pos("%", value) + 1);
getmem(buffer, 256);
asm
push args[c]
push format
push buffer
call wsprintf
add esp, 0Ch
end;
result := result + string(buffer);
freemem(buffer);
inc(c);
end;
end;
Alex44 (2002-11-09 19:56:00) [20]V Pascal"e i v C raznye soglasheniya vyzova. No v principe, dynamicheskij massiv kak parameter ochen" malo otlyuchaetsya ot peremennogo chisla parametrov (i tam, i tam peredayetsya chislo parametrov, a potom samy parametry).