selam arkadaşlar,
Bir packed recordun boş olup olmadığını nasıl anlayabiliriz?
Bir packed recordun boş olup olmadığını nasıl anlayabiliriz?
Record IsEmpty?
|
selam arkadaşlar,
Bir packed recordun boş olup olmadığını nasıl anlayabiliriz?
23-04-2021, Saat: 17:06
Bu packed record (packed olması bir dosya structure izlenmi oluşturdu bende) bir binary dosyadan çekiliyor gibi mi ? Nerede dolduruluyor ? Oradan yola çıkmakta fayda var.
Saygılarımla
Muharrem ARMAN
24-04-2021, Saat: 13:24
yok hocam düz packet recordum var basit sade, bunun elemanlarına tek tek bakmadan recordun tamamının boş olup olmadığını anlamak istiyorum olay bu aslında
24-04-2021, Saat: 15:25
Basit ilerleyin.
* Kaynak projeniz aracılığıyla dinamik olarak dolduruluyorsa, sizin kontrolünüzde olacak şekilde Record Type içerisine bir tane fazladan değişken ekleyin, boolean tipinde olsun. * Değer aktarılan yerde bu eklediğiniz ekstra boolean değişkeni de TRUE yapın. * İleride lazım olduğunda sadece bunu TRUE/FALSE kontrol edin. * Böylece içeriği boş olması durumunda dahi bu TRUE değeri görmüşseniz, kullanıcı bir değer atadı ancak içini doldurmadı şeklinde yorumlama hakkınız da olur. Aksi halde içi boş ise değer yoktur der, belki de boş olması da bir değer ise bunu kaçırmış olursunuz.
Saygılarımla
Muharrem ARMAN
24-04-2021, Saat: 16:18
hocam ihtiyacım olan şey bu değil. Ben packed recordun içi boş mu dolu mu elemanlarına tek tek bakmadan anlamak istiyorum. olmazsa RTTI ile bir şeyler yapmam gerekecek, ki o da aslında yavaş bir yöntem
Sizi anlıyorum. Record structure içerisinde dahili başka type barındırıp barındırmadığı vb. konuları da işin içinde olunca, çözümünüzü de merakla bekliyorum.
Örnek : Type tAType = Packed Record aField, bField: array [0..254] of Char; End; Type tBType = Packed Record aField, bField: integer; End; Type tCType = Packed Record aField, bField: boolean; End; Type tMyType = Packed Record IsFull: boolean; aField: tAType; bField: tBType; cField: tCType; end; Burada tMyType tipindeki değişken boş mu dolu mu ? Bunun için ilk mesajımda belirmeye çalıştım içerik kaynak kim tarafından dolduruluyor diye...Yoksa size bildirdiğim metod ile (bir tane fazladan boolean değişken) bir kerede en az bir değer ataması olduğu anlaşılabilir çünkü.
Saygılarımla
Muharrem ARMAN
24-04-2021, Saat: 17:47
Eğer kullandığınız Delphi sürümü 10.4 .X ise bence aradığınız şey Custom Managed Records, örnekte de göreceğiniz gibi initialize and finalize operatörlerini kullanarak record'un boş olup olmadığını oluşturulup(create) oluşturulmadığını yada silindiğini takip edebilirsiniz. Ama bu özelliği 10.4 sürümleri destekliyor o yüzden benim deneme şansım olmadı, dener ve sonuçlarını yazarsanız, ben ve benim gibi alt sürümleri kullananlar da deneyimleme açısından fikir sahibi olur.
Herhangi bir basit problem, hakkında yeterince toplantı yapılarak, çözümsüz hale getirilebilir.
https://play.google.com/store/apps/developer?id=ONGUN
@savasabd önerin isabetli.
* Adamlar benzer bir kaygı ile tanımlı record'a iki tane event koyma opsiyonu getirmişler. * Verdiğim örnek tip tanımında en tepeye bir tane tane "IsFull" boolean değişkeni koydum ya, Managed Records sisteminde ona ve/veya benzeri bir value değere initialization aşamasında otomatik değer atayıp finalization aşamasında o değeri yok ediyorlar. * Ben de bunu simüle etmeyi öneriyorum. Record dolduruma amasında bu değeri TRUE yapmak ile aynı şey. Delphi versiyonu ne olursa olsun iş görür. Type tAType = Packed Record aField, bField: array [0..254] of Char; End; Type tBType = Packed Record aField, bField: integer; End; Type tCType = Packed Record aField, bField: boolean; End; Type tMyType = Packed Record IsFull: boolean; aField: tAType; bField: tBType; cField: tCType; end; procedure TForm1.BitBtn1Click(Sender: TObject); var LType : tMyType; LFile : File of tMyType; LFileName : String; begin LType := default( tMyType ); LFileName := ExtractfilePath(ParamStr(0)) + 'data.bin'; // Dosyaya yazma kısmı.... //{ LType.IsFull := True; LType.aField.aField := 'DelphiCan'; LType.aField.bField := 'En iyi Türkçe delphi sitesi'; LType.bField.aField := 12345; LType.bField.bField := 67890; LType.cField.aField := true; LType.cField.bField := false; AssignFile(LFile, LFileName); try Rewrite(LFile); Write( LFile, LType ); finally CloseFile(LFile); end; //} // Dosyadan okuma kısmı.... //{ LType := default( tMyType ); If FileExists(LFileName) then try AssignFile(LFile, LFileName); Reset(LFile); Read( LFile, LType ); if LType.IsFull then Showmessagefmt( '%s', [ String(LType.aField.aField) + ' ' + String(LType.aField.bField) ] ) else Showmessage('Empty'); finally CloseFile(LFile); end; //} end;
Saygılarımla
Muharrem ARMAN
24-04-2021, Saat: 19:10
@civata siz belirtmediniz ama ben söylemiş olayım; Delphi'de Nullable tipler yok, dolayısıyla sayısal veri tiplerine de null atanamayacağına göre 0 değeri, burada problem oluşturan asıl durumdur. Eğer "PACKED" recordunuzun elemanlarında "0" değerini kabul ediyorsanız bunun bir çözümü olabilir.
Bir değişkeni kullanmaya başlamadan önce biliyorsunuz değişkeninize bellekte bir adres atanıyor. Çoğu durumda o adreste çöp veriler bulunur. Bazı veri tipleri için Delphi, değişkeninizi kullanmaya "başlamadan önce" (ilk kullandığınız anda) temizlik yapar ve size bu durumu yansıtmaz. Ama bazı durumlarda bunun aşılabildiği zamanlar olabiliyor. Bu örnekte de böyle bir durum var açıkçası. O nedenle bu durumu da ayrıca yönetmeniz gerekir. Çözüm aslında karmaşık bir şekilde çok basit. Madem PACKED recordunuzun tüm elemanlarını gezmeden PACKED recordun boş olup olmadığını anlamak istiyorsunuz, o zaman tipin varsayılan değerlere eşit olup olmadığına bakarak bunu anlayabilirsiniz. Bunun ( en azından benim bildiğim kadarıyla ) yolu bellekteki görüntülerini kıyaslamaktır. Bu yöntem, bir recordun iki farklı değişken ile temsil edildiği durumlarda içeriğinin aynı olup olmadığını kesinlikle ve net olarak göstermez. Ama içeriğin boş olup olmadığını anlamanıza yardım eder. Örnek üzerinden devam edelim; unit Ana_; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls; type TKimlik = PACKED record private FTCNO : Integer; FAd : String; FSoyad : String; FDogumTarihi : TDateTime; public property TCNo : Integer read FTCNO write FTCNO; property Ad : String read FAd write FAd; property Soyad : String read FSoyad write FSoyad; property DogumTarihi : TDateTime read FDogumTarihi write FDogumTarihi; end; TKisi = PACKED record private FFalan: Boolean; function GetAdSoyad: String; public Kimlik : TKimlik; public function IsEmpty: Boolean; procedure Clear; property AdSoyad : String read GetAdSoyad; property Falan : Boolean read FFalan write FFalan; end; TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } procedure Test; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin test; end; procedure TForm1.Test; var STR : String; Teneke: TKisi; // Bu noktada değişkenizi tanımladık ve bellekte bir adrese sahip oldu. begin // henüz tenekeyi kullanmadık, dolayısıyla Teneke içinde çöp halinde işlemcinin başka prosesler veya işlemler için bıraktığı // çöp halinde veriler var. // Bu esnada tenekenin içine bakarsak dolu olduğunu görürüz. ///////////////////////// if (Teneke.IsEmpty = True) then ShowMessage('1 - Teneke boş.') else ShowMessage('1 - Teneke DOLU!'); // Şimdi tenekeyi boşaltalım. "default(TKisi)" değeri, tüm arabirimlerin değerinin nil olduğu, tüm dizilerin nil olduğu // tüm atomik sayısal değerlerin 0 olduğu, tüm referansların nil olduğu bir değer oluşturur. // Bu PACKED record için mutlak boş içeriğe sahip olma durumudur. Teneke.Clear; if (Teneke.IsEmpty = True) then ShowMessage('2 - Teneke boş.') else ShowMessage('2 - Teneke DOLU!'); Teneke.Kimlik.Ad:= 'Abuzer'; //Teneke.Kimlik.TCNo:= 12345678901; if (Teneke.IsEmpty = True) then ShowMessage('3 - Teneke boş.') else ShowMessage('3 - Teneke DOLU!'); Teneke.Kimlik.Ad:= ''; //Teneke.Kimlik.TCNo:= 0; // Bu haldeyken RECORD aslında boş olarak kabul edilecektir. if (Teneke.IsEmpty = True) then ShowMessage('4 - Teneke boş.') else ShowMessage('4 - Teneke DOLU!'); end; { TKisi } procedure TKisi.Clear; begin Self := Default(TKisi); // Bu atama sırasında tüm interfaceler, diziler, referanslar NIL olur, atomik sayısal tipler minimuma çekilir. // Boolean veri tipi FALSE olarak ayarlanır dolayısıyla bu noktada SELF ile ifade ettiğimiz değişkenin içi aslında artık boştur. end; function TKisi.GetAdSoyad: String; begin Result := (Kimlik.Ad + ' ' + Kimlik.Soyad).Trim; end; function TKisi.IsEmpty: Boolean; var Bos_Record: TKisi; begin Bos_Record.Clear; // Kıyaslayabilmek için boş bir kopya oluşturuyoruz. Result := CompareMem(@Self, @Bos_Record, SizeOf(TKisi)); // İki bellek adresindeki verilere bakıyoruz, fark varsa zaten TRUE dönecek. end; end.
YouTube Delphi Tips
"Yaşlanarak değil, yaşayarak tecrübe kazanılır. Zaman insanları değil, armutları olgunlaştırır" Peyami Safa
25-04-2021, Saat: 15:44
(24-04-2021, Saat: 17:47)savasabd Adlı Kullanıcıdan Alıntı: Eğer kullandığınız Delphi sürümü 10.4 .X ise bence aradığınız şey Custom Managed Records, örnekte de göreceğiniz gibi initialize and finalize operatörlerini kullanarak record'un boş olup olmadığını oluşturulup(create) oluşturulmadığını yada silindiğini takip edebilirsiniz. Ama bu özelliği 10.4 sürümleri destekliyor o yüzden benim deneme şansım olmadı, dener ve sonuçlarını yazarsanız, ben ve benim gibi alt sürümleri kullananlar da deneyimleme açısından fikir sahibi olur. @savasabd 10.3 kullanıyorum (24-04-2021, Saat: 17:57)mrmarman Adlı Kullanıcıdan Alıntı: @savasabd önerin isabetli. @mrmarman hocam iyi niyetinizi anlıyorum ama bu ısrarınız benim sorunumu çözmüyor yinede eyvallah (24-04-2021, Saat: 19:10)uparlayan Adlı Kullanıcıdan Alıntı: @civata siz belirtmediniz ama ben söylemiş olayım; Delphi'de Nullable tipler yok, dolayısıyla sayısal veri tiplerine de null atanamayacağına göre 0 değeri, burada problem oluşturan asıl durumdur. Eğer "PACKED" recordunuzun elemanlarında "0" değerini kabul ediyorsanız bunun bir çözümü olabilir. @uparlayan hocam, aslında hiç detay vermedim ama sizden kaçmamış. aynı soruyu stackoverflow sitesinde de sorduydum cevabınız oradakine çok benziyor nullable mevzusunu düşünmemiştim. sorunu sizin yöntemle çözdüm eyvallah hocam |
« Önceki Konu | Sonraki Konu »
|
Konu ile Alakalı Benzer Konular | |||||
Konular | Yazar | Yorumlar | Okunma | Son Yorum | |
Tanımladığım record içindeki alanlardan biri ile ilgili sorun | Bay_Y | 2 | 566 |
07-03-2023, Saat: 12:03 Son Yorum: Bay_Y |
|
Record direk kullanmakmı, pointera çevirmek mi ? | seci20 | 8 | 2.243 |
17-10-2021, Saat: 13:20 Son Yorum: seci20 |
|
Json Veriyi Record Tipe Deserializede eksik değerlerin Null yapılabilmesi | LastCoder | 3 | 1.132 |
28-08-2021, Saat: 01:26 Son Yorum: LastCoder |
|
array of record Sıralama | yhackup | 2 | 2.057 |
27-12-2019, Saat: 16:43 Son Yorum: yhackup |
|
Record Temizleme | Hayati | 9 | 5.262 |
24-10-2019, Saat: 09:40 Son Yorum: uparlayan |