![]() |
|
PHPickerDelegate Derleme Sorunu [ÇÖZÜLDÜ] - Baskı Önizleme +- Delphi Can (https://www.delphican.com) +-- Forum: Delphi (https://www.delphican.com/forumdisplay.php?fid=3) +--- Forum: Mobil Platform - FireMonkey (FMX) (https://www.delphican.com/forumdisplay.php?fid=7) +--- Konu Başlığı: PHPickerDelegate Derleme Sorunu [ÇÖZÜLDÜ] (/showthread.php?tid=8327) Sayfalar:
1
2
|
PHPickerDelegate Derleme Sorunu [ÇÖZÜLDÜ] - codder71 - 07-07-2026 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}
PHPickerDelegate Derleme Sorunu - emailx45 - 07-07-2026 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: Kod: procedure TPHPickerDelegate.LoadCompleted(Item: Pointer; Error: NSError); cdecl;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. Cvp: PHPickerDelegate Derleme Sorunu - codder71 - 08-07-2026 (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! 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. Cvp: PHPickerDelegate Derleme Sorunu - emailx45 - 08-07-2026 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. Kod: // iOSapi.UniformTypeIdentifiers veya iOSapi.MobileCoreServices birimini kullanın.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" Cvp: PHPickerDelegate Derleme Sorunu - codder71 - 13-07-2026 (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.Hocam cevabınız için çok teşekkür ederim. if ResultItem.itemProvider.hasItemConformingToTypeIdentifier(UTTypeImage) thenkodu bu şekil düzenlediğim zaman UTTypeImagebu 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.
PHPickerDelegate Derleme Sorunu - emailx45 - 14-07-2026 Symbol not found: kUTTypeImage https://stackoverflow.com/questions/10144961/symbol-not-found-kuttypeimage "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/64319497/exploring-ios-files-in-delphi-firemonkey-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-and-macos-app-extensions-with-delphi/ Cvp: PHPickerDelegate Derleme Sorunu - codder71 - 14-07-2026 (14-07-2026, Saat: 01:32)emailx45 Adlı Kullanıcıdan Alıntı: Symbol not found: kUTTypeImage 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. PHPickerDelegate Derleme Sorunu - emailx45 - 15-07-2026 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! Kod: implementationif (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: procedure TForm1.Button1Click( Sender: TObject );Cvp: PHPickerDelegate Derleme Sorunu - emozgun - 17-07-2026 Merhabalar Kastri Files Selector veya ShareItems hatasız çalışıyor. ios'ta Kastri yüklemek için buradan bilgi alabilirsiniz Cvp: PHPickerDelegate Derleme Sorunu - codder71 - 17-07-2026 (17-07-2026, Saat: 05:30)emozgun Adlı Kullanıcıdan Alıntı: Merhabalar 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 |