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???


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).


Страницы:   1 2

Наверх

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