2016-04-04 26 views
-1

Aşağıya bakın. Bir ClientDataSet'in bir AfterOpen olayıdır.
İkinci deyim neden NEDEN DEĞİL?
Hata iletisi: Tanımlanamayan tanıtıcı: 'LogChanges'
Üçüncü ifade derliyor.
Üçüncü ifade doğru mu ve ilkine denk mi?
'DataSet' kullanılamazsa, neden geçilir?İlk ifade neden derleniyor, ancak ikinci değil?

procedure TCTL_Configurator_form.cdsZonesAfterOpen(DataSet: TDataSet); 
begin 
    cdsZones.LogChanges     := FALSE; // This line compiles 
    DataSet.LogChanges     := FALSE; // This line does NOT compile 
    TClientDataSet(DataSet).LogChanges := FALSE; // This line compiles 
end; 
+0

Etkinliğin bir "DataSet" olan * bir "TClientDataSet" veya alt öğeyi geçmesi durumunda 3. seçeneğin çalışma ihlali ile çalışma zamanında başarısız olabileceğini unutmayın. – afrazier

+0

Sorunun üçüncü satırında derleyici hatası bahsediyorum. – AndersJ

+0

afrazier, etkinlik sadece oluşturmak için ilk olarak iki kez tıklatıldığı veri kümesinden çağrılır. Aynı olay diğer veri kümelerinden de çağrılırsa erişim ihlali gerçekleşebilir mi? Eğer öyleyse, bunu yapmak için daha iyi bir yolu var mı? – AndersJ

cevap

5

TDataSet bir yöntem LogChanges yoktur. TClientDataSet'da tanıtıldı, bu yüzden üçüncü satır derleniyor; DataSet'u daha spesifik TClientDataSet'a yazdınız. Ve Anthony bir yorumda belirttiği gibi, typSet aslında bir TClientDataSet veya TClientDataSet'in alt öğesi değilse, çalışma zamanında bir erişim ihlaline neden olur - daha iyi bir seçim (DataSet as TClientDataSet)'u kullanmak veya if DataSet is TClientDataSet'u kullanmaktır.

olayı TDataSet içinde tanıtıldı ve bir parametre olarak düz bir TDataSet alır.

+0

Ben döküm türünü kullanıyorum, böylece aynı ifade diğer için kullanılabilir. Veri kümeleri de, daha benzer veri kümeleri eklendiğinde/gelecekteki kopyalama/yapıştırma hatalarını önleyebileceğini düşünerek. Bunu yapmak için iyi ya da kötü bir yöntem mi yazılıyor? – AndersJ

+0

TClientDataSet'nin torunları olan diğer veri kümeleri için iyi, Anders, bunun yerine * işaretli bir * tipi yayın kullanmak akıllıca olacaktır. Bu 'as' operatörünü kullanan tür. (Ve gerçekten bu olay işleyicisini birden çok nesne için olaylara ekliyorsanız, yönteme, yalnızca belirli bir nesneye ait gibi görünmeyen daha genel bir ad vermenizi öneririm.) –

+0

Sanırım açık olmayabilirim İşte. Birden fazla müşteri veri kümesine tek bir etkinlik eklemiyorum. Birçok benzer müşteri veri kümem var ve mümkün olduğunca aynı kodlanmış olayları tercih etmeyi tercih ediyorum. Gelecekte başka bir şeye ihtiyacım olduğunda ve kopyalayıp yapıştırdığımda daha az değişiklik olacak. Bu özel durumda geçerli olan kontrol edilen bir yazım örneği verebilir misiniz? – AndersJ

İlgili konular