Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.05.02;
Скачать: CL | DM;

Вниз

Преобразование типа Byte к вещественному Double...   Найти похожие ветки 

 
Helen   (2002-04-10 16:25) [0]

Все ссылки между таблицами в базе хранятся в поле типа Byte. Для
дальнейшей работы необходимо видеть их в более удобочитаемом виде. Пробую преобразовать к типу Double...ругается.
Подскажите пожалуйста, в чем здесь ошибка? или можно как-то по-дугому?

procedure NameProc;
var s: variant;
begin
S :=
VarAsType(AdoTable1.FieldByName("F$Nrec").AsVariant,$0005);
end;


 
Johnmen   (2002-04-10 16:43) [1]

procedure NameProc;
var s: double;
begin
S := AdoTable1.FieldByName("F$Nrec").AsFloat;
end;

И вообще неясно, зачем их видеть и что значит "в удобочитаемом виде" ?


 
Helen   (2002-04-10 17:12) [2]

Пробовала.
"Cannot access field "F$NREC" as type Float"...

Удобочитаемый это чтобы можно было например поставить по нему фильтр.


 
Alex G u e s t   (2002-04-10 17:18) [3]

А не проще ли Byte преобразовывать в Char?


 
Lusha   (2002-04-10 17:21) [4]

А чему равняется DataSize?
И если он больше 1, то как Вы себе вообще представляете преобразование этого массива в Double?
А слить в вариант, я думаю, можно так...

var V : Variant;
begin
V := VarArrayCreate([0, TADOTable.FieldByName("F$NREC").DataSize], VarByte);
V := TADOTable.FieldByName("F$NREC").AsVariant;
...


 
Helen   (2002-04-10 17:24) [5]

В книжках по это ничего не пишут, но пишут, что можно в String,
тогда
S:=VarAsType(AdoTable1.FieldByName("F$Nrec").AsVariant,$0100);

но что-то тоже не получается...


 
Lusha   (2002-04-10 17:24) [6]

Гы-гы. Забыл вычесть единичку... :)


 
Johnmen   (2002-04-10 17:30) [7]

AsInteger ?


 
Helen   (2002-04-10 17:35) [8]

Lusha:
я что-то не понимаю. Я не хочу ничего никуда сливать.
Как Variant я итак вижу поля,
TADOTable.FieldByName("F$NREC").AsVariant
Мне нужно видеть значение поля так, чтобы можно было его запомнить и по нему поставить фильтр в другой таблице.


 
Lusha   (2002-04-10 17:39) [9]

>...можно было его запомнить...
Вот я Вам и предоставил пример как его можно запомнить... У Вас есть идеи как это сделать иначе? У меня нет... :(


 
Lusha   (2002-04-10 17:47) [10]

А если нужно просто отфильтровать НД используйте свойство OnFilterRecord... Я думаю - это то, что Вам нужно...


 
Lusha   (2002-04-11 09:02) [11]

Да, признаться виноват. В реплике Lusha © (10.04.02 17:21) можно обойтись одним оператором присваивания...

V := TADOTable.FieldByName("F$NREC").AsVariant;




 
Helen   (2002-04-11 10:19) [12]

>Lusha © (11.04.02 09:02)
Все это конечно хорошо, но фильтр не работает со значениями типа Variant, а OnFilterRecord это метод, а не свойство. Значит он будет работать все время как только свойство *.Filtred := True. Мне это не очень подходит, потому что по ходу программы я все время меняю свойство *.Filter. <- Им бы и удобнее было пользоваться, но для этого нужно сформировать символьную строку условия, а этот Variant у меня никак к нему не преобразовывается.


 
Lusha   (2002-04-11 10:27) [13]

>Helen © (11.04.02 10:19)
Начнем с того, что OnFilterRecord это указатель на процедуру. А процедур может быть несколько (каждая задает свой критерий фильтрации). И менять можно не текст строки TDataSet.Filter, а значение указателя OnFilterRecord.

Например:
...
Filtered := False;
OnFilterRecord := procedure1;
Filtered := True;
...
...
Filtered := False;
OnFilterRecord := procedure2;
Filtered := True;
...

P.S. А привести Ваш variant к строке и работать с ним в свойстве Filter, мне кажется Вам не удаться...


 
Helen   (2002-04-11 10:34) [14]

Lusha © (11.04.02 10:27)
Хорошо, Вы пробовали поставить фильтр с присутствием в нем значения типа Variant??? Я же говорю, что не получается, ошибка что "не могу преобразовать..."
По поводу примера, как вообще снять ранее определенное условие на OnFilterRecord (очистить? чтобы он потом не "смешивался" с уловием TDataSet.Filter)?


 
Lusha   (2002-04-11 10:46) [15]

>Helen
>Хорошо, Вы пробовали поставить фильтр с присутствием в нем >значения типа Variant???

Повторяю. Для определения критериев фильтрации по значению с типом Variant используйте обработчик на событие OnFilterRecord...
Обработчик при этом будет выглядеть приблизительно так...

procedure TForm1.DataSetFilterRecord(DataSet: TDataSet;
var Accept: Boolean);
var V : Variant;
begin
Accept := (V[1] = 25) and (V[2] = 128);
end;




>По поводу примера, как вообще снять ранее определенное условие на OnFilterRecord

OnFilterRecord := nil;


 
Lusha   (2002-04-11 10:56) [16]

Извините. Забыл одну строчку в обработчике...

procedure TForm1.DataSetFilterRecord(DataSet: TDataSet;
var Accept: Boolean);
var V : Variant;
begin
V := DataSet.FieldByName("F$NREC").AsVariant;
Accept := (V[1] = 25) and (V[2] = 128);
end;







 
wicked   (2002-04-11 11:31) [17]

2 Helen ©

> По поводу примера, как вообще снять ранее определенное условие
> на OnFilterRecord (очистить? чтобы он потом не "смешивался"
> с уловием TDataSet.Filter)?

маленький совет - не используй одновременно и Filter, и OnFilterRecord, так как это есть источник потенциальных, трудноуловимых граблей... OnFilterRecord"а хватит с головой, если наборы данных невелики...



Страницы: 1 вся ветка

Текущий архив: 2002.05.02;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.01 c
1-2570
ruslan_as
2002-04-19 11:12
2002.05.02
Удалить все файлы из каталога


3-2474
sashag
2002-04-10 13:35
2002.05.02
Траблы со чтением конечных пробелов из строкового поля


3-2482
MCFire
2002-04-11 11:45
2002.05.02
Опять TreeView


7-2708
Mainstream
2002-02-05 13:52
2002.05.02
Properites


3-2498
IronHawk
2002-04-10 13:00
2002.05.02
Приветствую Мастеров ! Эт снова Я ! Быстрый поиск по базе ?