Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Научите работать, как работает 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.


Наверх

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