TdxMemData.LoadFromDataSet и строковые поля

dartveider13
Дата: 20.06.2019 09:40:56
Добрый день!
Заполняю MemDat-y значениями из запроса TIBQuery через процедуру LoadFromDataSet
Нормально перенеслись значения Integer, Date, а вот строковые почему-то не перенеслись. Не подскажете в чем может быть загвоздка.
Делфи юникодная, наименование и размер полей в мемке и запросе совпадают. БД - Firebird 3.0. Кодировка БД - Win1251
dartveider13
Дата: 20.06.2019 11:23:46
Ну как мне кажется, я нашел в чем проблема. В запросе IBQuery, строковое поле представлено типом TIBStringField. В мемке типом поля является TStringField. Несовпадение типов однако) Вот теперь как бы победить?
DimaBr
Дата: 20.06.2019 11:47:15
Цепочка...

TIBStringField = class(TWideStringField)

constructor TStringField.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  SetDataType(ftString);
end;

constructor TWideStringField.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  SetDataType(ftWideString);
end;


procedure TdxCustomMemData.LoadFromDataSet(DataSet : TDataSet);

  function CanAssignTo(ASource, ADestination: TFieldType): Boolean;
  begin
    Result := ASource = ADestination;  // ftString <> ftWideString
    if not Result then
      Result := (ASource = ftAutoInc) and (ADestination = ftInteger);
  end;

var
  i : Integer;
  AField : TField;
  mField: TdxMemField;
begin
...
  while not DataSet.EOF do
  begin
    Append;
    for i := 0 to DataSet.FieldCount - 1 do
    begin
      AField := FindField(DataSet.Fields[i].FieldName);
      if(AField <> nil) and CanAssignTo(DataSet.Fields[i].DataType, AField.DataType) then
      begin
dartveider13
Дата: 20.06.2019 11:58:38
Ну да, я там и посмотрел. Получается WideString должен подойти. Сейчас проверим
dartveider13
Дата: 20.06.2019 12:04:21
DimaBr, Ооо спасибо тебе добрый человек. WideString это то что надо)