Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
PHPickerDelegate Derleme Sorunu [ÇÖZÜLDÜ]
#1
Merhabalar bir uygulamamda IOS ta çoklu resim seçme işlemi gerçekleştirmek istiyorum fakat kodda derleyici hatası alıyorum. Calling Convention (cdecl) kullanmam gerekiyor fakat derleyici bunun kullanarak 
ResultItem.itemProvider.loadObjectOfClass(TUIImage.OCClass, LoadCompleted );
bu satırı çalıştırmamı engelliyor. Calling Convention (cdecl) kaldırdığımda ise kod derleniyor resim listesi açılıyor fakat seçip tamam butonuna tıklayınca uygulama çöküyor. Galiba Calling Convention (cdecl) kullanarak bu işlemi gerçekleştirmem gerekiyor. Calling Convention (cdecl) kullanarak 
ResultItem.itemProvider.loadObjectOfClass(TUIImage.OCClass, LoadCompleted )
  bu satısı nasıl çalıştırırım yardımlarınızı bekliyorum altta kodları paylaşıyorum iyi çalışmalar.

Not : Rad Studio 13.1 kullanıyorum.

  type
   TPHPickerDelegate = class(TOCLocal, PHPickerViewControllerDelegate)
 private
   FResimNo: Integer;
   FOwner: TfrmSG_FotoSec;
 public
   constructor Create(AOwner: TfrmSG_FotoSec); cdecl;
   procedure picker(picker: PHPickerViewController; didFinishPicking: NSArray); cdecl;
   procedure LoadCompleted(Item: Pointer; Error: NSError); cdecl;
 end;

 {$ENDIF}

{$IFDEF IOS}

constructor TPHPickerDelegate.Create(AOwner: TfrmSG_FotoSec);
begin
 inherited Create;
 FOwner := AOwner;
end;

procedure TPHPickerDelegate.picker(picker: PHPickerViewController; didFinishPicking: NSArray); cdecl;
var
 I: Integer;
 ResultItem: PHPickerResult;
begin
try
 FResimNo := 0;

 if (didFinishPicking <> nil) and (didFinishPicking.count > 0) then
 begin
   FOwner.Bekleme_Durumu(True);

   for I := 0 to didFinishPicking.count - 1 do
   begin
     ResultItem := TPHPickerResult.Wrap(didFinishPicking.objectAtIndex(I));

     if (ResultItem <> nil) and (ResultItem.itemProvider <> nil) then
     begin
       if ResultItem.itemProvider.canLoadObjectOfClass(TUIImage.OCClass) then
       begin
         ResultItem.itemProvider.loadObjectOfClass(TUIImage.OCClass, LoadCompleted );
       end;
     end;
   end;
 end
 else
 begin
   FOwner.Bekleme_Durumu(False);
   FOwner.Bildirim_Mesaji('Resim Seçimi İptal Edildi.', True, False);
 end;

 picker.dismissViewControllerAnimated(True, nil);

except on e : Exception do
 ShowMessage( e.Message );
end;
end;

procedure TPHPickerDelegate.LoadCompleted(Item: Pointer; Error: NSError); cdecl;
var
 IOSImage: UIImage;
 Dump: TBitmap;
begin
 if (Item = nil) or (Error <> nil) then
   Exit;

 Inc(FResimNo);
 IOSImage := TUIImage.Wrap(Item);
 Dump := UIImageToBitmap(IOSImage, 0, TSize.Create(1920, 1080));

 if Dump <> nil then
 begin
   FOwner.Resim_list.Items.Add.Text := 'Resim ' + FResimNo.ToString;
   FOwner.Resim_list.Items[FOwner.Resim_list.ItemCount - 1].Bitmap := Dump;
 end;
  FOwner.Bekleme_Durumu(False);
end;

{$ENDIF}
Cevapla
#2
1) Beklenen işlemden farklı bir iş parçacığında kod yürütülmesi arasındaki çakışma nedeniyle olası çökme. Başka bir deyişle, mobil cihazlar genellikle eşzamansız iş parçacıklarında çalışır, oysa uygulama penceresi tarafından kullanılan iş parçacığı eşzamanlıdır (ana iş parçacığı). Bu nedenle, bu tutarsızlık kodunuzda meydana gelebilir!

2) Bir diğer faktör ise ARC'dir, yani kodda hala hayatta olmaları gereken noktadan önce ölen nesneler. Bu nedenle, mobil nesneler genellikle "arayüzler" olduğundan, kodunuz bağlam kapsamından ayrıldığı için nesneyi erken öldürüyor olabilir.

3) Kullanılan nesneleri ve iş parçacıklarını gözden geçirin!

4) Şuna benzer bir şey deneyin:

procedure TPHPickerDelegate.LoadCompleted(Item: Pointer; Error: NSError); cdecl;
var
 IOSImage: UIImage;
begin
 if (Item = nil) or (Error <> nil) then
   Exit;

 IOSImage := TUIImage.Wrap(Item);
 
 // Kullanıcı arayüzünün ana iş parçacığında güncellenmesini sağlamak için TThread.Synchronize kullanıyoruz.
 TThread.Synchronize(nil, procedure
 var
   Dump: TBitmap;
 begin
   Inc(FResimNo);
   Dump := UIImageToBitmap(IOSImage, 0, TSize.Create(1920, 1080));
   
   if Dump <> nil then
   begin
     FOwner.Resim_list.Items.Add.Text := 'Resim ' + FResimNo.ToString;
     FOwner.Resim_list.Items[FOwner.Resim_list.ItemCount - 1].Bitmap := Dump;
     Dump.Free; // Oluşturulan bitmap'i serbest bırakmak önemlidir.
   end;
   FOwner.Bekleme_Durumu(False);
 end);
end;


Dikkate Alınması Gereken Ek Noktalar:
Bellek Yönetimi: UIImageToBitmap yeni bir TBitmap nesnesi oluşturur. Bunu serbest bırakmazsanız (Dump.Free), seçilen her fotoğraf için ciddi bir bellek sızıntısı yaşarsınız.

Saklama: PHPicker aktifken TPHPickerDelegate nesnesinin serbest bırakılmadığından emin olun. PHPicker genellikle delegeyi saklar, ancak onu oluşturan değişkenin doğru kapsamda olduğundan emin olmak iyi bir uygulamadır.
MSWindows, AndroidRAD Studio 13 Florence ve kafamda bir fikir  Tongue  
WWW
Cevapla
#3
(07-07-2026, Saat: 23:06)emailx45 Adlı Kullanıcıdan Alıntı: 1) Beklenen işlemden farklı bir iş parçacığında kod yürütülmesi arasındaki çakışma nedeniyle olası çökme. Başka bir deyişle, mobil cihazlar genellikle eşzamansız iş parçacıklarında çalışır, oysa uygulama penceresi tarafından kullanılan iş parçacığı eşzamanlıdır (ana iş parçacığı). Bu nedenle, bu tutarsızlık kodunuzda meydana gelebilir!

2) Bir diğer faktör ise ARC'dir, yani kodda hala hayatta olmaları gereken noktadan önce ölen nesneler. Bu nedenle, mobil nesneler genellikle "arayüzler" olduğundan, kodunuz bağlam kapsamından ayrıldığı için nesneyi erken öldürüyor olabilir.

3) Kullanılan nesneleri ve iş parçacıklarını gözden geçirin!

4) Şuna benzer bir şey deneyin:

procedure TPHPickerDelegate.LoadCompleted(Item: Pointer; Error: NSError); cdecl;
var
 IOSImage: UIImage;
begin
 if (Item = nil) or (Error <> nil) then
   Exit;

 IOSImage := TUIImage.Wrap(Item);
 
 // Kullanıcı arayüzünün ana iş parçacığında güncellenmesini sağlamak için TThread.Synchronize kullanıyoruz.
 TThread.Synchronize(nil, procedure
 var
   Dump: TBitmap;
 begin
   Inc(FResimNo);
   Dump := UIImageToBitmap(IOSImage, 0, TSize.Create(1920, 1080));
   
   if Dump <> nil then
   begin
     FOwner.Resim_list.Items.Add.Text := 'Resim ' + FResimNo.ToString;
     FOwner.Resim_list.Items[FOwner.Resim_list.ItemCount - 1].Bitmap := Dump;
     Dump.Free; // Oluşturulan bitmap'i serbest bırakmak önemlidir.
   end;
   FOwner.Bekleme_Durumu(False);
 end);
end;


Dikkate Alınması Gereken Ek Noktalar:
Bellek Yönetimi: UIImageToBitmap yeni bir TBitmap nesnesi oluşturur. Bunu serbest bırakmazsanız (Dump.Free), seçilen her fotoğraf için ciddi bir bellek sızıntısı yaşarsınız.

Saklama: PHPicker aktifken TPHPickerDelegate nesnesinin serbest bırakılmadığından emin olun. PHPicker genellikle delegeyi saklar, ancak onu oluşturan değişkenin doğru kapsamda olduğundan emin olmak iyi bir uygulamadır.

Hocam cevabınız için çok teşekkürederim. Koddaki değişiklikleri söylediğiniz gibi yaptım. Çökmeyi hangi kısımın yaptığınıda buldum fakat hala çözüme yaklaşamadım maalesef
Çökmeye altta paylaştığım sorgu sebep oluyor.
ResultItem.itemProvider.canLoadObjectOfClass(TUIImage.OCClass)
Bu sorguyu comment yapıp test ettiğimde ise tamam butonu çalışmıyor ve resimler seçilemiyor. Aktif ettiğimde ise direk uygulama kapanıyor ama her iki durumdada iptal butonu aktif çalışıyor buda picker procedure sinin tetiklendiği anlamına geliyor.
ResultItem.itemProvider.canLoadObjectOfClass(TUIImage.OCClass)
bu sorgunun neden çalışmadığı ile ilgili bir çözüm bulamadım maalesef yardımlarınızı bekliyorum.
Cevapla
#4
iOS'in iç işleyişi hakkında derinlemesine bilgiye sahip değilim ancak bunun, kullanılan API fonksiyonlarının döndürdüğü nesne türüyle ilgili olabileceğinden şüpheleniyorum.
Başka bir deyişle, döndürülen nesne henüz görselin kendisi olmayabilir; bunun yerine, asıl bitmap'i oluşturmak için işlenmesi gereken ham veri olabilir.

PHPicker ile çalışırken, bir görselin yüklenip yüklenemeyeceğini kontrol etmek için Apple'ın önerdiği yaklaşım, doğrudan `UIImage` sınıfını kontrol etmek yerine `kUTTypeImage` (veya eşdeğer iOS tanımlayıcısı) kullanmaktır. Bunun nedeni, `itemProvider`ın görseli henüz bellekte `UIImage` formatında olmayan ancak `UIImage`e dönüştürülebilir bir formatta tutuyor olabilmesidir.

Önerilen çözüm: `canLoadObjectOfClass(TUIImage.OCClass)` kullanmak yerine, standart görsel türüyle birlikte `hasItemConformingToTypeIdentifier` kullanmalıyız.

// iOSapi.UniformTypeIdentifiers veya iOSapi.MobileCoreServices birimini kullanın.
uses
 iOSapi.UniformTypeIdentifiers, iOSapi.Foundation;

// ... döngünüzün içinde:

if (ResultItem <> nil) and (ResultItem.itemProvider <> nil) then
begin
 // canLoadObjectOfClass yerine bir UTI (Uniform Type Identifier) kontrolü kullanın.
 if ResultItem.itemProvider.hasItemConformingToTypeIdentifier(UTTypeImage) then
   ResultItem.itemProvider.loadObjectOfClass(TUIImage.OCClass, LoadCompleted);
  // else ...
end;


Bunun sorununuzu neden çözmesi gerektiği:
Çalışma Zamanı Güvenliği: `hasItemConformingToTypeIdentifier`, bir öğenin dönüştürülebilir olduğundan emin olmak için kullanılan Apple'ın yerel (native) metodudur. Delphi'deki doğrudan `canLoadObjectOfClass` kontrolüne kıyasla çok daha sağlamdır ve bellek erişim ihlallerine yol açma ihtimali daha düşüktür.

Uyumluluk: `UTTypeImage`, PHPicker tarafından sağlanan tüm görsel türlerini kapsayan doğru sabittir (constant).

Önemli uygulama noktaları:
Bellek Yönetimi: İkinci denemenizde `Dump.Free` ekleyerek doğru olanı yaptınız. Bunu yapmaya devam edin.

Yürütme İş Parçacığı (Thread): `TThread.Synchronize` kullanma fikriniz doğru. `loadObjectOfClass` asenkrondur ve arka plan iş parçacığında çalışır. Ana iş parçacığı dışından Delphi görsel bileşenlerine (örneğin `FOwner.Resim_list`) erişmeye çalışmak, FMX'teki çökmelerin bir numaralı nedenidir.

Nil Kontrolleri: Mevcut nil kontrollerinizi koruyun; çünkü Delphi köprüsü (bridge) aracılığıyla iOS üzerindeki nesne yaşam döngüsü değişken olabilir.

NOT: Portekizceden Türkçeye çeviri için Google Translate kullanılmıştır.

Yerel Android Fotoğraf Seçici'yi (Photo Picker) kullanarak Android için hazırladığım bir örnek var; belki iOS konusunda size yardımcı olabilir.

Genel olarak Delphi hakkındaki kanalıma abone olmaktan ve videolarımı beğenmekten çekinmeyin. Mümkünse, lütfen diğer yazılımcı arkadaşlarınıza da tavsiye edin!

Using native PickerPhoto from Android
https://www.youtube.com/watch?v=6lp6xiUILAg

my Youtube channel:
"www.youtube.com/@emailx45"
MSWindows, AndroidRAD Studio 13 Florence ve kafamda bir fikir  Tongue  
WWW
Cevapla
#5
(08-07-2026, Saat: 18:08)emailx45 Adlı Kullanıcıdan Alıntı: iOS'in iç işleyişi hakkında derinlemesine bilgiye sahip değilim ancak bunun, kullanılan API fonksiyonlarının döndürdüğü nesne türüyle ilgili olabileceğinden şüpheleniyorum.
Başka bir deyişle, döndürülen nesne henüz görselin kendisi olmayabilir; bunun yerine, asıl bitmap'i oluşturmak için işlenmesi gereken ham veri olabilir.

PHPicker ile çalışırken, bir görselin yüklenip yüklenemeyeceğini kontrol etmek için Apple'ın önerdiği yaklaşım, doğrudan `UIImage` sınıfını kontrol etmek yerine `kUTTypeImage` (veya eşdeğer iOS tanımlayıcısı) kullanmaktır. Bunun nedeni, `itemProvider`ın görseli henüz bellekte `UIImage` formatında olmayan ancak `UIImage`e dönüştürülebilir bir formatta tutuyor olabilmesidir.

Önerilen çözüm: `canLoadObjectOfClass(TUIImage.OCClass)` kullanmak yerine, standart görsel türüyle birlikte `hasItemConformingToTypeIdentifier` kullanmalıyız.

// iOSapi.UniformTypeIdentifiers veya iOSapi.MobileCoreServices birimini kullanın.
uses
 iOSapi.UniformTypeIdentifiers, iOSapi.Foundation;

// ... döngünüzün içinde:

if (ResultItem <> nil) and (ResultItem.itemProvider <> nil) then
begin
 // canLoadObjectOfClass yerine bir UTI (Uniform Type Identifier) kontrolü kullanın.
 if ResultItem.itemProvider.hasItemConformingToTypeIdentifier(UTTypeImage) then
   ResultItem.itemProvider.loadObjectOfClass(TUIImage.OCClass, LoadCompleted);
 // else ...
end;


Bunun sorununuzu neden çözmesi gerektiği:
Çalışma Zamanı Güvenliği: `hasItemConformingToTypeIdentifier`, bir öğenin dönüştürülebilir olduğundan emin olmak için kullanılan Apple'ın yerel (native) metodudur. Delphi'deki doğrudan `canLoadObjectOfClass` kontrolüne kıyasla çok daha sağlamdır ve bellek erişim ihlallerine yol açma ihtimali daha düşüktür.

Uyumluluk: `UTTypeImage`, PHPicker tarafından sağlanan tüm görsel türlerini kapsayan doğru sabittir (constant).

Önemli uygulama noktaları:
Bellek Yönetimi: İkinci denemenizde `Dump.Free` ekleyerek doğru olanı yaptınız. Bunu yapmaya devam edin.

Yürütme İş Parçacığı (Thread): `TThread.Synchronize` kullanma fikriniz doğru. `loadObjectOfClass` asenkrondur ve arka plan iş parçacığında çalışır. Ana iş parçacığı dışından Delphi görsel bileşenlerine (örneğin `FOwner.Resim_list`) erişmeye çalışmak, FMX'teki çökmelerin bir numaralı nedenidir.

Nil Kontrolleri: Mevcut nil kontrollerinizi koruyun; çünkü Delphi köprüsü (bridge) aracılığıyla iOS üzerindeki nesne yaşam döngüsü değişken olabilir.

NOT: Portekizceden Türkçeye çeviri için Google Translate kullanılmıştır.

Yerel Android Fotoğraf Seçici'yi (Photo Picker) kullanarak Android için hazırladığım bir örnek var; belki iOS konusunda size yardımcı olabilir.

Genel olarak Delphi hakkındaki kanalıma abone olmaktan ve videolarımı beğenmekten çekinmeyin. Mümkünse, lütfen diğer yazılımcı arkadaşlarınıza da tavsiye edin!

Using native PickerPhoto from Android
https://www.youtube.com/watch?v=6lp6xiUILAg

my Youtube channel:
"www.youtube.com/@emailx45"
Hocam cevabınız için çok teşekkür ederim.
  if ResultItem.itemProvider.hasItemConformingToTypeIdentifier(UTTypeImage) then
kodu bu şekil düzenlediğim zaman 
UTTypeImage
bu terimi ide görmedi bende o kısmı düzenledim aşağıdaki gibi :

      if ResultItem.itemProvider.hasItemConformingToTypeIdentifier( StrToNSStr('public.image') ) then
     begin
       ResultItem.itemProvider.loadObjectOfClass(TUIImage.OCClass, LoadCompleted );
     end;
ama bu seferde hocam resimleri şeçtikten sonra tamam butonuna bastığımızda hiç bir işlem gerçekleşmiyor ve o şekil ekran bekliyor ama uygulama bu sefer çökmedi.
Cevapla
#6
Symbol not found: kUTTypeImage
https://stackoverflow.com/questions/1014...ttypeimage

"Look up the symbol (kUTTypeImage) and locate the image/library it should exist in (MobileCoreServices.framework in this case). Then link your binary with that framework." ....

kullanım alanları

/ // Tekdüzen Tip Tanımlayıcılarına dayalı API'lar için (iOS 14+)

iOSapi.UniformTypeIdentifiers,

/ // Eski API'lar ve sabitler için (klasik UTI mekanizması)
iOSapi.MobileCoreServices;

Eğer amacınız sadece resimleri filtrelemek için standart Apple tanımlayıcısını iletmekse (örneğin, UIDocumentPickerViewController veya UIImagePickerController yapılandırırken), API köprüsünü içe aktarmadan doğrudan yerel iOS dizesini kullanabilirsiniz:
https://stackoverflow.com/questions/6431...monkey-app

UTTypeImage'e karşılık gelen metinsel değer 'public.image'dir. Bu dizeyi Delphi yapılarına ayıklamanız veya dönüştürmeniz gerekiyorsa, yerel yönteme bağlı olarak StringToGUID fonksiyonunu kullanarak dönüştürmeyi veya NSValue/NSString olarak ele almayı unutmayın.

https://blog.grijjy.com/2018/11/15/ios-a...th-delphi/
MSWindows, AndroidRAD Studio 13 Florence ve kafamda bir fikir  Tongue  
WWW
Cevapla
#7
(14-07-2026, Saat: 01:32)emailx45 Adlı Kullanıcıdan Alıntı: Symbol not found: kUTTypeImage
https://stackoverflow.com/questions/1014...ttypeimage

"Look up the symbol (kUTTypeImage) and locate the image/library it should exist in (MobileCoreServices.framework in this case). Then link your binary with that framework." ....

kullanım alanları

/ // Tekdüzen Tip Tanımlayıcılarına dayalı API'lar için (iOS 14+)

iOSapi.UniformTypeIdentifiers,

/ // Eski API'lar ve sabitler için (klasik UTI mekanizması)
iOSapi.MobileCoreServices;

Eğer amacınız sadece resimleri filtrelemek için standart Apple tanımlayıcısını iletmekse (örneğin, UIDocumentPickerViewController veya UIImagePickerController yapılandırırken), API köprüsünü içe aktarmadan doğrudan yerel iOS dizesini kullanabilirsiniz:
https://stackoverflow.com/questions/6431...monkey-app

UTTypeImage'e karşılık gelen metinsel değer 'public.image'dir. Bu dizeyi Delphi yapılarına ayıklamanız veya dönüştürmeniz gerekiyorsa, yerel yönteme bağlı olarak StringToGUID fonksiyonunu kullanarak dönüştürmeyi veya NSValue/NSString olarak ele almayı unutmayın.

https://blog.grijjy.com/2018/11/15/ios-a...th-delphi/

Hocam tekrar cevabınız için çok teşekkürler.

Hocam amacım galariden kullanıcının belirlediği resimleri alıp uygulama içindeki listview eklemek bunu uygulamamın android versiyonunda yapmaktayım. Uygulamamı ios sürüm çıkarmak istiyorum ama maalesef hala bu sorunu aşmış değilim. 

Son denemelerimde hocam önerdiğiniz gibi sorgu kısmına uyguladığımda sorgudaki problemi çözdüm ve sorunsuz sorguyu geçiyorum fakat asıl resimleri aldığımız kodda hata veriyor.

      if ResultItem.itemProvider.hasItemConformingToTypeIdentifier( StrToNSStr('public.image') ) then
     begin
     try
       // burada kalıyor !!!
       ResultItem.itemProvider.loadObjectOfClass( TUIImage.OCClass, LoadCompleted );

     except on e : Exception do
     begin
       FOwner.Bekleme_Durumu(False);
       FOwner.Bildirim_Mesaji(e.Message, True, False);
     end;

ResultItem.itemProvider.loadObjectOfClass( TUIImage.OCClass, LoadCompleted );

Burada hocam AV hatası (Access Violation) alıyorum. LoadComleted prosedürü içinden olduğunu sanmıyorum çünkü prosedürü komple comment yapsam dahi yinede av hatası almaya devam ediyorum. 

AI sorduğumda ise procedurenin cdecl; bu şekil başlaması gerektiğini derleme sorunu olduğunu söylüyor ama loadObjectOfClass içinde bu şekil derleme yapılamıyor IDE hatası veriyor. 

Maalesef hala sorunu çözemedim.
Cevapla
#8
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!

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;
Ö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ı:

procedure TForm1.Button1Click( Sender: TObject );
begin
if Assigned( Button1.OnClick ) then
Button1.OnClick( self ); // = Button1.Click
end;


Ek Dosyalar
.txt   Gemini - PhotoPicker of iOS sample.txt (Dosya Boyutu: 16,09 KB / İndirme Sayısı: 5)
MSWindows, AndroidRAD Studio 13 Florence ve kafamda bir fikir  Tongue  
WWW
Cevapla
#9
Merhabalar 
Kastri Files Selector veya ShareItems hatasız çalışıyor. ios'ta Kastri yüklemek için buradan bilgi alabilirsiniz
Cevapla
#10
(17-07-2026, Saat: 05:30)emozgun Adlı Kullanıcıdan Alıntı: Merhabalar 
Kastri Files Selector veya ShareItems hatasız çalışıyor. ios'ta Kastri yüklemek için buradan bilgi alabilirsiniz

Hocam cevabınız için teşekkürler. Fakat bu kullanıcı izni istiyor öyle değil mi ? 
Picker yöntemi kullanıcı izni gerektirmiyor android de ki gibi bunu yapabilirsem daha kullanışlı olacak ama olmaz sa Files Selector örneğindeki yöntemi deneyeceğim maalesef
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Google Play Billing Versiyon Sorunu[ÇÖZÜLDÜ] codder71 12 548 01-08-2026, Saat: 22:45
Son Yorum: codder71
  Android 16 Uygulama Ekran Taşma Sorunu[ÇÖZÜLDÜ] codder71 5 305 31-07-2026, Saat: 23:38
Son Yorum: mcuyan
  ios için uygulama derleme [ÇÖZÜLDÜ] codder71 29 2.416 01-07-2026, Saat: 14:39
Son Yorum: codder71
  Çözüldü _ Delphi Community Edition SDK ayarları hatası cinarbil 2 707 08-06-2026, Saat: 16:22
Son Yorum: emailx45
  Webbrowser Sorunu [ÇÖZÜLDÜ] codder71 7 708 10-02-2026, Saat: 17:04
Son Yorum: codder71



Konuyu Okuyanlar: 3 Ziyaretçi