![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Научите работать, как работает ShowMessageFmt
12 © (2010-06-23 13:03:00)например, пишу - ShowMessageFmt('%d %f %s',[1,pi,'eklmn']);
и контрол+клик
доскакал до
procedure FmtStr(var Result: string; const Format: string; const Args: array of const);
потом там есть
function FormatBuf(var Buffer; BufLen: Cardinal; const Format;
FmtLen: Cardinal; const Args: array of const): Cardinal;
var
ArgIndex, Width, Prec: Integer;
BufferOrg, FormatOrg, FormatPtr, TempStr: PChar;
JustFlag: Byte;
StrBuf: array[0..64] of Char;
TempAnsiStr: string;
SaveGOT: Integer;
{ in: eax <-> Buffer }
{ in: edx <-> BufLen }
{ in: ecx <-> Format }
asm
PUSH EBX
...
далее там несколько страниц асма, мне не реально понять
что хочу, собственно
Как написать ShowMessageMyFmt, самому, чтоб, допустим,
вывод ее был не "1 3.14 eklmn"
а "№1(int)=1 №2(float)=3.14 №3(str)=eklmn"
ps
Вариант
ShowMessageFmt('№1(int)=%d - не интересен :)
В школу! (2010-06-23 21:47:00) [1]
> но зачем тогда borland так заморачивался с асмом?
делать нечего
Leonid Troyanovsky (2010-06-23 16:18:00) [2]
> 12 © (23.06.10 15:37) [7]
> но зачем тогда borland так заморачивался с асмом? Скорость?
Они морочились не с ShowMessageFmt, а с Format.
Она достачно широко используется и, видимо,
захотелось оптимальности.
--
Regards, LVT.
12 (2010-06-23 15:37:00) [3]с вариантами ясно
и наверное так и сделаю, что-то типа
> [6] Leonid Troyanovsky © (23.06.10 14:40)
но зачем тогда borland так заморачивался с асмом? Скорость?
Leonid Troyanovsky (2010-06-23 14:40:00) [4]
> 12 © (23.06.10 13:24) [3]
> а можно как-то, (и как) понять, что в ShowMessageFmt('%d'
> ,[1,
> первый параметр int?
function MakeStr(const Arg: TVarRec): string;
const
BoolChars: array[Boolean] of Char = ('F', 'T');
begin
Result := '';
with Arg do
case VType of
vtInteger: Result := '(int) ' + IntToStr(VInteger);
vtBoolean: Result := '(bool) ' + BoolChars[VBoolean];
vtChar: Result := '(char) ' + VChar;
vtExtended: Result := '(ext) ' + FloatToStr(VExtended^);
vtString: Result := '(str) ' + VString^;
vtAnsiString: Result := '(ansi) ' + string(VAnsiString);
// ..
end;
end;
function FrmStr(const v: array of const): String;
var
i: Longint;
begin
Result := '';
for i := Low(v) to High(v) do
Result := Result + Format('¹%d %s ', [Ord(i)+1, MakeStr(v[i])]);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(FrmStr([12, -1e-23, true]));
end;
--
Regards, LVT.
RWolf (2010-06-23 14:03:00) [5]
> > 12 © (23.06.10 13:24) [3]
> это же сам указываешь
Если передавать параметром массив Variant'ов, то можно обойтись без явного указания типа в строке формата, в принципе.
turbouser (2010-06-23 13:56:00) [6]
> 12 © (23.06.10 13:24) [3]
> это же сам указываешь
а вот [1,pi,'eklmn'] дельфи указывает?
12 (2010-06-23 13:24:00) [7]> [2] Игорь Шевченко © (23.06.10 13:15)
> > Как написать ShowMessageMyFmt, самому, чтоб, допустим,
> > вывод ее был не "1 3.14 eklmn"
> > а "№1(int)=1 №2(float)=3.14 №3(str)=eklmn"
> интерпретировать строку формата. Готов ?
не знаю
самостоятельно пришел к перегрузке
а можно как-то, (и как) понять, что в ShowMessageFmt('%d' ,[1,
первый параметр int?
> [1] Leonid Troyanovsky © (23.06.10 13:09)
> > 12 © (23.06.10 13:03)
> > ShowMessageFmt('№1(int)=%d - не интересен :)
> Переобоснуй.
это же сам указываешь
Игорь Шевченко (2010-06-23 13:15:00) [8]
> Как написать ShowMessageMyFmt, самому, чтоб, допустим,
> вывод ее был не "1 3.14 eklmn"
> а "№1(int)=1 №2(float)=3.14 №3(str)=eklmn"
интерпретировать строку формата. Готов ?
Leonid Troyanovsky (2010-06-23 13:09:00) [9]
> 12 © (23.06.10 13:03)
> ShowMessageFmt('№1(int)=%d - не интересен :)
Переобоснуй.
--
Regards, LVT.