Текущий архив: 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.51 MB
Время: 0.014 c