![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Преобразование вариантных типов
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)]);
:)