Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.12.30;
Скачать: CL | DM;

Вниз

Форматирование строк в Delphi!   Найти похожие ветки 

 
Василий2 ©   (2002-11-09 14:25) [0]

В языке 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???


 
Anatoly Podgoretsky ©   (2002-11-09 14:43) [1]

И в дельфи есть и тоже крличество параметров неограничено, а то что привел это почти полный аналог под названием format


 
Alex44   (2002-11-09 14:44) [2]

Dynamicheskie massivy


 
Андрей Ульченко   (2002-11-09 15:57) [3]

В Delphi есть функция

format("ляляля %s нет нет нет %d",["оппа",10]).


 
Андрей Ульченко   (2002-11-09 15:58) [4]

Сори, дублировал ответ


 
Василий2 ©   (2002-11-09 16:08) [5]

Я не хочу использовать SysUtils, а об этой функции я сам знаю.

Читайте внимательно вопрос: Можно ли сделать какую-нибудь подобную функцию для Delphi(функцию printf с неограниченным кол-вом параметров - в функции format массив,а не неограниченное число параметров).


 
Ketmar ©   (2002-11-09 16:51) [6]

а чем так принципиально отличается форма записи Func(a, [b, c, d, ...]) от Func(a, b, c, d, ...)? парой лишних скобок? ну нельзя сделать без скобок, нельзя. только со скобками. теперь вы удовлетворены? %-)

Satanas Nobiscum! 09-Nov-XXXVII A.S.


 
Внук ©   (2002-11-09 16:53) [7]

А может, тогда лучше использовать API-функции wvsprintf и wsprintf? Вполне :)
Или - динамические массивы указателей на разнотипные параметры.


 
Василий2 ©   (2002-11-09 16:54) [8]

2Ketmar: Хорошо. Как можно?


 
Василий2 ©   (2002-11-09 17:16) [9]

Внук: Да, но только есть одна загвоздка...

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). Как быть?


 
Ketmar ©   (2002-11-09 18:06) [10]

а можно так, как в 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.


 
Alex44   (2002-11-09 19:56) [11]

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


 
Василий2 ©   (2002-11-10 08:12) [12]

Использовал дин. массив, только ошибка вылезает, помогите.

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;


 
Незнайка2   (2002-11-10 09:41) [13]

Ошибка из-за push args[c], наверно. А как бороться - НЕ ЗНАЮ!


 
Alex44   (2002-11-10 12:21) [14]

Chto est" wsprintf? Vy uvereny, chto ej imenno takie parametry nuzhny?

Net proverki na c < Length(args).

I naposledok: a zachem eti navoroty? Eto zhe prosto standartnyj Format?


 
Внук ©   (2002-11-10 14:46) [15]

Пример на wvsprintf тут http://delphibase.endimus.com/?action=viewtopic&topic=strchange :))


 
Василий2 ©   (2002-11-11 12:59) [16]

Alex44 -> Стандартный format из SysUtils, который я не использую.

Внук -> Я посмотрел... Попробую разобраться... Главное - чтобы @args в третьем параметре работало! (const args : array of const)


 
Игорь Шевченко ©   (2002-11-11 13:08) [17]

Василий2 © (11.11.02 12:59)

А SysUtils не используется по религиозным соображениям ? Или из духа Ивана Кулибина, который является по ночам и шепчет: "Изобретай велосипед, сынку, и будет тебе почет и уважение"...


 
Ketmar ©   (2002-11-11 14:17) [18]

2Игорь Шевченко:
а SysUtils большой. а вырезать функцию Format запрещает этика и эстетика (некрасиво файлы на куски резать! %-).

Satanas Nobiscum! 11-Nov-XXXVII A.S.


 
Василий2 ©   (2002-11-11 14:35) [19]

Ketmar -> Верно!


 
Игорь Шевченко ©   (2002-11-11 16:05) [20]

Ketmar © (11.11.02 14:17)

Ой, некрасиво...

Василий2 © (11.11.02 14:35)

А если идет борьба за уменьшение размеров, то имеет смысл обратиться в сторону программ на языке ассемблера - там не только SysUtils, а даже system не используется - экономия поразительная. Можно из одного байта работающую программу написать.


 
Ketmar ©   (2002-11-11 16:25) [21]

2Игорь Шевченко:
вот и я говорю: некрасиво. видите, как мы сошлись во мнении?

Satanas Nobiscum! 11-Nov-XXXVII A.S.


 
Eugen Honeker   (2002-11-11 17:15) [22]

вот аналог от 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;


 
Игорь Шевченко ©   (2002-11-11 17:17) [23]

try
....
except
end;

Давить надо за такой стиль


 
Eugen Honeker   (2002-11-11 17:25) [24]

->Игорь Шевченко

так лучше, или чего тебе герою непонравилось?


try
n:= wvsprintf(buf, @Format[1], PChar(@ap[0]));
SetString(Result, buf, n);
except
result:= "";
end;



 
Anatoly Podgoretsky ©   (2002-11-11 17:26) [25]

Мочить


 
Василий2 ©   (2002-11-12 19:26) [26]

Eugen Honeker -> Спасибо за попытку помочь, но почему-то когда я вызываю эту функцию, она форматированные данные не выводит. Например: writeln(format("Program: %s.", ["MyProg"])); В консоли написано: "Program ."


 
Василий2 ©   (2002-11-12 19:30) [27]

Ой, извиняюсь. Не

writeln(format("Program: %s.", ["MyProg"])); , а

writeln(format("Param1: %s.", [ParamStr(1)]));

В строке написано: "Param1: ."


 
Anatoly Podgoretsky ©   (2002-11-12 19:57) [28]

А как вызывал программу, для начала проверь ParamStr(0)]));



 
Василий2 ©   (2002-11-13 19:11) [29]

Еще вопросик: А почему форматируются только 2 параметра, хотя я указывал 3?


 
Eugen Honeker   (2002-11-14 00:01) [30]

что то у тебя проблемы с параметрами.
вот тебе пример


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



Страницы: 1 вся ветка

Текущий архив: 2002.12.30;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.023 c
6-99242
LORD
2002-11-01 20:05
2002.12.30
tstringlist + clientsocket = error


14-99322
Keymaster
2002-12-09 02:12
2002.12.30
Такой вот вопрос


1-99062
Skywalker
2002-12-19 13:54
2002.12.30
Как програмно получить билд приложения.


14-99337
sad
2002-12-09 09:26
2002.12.30
Вопрос математикам


14-99340
Ricks
2002-12-04 20:18
2002.12.30
Очень интересно ваше мнение