android — Список необработанных данных датчика в памятке" />

Список необработанных данных датчика в памятке

Я хочу перечислить все доступные исходные данные датчика в заметке для Android.

Следующий код работал в последние годы, но он не работает с XE8. Вероятно, есть внутренняя ошибка компилятора. Могу ли я что-нибудь сделать, чтобы это снова заработало, или есть альтернативное решение?

uses
  TypInfo;

type
  TOrientationSensorAccessor = class(TCustomOrientationSensor);
  TLocationSensorAccessor = class(TCustomLocationSensor);

procedure TForm2.Button1Click(Sender: TObject);
var
  p_location: TCustomLocationSensor.TProperty;
  p_orientation: TCustomOrientationSensor.TProperty;
  n, v: string;
begin
  Memo1.Lines.Clear;

  if Assigned(OrientationSensor1.Sensor) then
  begin
    if not OrientationSensor1.Sensor.Started then OrientationSensor1.Sensor.Start;

    // Error (only in XE8): Incompatible types 'TCustomLocationSensor.TProperty' and 'TCustomOrientationSensor.TProperty'
    // In XE7 it works.
    for p_orientation in OrientationSensor1.Sensor.AvailableProperties do
    begin
      n := 'OrientationSensor.'+GetEnumName(TypeInfo(TCustomOrientationSensor.TProperty), integer(p_orientation)) ;
      v := FloatToStr(TOrientationSensorAccessor(OrientationSensor1.Sensor).GetDoubleProperty(p_orientation));
      Memo1.Lines.Values[n] := v;
    end;
  end;

  if Assigned(LocationSensor1.Sensor) then
  begin
    if not LocationSensor1.Sensor.Started then LocationSensor1.Sensor.Start;
    for p_location in LocationSensor1.Sensor.AvailableProperties do
    begin
      n := 'LocationSensor.'+GetEnumName(TypeInfo(TCustomLocationSensor.TProperty), integer(p_location)) ;
      v := FloatToStr(TLocationSensorAccessor(LocationSensor1.Sensor).GetDoubleProperty(p_location));
      Memo1.Lines.Values[n] := v;
    end;
  end;
end;

Обновление

Некоторые эксперименты:

(1) Когда я закомментирую первое «for», оно скомпилируется:

//    for p_orientation in OrientationSensor1.Sensor.AvailableProperties do
//    begin
      n := 'OrientationSensor.'+GetEnumName(TypeInfo(TCustomOrientationSensor.TProperty), integer(p_orientation)) ;
      v := FloatToStr(TOrientationSensorAccessor(OrientationSensor1.Sensor).GetDoubleProperty(p_orientation));
      Memo1.Lines.Values[n] := v;
//    end;
  end;

(2) Когда я закомментирую присвоение "n" и "v", он тоже скомпилируется:

    for p_orientation in OrientationSensor1.Sensor.AvailableProperties do
    begin
//      n := 'OrientationSensor.'+GetEnumName(TypeInfo(TCustomOrientationSensor.TProperty), integer(p_orientation)) ;
//      v := FloatToStr(TOrientationSensorAccessor(OrientationSensor1.Sensor).GetDoubleProperty(p_orientation));
//      Memo1.Lines.Values[n] := v;
    end;
  end;

Поскольку ни "for", ни "n", ни "v" не являются плохой областью, тогда где же ошибка?

(3) Когда я закомментирую второй цикл for, он снова скомпилируется. Если я закомментирую первый цикл for, он тоже скомпилируется. Каждый цикл for работает, но в комбинации они не будут работать.

Похоже, ошибка возникает только в том случае, если объединены 5 факторов:

  • TypInfo
  • Accessors
  • для цикла
  • Использование TypInfo (GetEnumName)
  • Используются оба цикла for.

Обновление 2

Вот самый маленький воспроизводимый код, который я смог найти. Если какая-либо строка закомментирована, она компилируется:

program ProjectCompilerBug;

{$APPTYPE CONSOLE}

uses
  System.Sensors, System.Sensors.Components;

var
  p_location: TCustomLocationSensor.TProperty;
  p_orientation: TCustomOrientationSensor.TProperty;
begin
  // Compilation Error (only in XE8):
  // "Incompatible types 'TCustomLocationSensor.TProperty' and 'TCustomOrientationSensor.TProperty'"
  // In XE7 it compiles
  for p_orientation in TOrientationSensor.Create(nil).Sensor.AvailableProperties do
  begin
    FloatToStr(1.23);
  end;

  for p_location in TLocationSensor.Create(nil).Sensor.AvailableProperties do
  begin
  end;
end.
7 голосов | спросил Daniel Marschall 21 PMpTue, 21 Apr 2015 15:34:11 +030034Tuesday 2015, 15:34:11

1 ответ


0

Да, это похоже на ошибку компилятора XE8. Я думаю, что вы отлично поработали, изолировав это, за что я вас рекомендую. Вам нужно будет отправить отчет об ошибке на портал качества.

Чтобы обойти ошибку, я думаю, вы сможете поместить циклы в отдельные функции. Моя гипотеза заключается в том, что ключом является наличие двух циклов for in с разными типами переменных цикла, которые являются ключом. Избегайте этого, и вы сможете избежать этой проблемы.

ответил David Heffernan 21 PMpTue, 21 Apr 2015 20:08:11 +030008Tuesday 2015, 20:08:11

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132