Memo

2015-04-21 10 views
7

'daki ham sensör verilerini listele Mevcut tüm ham sensör verilerini Android için bir Not uygulamasında listelemek istiyorum.Memo

Aşağıdaki kodlar geçtiğimiz yıllarda çalıştı, ancak XE8 ile çalışmıyor. Muhtemelen bir dahili derleyici hatası vardır. Tekrar çalışmak için yapabileceğim bir şey var mı yoksa alternatif bir çözüm var mı?

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; 

Güncelleme

Bazı deneyler:

ben "yerine" ilk açıklama yaparken (1), bu derlenir:

// 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" ve "v" öğelerinin atanmasını söylediğimde, o da derlenecek:

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; 

Ne "ne" ne ne de "n" ve "v", hatalı bölge olmadığından, hata nerede?

(3) İkinci for döngüsü açıkladığımda, yeniden derlenir. İlk for döngüsü açıklarsam, o da derlenir. Her bir for-loop çalışması, ancak kombinasyon halinde çalışmayacaklar.

5 faktör karıştırılması durumunda bu hata sadece oluyor gibi görünmektedir:

  • Hem için-döngüler
  • TypInfo Kullanımı (GetEnumName)

    • erişimciler döngü için
    • TypInfo kullanılmış.

    Güncelleme Burada 2

    bulabildiğim en küçük tekrarlanabilir kodudur. Herhangi bir satır yorumlanırsa, derleme:

  • +0

    Biraz daha ayrılmayı açıklar mısınız? Saatlerce çalıştığını anlamaya çalışıyorum. 'p_orientation'' 'TCO’nun Özel BilgilendirmeSensörü' ve diğer tarafıdır. "TypInfo" gibi alakasız şeyleri kaldırdığımda tekrar çalışır. –

    +0

    Bu ifade, soruda bildirdiğinizle çelişir. –

    +0

    Açıklamam, artık bir derleme değil. Kendin test edebilirsin. Bazı şeyleri açıkladım, ama sorunun nerede olduğunu bulamıyorum, bu yüzden derleyici bir böcek olduğunu farz ediyorum. –

    cevap

    5

    Evet, bu bir XE8 derleyici hatası gibi görünüyor. Sanırım, bunu sana övgüyle karşıladığım güzel bir iş çıkardın. Hata raporunu Kalite Portalı'na göndermeniz gerekir.

    Geçici çözüm için, döngüleri döngüsel işlevlere ayırabileceğinizi düşünüyorum. Benim hipotezim anahtarın, anahtarın farklı yazılan döngü değişkenleri olan döngüler için iki varlığı olması. Bunu önlemek ve problemden kaçınmanız gerekir.

    +0

    Bu fikir için çok teşekkür ederim! Şimdi kod yine Delphi'nin yeni sürümünde derliyor. :-) Ben de hata bildirdi: https://quality.embarcadero.com/browse/RSP-10575. Btw, erişimcileri ve tüm mevcut sensör verilerini okuyabilmenin tek yolu olduğunu düşünüyor musunuz? Benim düşünceme göre, kirli bir programlama tarzı gibi görünüyor. –

    +0

    FMX'i bilmiyorum, özellikle mobil derleyiciler değil. Ancak bunun için RTTI gerçekten yanlış hissettiriyor. Biri daha iyi bir yol olmalı ....... –

    İlgili konular