Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Форматирование строк в Delphi!


Страницы:   1 2

Василий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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо