Components for Delphi and C++ Builder.

Перейти в английский форум
Перейти на EhLib.com
Текущее время: 25 апр 2024, 22:57

Часовой пояс: UTC




Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
СообщениеДобавлено: 31 июл 2014, 04:34 
Не в сети

Зарегистрирован: 17 сен 2013, 07:01
Сообщений: 66
Попробовал тут портировать старый проект c xe на xe6.

Поля типа TVariantField в TMemtableEh не работают в Delphi XE6
В Delphi XE все нормально.

Создайте новый проект (обычный VCL Form Application), бросьте на форму TDBGridEh, TDataSource и TMemTableEh
Соедините их между собой
Создайте поле типа TMTVariantDataFieldEh в TMemTableEh
Создайте дата сет "Create DataSet"
Выставите свойство TMemTableEh Active=true
Запустите получившееся приложение
Если попытаться редактировать в гриде поле типа TMTVariantDataFieldEh после выхода из режима редактирования, поле очищается.
Обращения из кода к такому полю:
Даже если что то записать в это поле через memtable1.rec.Value[0, DvvValueEh] (так нормально записывается и читается, кстате),
то чтение Memtable1.Fields[0].Value всегда возвращает null (это я думаю корень проблемы)
Если в design time попытаться завести данные в таблицу, через вкладку "Edit Data", что то вводить в это поле, тоже самое, после выхода из режима редактирования - пустое поле,
но при этом все же похоже что то записывается, потому что, если оставить несколько таких строк и запустить проект вываливается куча ошибок.

Все это актуально для версии EhLib 6.3.182 Delphi XE6
В delphi XE все нормально работает.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 31 июл 2014, 05:48 
Не в сети

Зарегистрирован: 17 сен 2013, 07:01
Сообщений: 66
проблема отсюда:

модуль Data.DB со строки 9728:

function TVariantField.GetAsVariant: Variant;
{$IFNDEF NEXTGEN}
begin
if not GetData(@Result) then
Result := Null;
end;
{$ELSE}
var
Buffer: TValueBuffer;
begin
SetLength(Buffer, SizeOf(Variant));
if not GetData(Buffer) then
Result := Null
else
Move(Buffer[0], Result, SizeOf(Variant));
end;
{$ENDIF !NEXTGEN}

Так как у меня NEXTGEN не определен
вызывается
if not GetData(@Result) then
Result := Null;
т.е. Версия GetData c типом параметра Buffer: Pointer

Далее по цепочке
FDataSet.GetFieldData(Self, Buffer, NativeFormat)

а в модуле MemTableEh переопределение функций описано как:
{$IFDEF EH_LIB_17}
{$IFDEF EH_LIB_18}
function GetFieldData(Field: TField; var Buffer: TValueBuffer): Boolean; override;
function GetFieldData(FieldNo: Integer; var Buffer: TValueBuffer): Boolean; override;
function GetFieldData(Field: TField; var Buffer: TValueBuffer; NativeFormat: Boolean): Boolean; override;
{$ELSE}
function GetFieldData(Field: TField; Buffer: TValueBuffer): Boolean; override;
function GetFieldData(FieldNo: Integer; Buffer: TValueBuffer): Boolean; override;
function GetFieldData(Field: TField; Buffer: TValueBuffer; NativeFormat: Boolean): Boolean; override;
{$ENDIF}
{$ELSE}
function GetFieldData(Field: TField; Buffer: {$IFDEF CIL}TRecordBuffer{$ELSE}Pointer{$ENDIF}): Boolean; override;
function GetFieldData(Field: TField; Buffer: {$IFDEF CIL}TRecordBuffer{$ELSE}Pointer{$ENDIF}; NativeFormat: Boolean): Boolean; override;
function GetFieldData(FieldNo: Integer; Buffer: {$IFDEF CIL}TRecordBuffer{$ELSE}Pointer{$ENDIF}): Boolean; overload; override;
{$ENDIF}

т.е. вариант с параметром Buffer: Pointer будет переопределен только для Ehlib < EH_LIB_17
и как итог эти функции не переопеделены начиная с XE3 и для вариантного поля результат всегда будет null
ну и для всех остальных типов полей которые вызывают именно этот вариант GetFieldData тоже

Добавил к вышеуказанным строкам:
{$IFDEF EH_LIB_17}
function GetFieldData(Field: TField; Buffer: {$IFDEF CIL}TRecordBuffer{$ELSE}Pointer{$ENDIF}): Boolean; override;
function GetFieldData(Field: TField; Buffer: {$IFDEF CIL}TRecordBuffer{$ELSE}Pointer{$ENDIF}; NativeFormat: Boolean): Boolean; override;
function GetFieldData(FieldNo: Integer; Buffer: {$IFDEF CIL}TRecordBuffer{$ELSE}Pointer{$ENDIF}): Boolean; overload; override;
{$ENDIF}
т.е. получилось
{$IFDEF EH_LIB_17}
{$IFDEF EH_LIB_18}
function GetFieldData(Field: TField; var Buffer: TValueBuffer): Boolean; override;
function GetFieldData(FieldNo: Integer; var Buffer: TValueBuffer): Boolean; override;
function GetFieldData(Field: TField; var Buffer: TValueBuffer; NativeFormat: Boolean): Boolean; override;
{$ELSE}
function GetFieldData(Field: TField; Buffer: TValueBuffer): Boolean; override;
function GetFieldData(FieldNo: Integer; Buffer: TValueBuffer): Boolean; override;
function GetFieldData(Field: TField; Buffer: TValueBuffer; NativeFormat: Boolean): Boolean; override;
{$ENDIF}
{$ELSE}
function GetFieldData(Field: TField; Buffer: {$IFDEF CIL}TRecordBuffer{$ELSE}Pointer{$ENDIF}): Boolean; override;
function GetFieldData(Field: TField; Buffer: {$IFDEF CIL}TRecordBuffer{$ELSE}Pointer{$ENDIF}; NativeFormat: Boolean): Boolean; override;
function GetFieldData(FieldNo: Integer; Buffer: {$IFDEF CIL}TRecordBuffer{$ELSE}Pointer{$ENDIF}): Boolean; overload; override;
{$ENDIF}
{$IFDEF EH_LIB_17}
function GetFieldData(Field: TField; Buffer: {$IFDEF CIL}TRecordBuffer{$ELSE}Pointer{$ENDIF}): Boolean; override;
function GetFieldData(Field: TField; Buffer: {$IFDEF CIL}TRecordBuffer{$ELSE}Pointer{$ENDIF}; NativeFormat: Boolean): Boolean; override;
function GetFieldData(FieldNo: Integer; Buffer: {$IFDEF CIL}TRecordBuffer{$ELSE}Pointer{$ENDIF}): Boolean; overload; override;
{$ENDIF}

и соответственно тела для этих функций
Проблема разрешилась
Можно наверное немного изящнее сделать, лень думать)
Исправляйте вобщем


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 11 авг 2014, 12:34 
Не в сети

Зарегистрирован: 21 дек 2011, 18:48
Сообщений: 1549
Добрый день.

Исправлено в сборке EhLib 6.3 Build 6.3.184

_________________
Best regards
EhLib support Team


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Часовой пояс: UTC


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB