Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2002.12.30;
Скачать: [xml.tar.bz2];

Вниз

Форматирование строк в 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2002.12.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.011 c
3-99003
Valeron
2002-12-09 10:11
2002.12.30
Проблема с D6 после редактирования *.tlb


14-99290
Игорь Шевченко
2002-11-28 14:58
2002.12.30
---|Ветка была без названия|---


7-99373
sef
2002-10-24 14:27
2002.12.30
Выполнение кода с проавами текущего пользователя #2


1-99093
The_Vizit0r
2002-12-19 19:31
2002.12.30
Не подскажете,а?


3-98976
Calm
2002-12-10 10:17
2002.12.30
Почему не отображаются значения полей?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский