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

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

Преобразование вариантных типов


guav ©   (2006-10-13 23:38:00) 

Как задать формат для преобразование Double в Variant ?
Например, код:

procedure TForm1.Button1Click(Sender: TObject);
var V: Variant;
begin
 V := 1.5E-3;
 Caption := V;
end;


выведет 0,0015 в заголовок с учётом DecimalSeparator, а хотелось бы, чтобы был экспоненциальный формат с точкой (т.е. что-то вроде 1.5E-3 или 1.5000E-003 ).


guav   (2006-10-14 21:29:00) [1]

Облом.
Значения VarToLStrProc и VarToWStrProc не используются для преобразования ни в коде [0], ни в моём реальном коде, они используются для форматирующих подпрограмм из SysUtils и записи вариантов в текстовый файл.


Германн   (2006-10-14 01:23:00) [2]


> Джо ©   (14.10.06 01:11) [10]
>
> > [9] Германн ©   (14.10.06 01:09)
> > Менять генофонд?
>
> Зачем? просто подменить (присвоить) ссылку на свою процудуру
> переменной System.VarToLStrProc, вероятно.
>

А есть такая переменная в System? System.VarToLStrProc.


Джо   (2006-10-14 01:11:00) [3]

> [9] Германн ©   (14.10.06 01:09)
> Менять генофонд?

Зачем? просто подменить (присвоить) ссылку на свою процудуру переменной System.VarToLStrProc, вероятно.


Германн   (2006-10-14 01:09:00) [4]


> Хм. Точно. Похоже, тут предусмотрен был обходной путь.

Менять генофонд?


Джо   (2006-10-14 00:58:00) [5]

> [7] guav ©   (14.10.06 00:56)
> А мне кажется, что эти
> System.VarToLStrProc := @_VarToLStr;
> System.VarToWStrProc := @_VarToWStr;

Хм. Точно. Похоже, тут предусмотрен был обходной путь.


guav   (2006-10-14 00:56:00) [6]

А мне кажется, что эти
 System.VarToLStrProc := @_VarToLStr;
 System.VarToWStrProc := @_VarToWStr;

можно попробовать подменить.
Или копать в сторону custom variant types.
Думаю пути есть, вопрос только насколько это сложно.


Джо   (2006-10-14 00:39:00) [7]

> и при этом чтобы две такие переменные складывались как
> Double, а не как строки.

Они и так будут складываться, как Double. Ну, если уж очень хочется видеть это явно, то складывай как TVarData(V1).VDouble + TVarData(V2).VDouble — но смысл-то в этом какой?


> чтобы присвоение Caption := V; приводило к желаемому результату,
> при этом не искать такие места по всей программе,

ИМХО, это невозможно. Caption := V приведет к вызову

procedure _VarToLStr(var S: string; const V: TVarData);
var
 Temp: TVarData;
begin
 if V.VType = varString then
   S := String(V.VString)
 else
 begin
   _VarInit(Temp);
   try
     _VarCast(Temp, V, varString);
     S := String(Temp.VString);
   finally
     _VarClear(Temp);
   end;
 end;
end;

И, как ни копай, по-моему, никуда тут свой формат не вклинишь :)


guav   (2006-10-14 00:22:00) [8]

> [3] Джо ©   (14.10.06 00:05)

Перефразирую:
Сделать так, чтобы присвоение Caption := V; приводило к желаемому результату, при этом не искать такие места по всей программе, и при этом чтобы две такие переменные складывались как Double, а не как строки.


Джо   (2006-10-14 00:11:00) [9]

> все-равно в Double

Ну, или в Single, смотря какое значение присваивать будешь.


Джо   (2006-10-14 00:05:00) [10]

> Интересует такой код, чтобы V оставалась числом, но преобразовывалась
> когда требуется преобразовать как мне хочется.

Ничего не понял, если честно. "1.5E-3" — это уже текстовое представление данных. Внутренне в Variant такие числа хранятся все-равно в Double.


guav   (2006-10-13 23:59:00) [11]

> [1] Джо ©   (13.10.06 23:45)


Ну это с преобразованием в строку, так и я могу:

function EnsureProperStringFormat(V: Variant): Variant;
begin
 case VarType(V) of
   varDouble, varSingle: Result := FloatToStrF(V, ffExponent, 15, 3);
 else
   Result := V;
 end;
end;


Интересует такой код, чтобы V оставалась числом, но преобразовывалась когда требуется преобразовать как мне хочется.


Джо   (2006-10-13 23:45:00) [12]

Самое простое, что смог придумать:
Caption := Format ('%e',[Double(V)]);
:)


Наверх

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