Erişim ihlali hatası alıyorum.
1) İhlal hatası: olası nedenler:
a) nesne oluşturulmamış
b) nesne yok edilmiş
Her iki durumda da, "Arayüzler" (mobil cihazlarda yaygın) kullanırken, nesnenin ihtiyaç duyulana kadar "canlı kalmasını" sağlamalısınız. Bu nedenle, nesnenin yaşamaya devam etmesini "garanti etmek" için bir değişken kullanabilirsiniz!
Bu konuda yapay zekaya danıştığımda, prosedürün `cdecl` ile başlaması gerektiğini ve bunun bir derleme sorunu olduğunu öne sürdüler; ancak, `loadObjectOfClass` içinde bu şekilde derlemeye çalıştığımda IDE bir hata üretiyor.
1) "CDECL" türü bildirimi genellikle "C" dilinde yazılmış DLL/O (nesne) fonksiyonlarına erişmek içindir; bu durumda, Android, iOS ve MSWindows kütüphaneleri bu tür bir bildirimi kullanır.
Bu nedenle, API dokümantasyonuna başvurmalısınız. Çünkü orada nasıl kullanılacağına dair daha fazla bilgi bulacaksınız.
Örneğin, MSWindows'ta Delphi'nin bildirim türünün "C" standardında olduğunu belirtmesi gerekir; bu nedenle harici sistem fonksiyonlarına erişmek için, fonksiyon veya prosedür çağrısının sonunda şu yönergeyi kullanmalısınız:
function xxxxx( xxxxxxx ):integer; cdecl;
Ancak, bu fonksiyon yalnızca Delphi'nin dahili birimlerinde başlık bildirimi zaten tanımlanmışsa kullanılabilir olacaktır. Bunu yapmak için, CBuilder için başlık dosyalarını veya Delphi için .Pas birimlerini kontrol edebilirsiniz. Normalde, "USES" veya "INCLUDE" maddesini kullandığınızda, bu fonksiyonun hangi birimde bulunduğuna dair bir fikriniz zaten vardır. Örneğin, "Winapi.Windows.pas" biriminde, Delphi'nin Embarcadero'dan tanımlanarak kullandığı tüm MSWindows API fonksiyonlarını göreceksiniz.
iOS kullanmıyorum, bu yüzden Xcode ve benzeri programlara çok aşina değilim...
Ama genel olarak tavsiyem şu:
a) Anlaması kolay bir bölüm oluşturun, iOS'a kurun ve temel testler yapın!
b) Her yeni dağıtımda kademeli olarak özellikler ekleyin ve test edin.
c) Sadece yapay zeka kodunu kopyalamaya çalışmayın; onlardan her seferinde bir bölümü açıklamalarını isteyin. Genellikle size her şeyi birden vereceklerdir. Bu öğrenme için iyi değil. Onlardan küçük parçalar göstermelerini isteyin ve kodun neden çalışıp çalışmadığını anlayana kadar soru sormaya devam edin!
d) Programlama kesin bir bilim değil; yavaş yavaş bilgi edinme ve pratik yapma meselesidir. Sonunda her şey yoluna girer, ancak çok fazla emek gerektirir.
e) Unutmayın: On yıllarca deneyime sahip yazılım mühendisleri bile maliyetli olan temel hatalar yaparlar!
Özellikle "arayüzlerin" kullanımının yoğun olduğu sistemlerde, nesnenin hala canlı olup olmadığını her zaman kontrol etmelisiniz!!!
if (MyObj<>nil) and ( MyObj.PropXXX <> nil) then ....
veya // duruma bağlı olarak
if Assigned(MyObj) and Assigned( MyObj.PropXXX ) then ....
Assigned( ... ) genellikle değişken bir metodu veya nesneyi tanımladığında kullanılır, örneğin, bir olay metodunu tanımlayan sınıf alanları:
1) İhlal hatası: olası nedenler:
a) nesne oluşturulmamış
b) nesne yok edilmiş
Her iki durumda da, "Arayüzler" (mobil cihazlarda yaygın) kullanırken, nesnenin ihtiyaç duyulana kadar "canlı kalmasını" sağlamalısınız. Bu nedenle, nesnenin yaşamaya devam etmesini "garanti etmek" için bir değişken kullanabilirsiniz!
Bu konuda yapay zekaya danıştığımda, prosedürün `cdecl` ile başlaması gerektiğini ve bunun bir derleme sorunu olduğunu öne sürdüler; ancak, `loadObjectOfClass` içinde bu şekilde derlemeye çalıştığımda IDE bir hata üretiyor.
1) "CDECL" türü bildirimi genellikle "C" dilinde yazılmış DLL/O (nesne) fonksiyonlarına erişmek içindir; bu durumda, Android, iOS ve MSWindows kütüphaneleri bu tür bir bildirimi kullanır.
Bu nedenle, API dokümantasyonuna başvurmalısınız. Çünkü orada nasıl kullanılacağına dair daha fazla bilgi bulacaksınız.
Örneğin, MSWindows'ta Delphi'nin bildirim türünün "C" standardında olduğunu belirtmesi gerekir; bu nedenle harici sistem fonksiyonlarına erişmek için, fonksiyon veya prosedür çağrısının sonunda şu yönergeyi kullanmalısınız:
function xxxxx( xxxxxxx ):integer; cdecl;
Ancak, bu fonksiyon yalnızca Delphi'nin dahili birimlerinde başlık bildirimi zaten tanımlanmışsa kullanılabilir olacaktır. Bunu yapmak için, CBuilder için başlık dosyalarını veya Delphi için .Pas birimlerini kontrol edebilirsiniz. Normalde, "USES" veya "INCLUDE" maddesini kullandığınızda, bu fonksiyonun hangi birimde bulunduğuna dair bir fikriniz zaten vardır. Örneğin, "Winapi.Windows.pas" biriminde, Delphi'nin Embarcadero'dan tanımlanarak kullandığı tüm MSWindows API fonksiyonlarını göreceksiniz.
iOS kullanmıyorum, bu yüzden Xcode ve benzeri programlara çok aşina değilim...
Ama genel olarak tavsiyem şu:
a) Anlaması kolay bir bölüm oluşturun, iOS'a kurun ve temel testler yapın!
b) Her yeni dağıtımda kademeli olarak özellikler ekleyin ve test edin.
c) Sadece yapay zeka kodunu kopyalamaya çalışmayın; onlardan her seferinde bir bölümü açıklamalarını isteyin. Genellikle size her şeyi birden vereceklerdir. Bu öğrenme için iyi değil. Onlardan küçük parçalar göstermelerini isteyin ve kodun neden çalışıp çalışmadığını anlayana kadar soru sormaya devam edin!
d) Programlama kesin bir bilim değil; yavaş yavaş bilgi edinme ve pratik yapma meselesidir. Sonunda her şey yoluna girer, ancak çok fazla emek gerektirir.
e) Unutmayın: On yıllarca deneyime sahip yazılım mühendisleri bile maliyetli olan temel hatalar yaparlar!
Kod: (Select All)
implementation
{$R *.dfm}
// Example:
var
MyObjX : TObject; // your "object type" ...
MyObjInterface: IInterface; // your "interface x"
procedure Hello1( AObj: TObject );
begin
// to do something ...
AObj.Free; // DONT DO IT!!! = exception or access violation after get out here!
//
end;
procedure Hello2( MyObjInterface: IInterface );
begin
// to do something ...
//
MyObjInterface := nil; // DONT DO IT!!! = exception or access violation after get out here!
end;
procedure TForm1.Button1Click( Sender: TObject );
begin
MyObjX := TObject.Create; // my object is alive here....
try
Hello1( MyObjX ); // my object is alive here....
//
finally
MyObjX.Free; // my object is free here....
end;
//
MyObjInterface := TMyObj_Interfaced.Create; // my object is alive here....
try
Hello2( MyObjInterface ); // my object is alive here....
//
finally
MyObjX := nil; // my object is free here....
end;
end;if (MyObj<>nil) and ( MyObj.PropXXX <> nil) then ....
veya // duruma bağlı olarak
if Assigned(MyObj) and Assigned( MyObj.PropXXX ) then ....
Assigned( ... ) genellikle değişken bir metodu veya nesneyi tanımladığında kullanılır, örneğin, bir olay metodunu tanımlayan sınıf alanları:
Kod: (Select All)
procedure TForm1.Button1Click( Sender: TObject );
begin
if Assigned( Button1.OnClick ) then
Button1.OnClick( self ); // = Button1.Click
end;
MSWindows, Android, RAD Studio 13 Florence ve kafamda bir fikir

