![]() |
| ||
|
|
Новости |
Поиск |
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???
Ketmar (2002-11-09 18:06:00) [21]а можно так, как в Format сделано. цитата из хэлпа:
function MakeStr(const Args: array of const): string;
const
BoolChars: array[Boolean] of Char = ("F", "T");
var
I: Integer;
begin
Result := "";
for I := 0 to High(Args) do
with Args[I] do
case VType of
vtInteger: Result := Result + IntToStr(VInteger);
vtBoolean: Result := Result + BoolChars[VBoolean];
vtChar: Result := Result + VChar;
vtExtended: Result := Result + FloatToStr(VExtended^);
vtString: Result := Result + VString^;
vtPChar: Result := Result + VPChar;
vtObject: Result := Result + VObject.ClassName;
vtClass: Result := Result + VClass.ClassName;
vtAnsiString: Result := Result + string(VAnsiString);
vtCurrency: Result := Result + CurrToStr(VCurrency^);
vtVariant: Result := Result + string(VVariant^);
vtInt64: Result := Result + IntToStr(VInt64^);
end;
end;
MakeStr(["test", 100, " ", True, 3.14159, TForm])
returns the string “test100 T3.14159TForm”.
Satanas Nobiscum! 09-Nov-XXXVII A.S.
Василий2 (2002-11-09 17:16:00) [22]Внук: Да, но только есть одна загвоздка...
function i2s(value : dword) : string;
const format : pchar = "%d";
var buffer : pchar;
begin
getmem(buffer, 256);
asm
push value
push format
push buffer
call wsprintf
add esp, 0Ch
end;
result := string(buffer);
freemem(buffer);
end;
Эта функция аналог IntToStr. Здесь сразу известно кол-во параметров для форматирования (1) и сама строка ("%d"). А что делать когда оно не известно? Пользователь мог отформатировать("name: %s", name), а мог и("name: %s age: %d", name, age). Как быть?
Василий2 (2002-11-09 16:54:00) [23]2Ketmar: Хорошо. Как можно?
Внук (2002-11-09 16:53:00) [24]А может, тогда лучше использовать API-функции wvsprintf и wsprintf? Вполне :)
Или - динамические массивы указателей на разнотипные параметры.
Ketmar (2002-11-09 16:51:00) [25]а чем так принципиально отличается форма записи
Func(a, [b, c, d, ...])отFunc(a, b, c, d, ...)? парой лишних скобок? ну нельзя сделать без скобок, нельзя. только со скобками. теперь вы удовлетворены? %-)
Satanas Nobiscum! 09-Nov-XXXVII A.S.
Василий2 (2002-11-09 16:08:00) [26]Я не хочу использовать SysUtils, а об этой функции я сам знаю.
Читайте внимательно вопрос: Можно ли сделать какую-нибудь подобную функцию для Delphi(функцию printf с неограниченным кол-вом параметров - в функции format массив,а не неограниченное число параметров).
Андрей Ульченко (2002-11-09 15:58:00) [27]Сори, дублировал ответ
Андрей Ульченко (2002-11-09 15:57:00) [28]В Delphi есть функция
format("ляляля %s нет нет нет %d",["оппа",10]).
Alex44 (2002-11-09 14:44:00) [29]Dynamicheskie massivy
Anatoly Podgoretsky (2002-11-09 14:43:00) [30]И в дельфи есть и тоже крличество параметров неограничено, а то что привел это почти полный аналог под названием format