Çok Yakında Yeni Bir Arayüzle karşınızdayız! http://yeni.delphican.com/

Konuyu Oyla:
  • Derecelendirme: 5/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Record ve Dinamik diziler hakkında yardım
#1
Merhaba, birkaç gündür üzerinde düşündüğüm ve bu gün ufak tefek te olsa sonunda yazmaya başladığım bir proje parçacığım var. Standart JSon veri döndüren bir sistemden gelen tablo bilgilerini ve içeriklerini memorytable kullanmadan record şeklinde tutmaya çalışıyorum. Aslında kodu yazdım zaten ama sormak istediğim bir şey var.
Record örneği aşağıdadır.
type
 TTabloRecs = array of record
    TId    : Integer;
    TValue : String;
 end;
 
type
 TTabloFields = array of record
    TId   : Integer;
    TName : String;
    TType : Smallint;
    TSize : Integer;
    TValues : TTabloRecs;
 end;
Şu an bu şekilde sorunsuz verileri alıp doldurabiliyorum. Öğrenmek istediğim şudur, Çalışma anında TTabloRecs kısmında TValue tipini TTabloFields deki TType kısmına göre Integer, String, Date, Double vs.vs. gibi değişik tiplerde oluşturabilirmiyim? Veya Variant olarak belirleyip tipine göre işlem yapmam daha mı uygun olur?
WWW
Cevapla
#2
Tam olarak istediğinizi karşılar mı bilmiyorum ama TTabloFields'ın TType'ının alacağı değerler sınırlı ise "Variant Records" şeklinde ifade edilen yapı işinizi görebilir:
TTabloRecInt = array of record
   TId    : Integer;
   TValue : Integer;
 end;

 TTabloRecString = array of record
   TId    : Integer;
   TValue : String
 end;

 TTabloRecDate = array of record
   TId    : Integer;
   TValue : TDate;
 end;

 TTabloFields = array of record
   TId   : Integer;
   TName : String;
   TSize : Integer;
   case TType: Smallint of
      0: (TIntValues: TTabloRecInt);
      1: (TStrValues: TTabloRecString);
      2: (TDateValues: TTabloRecDate);
 end;

Not: soruyu yanlış anlamış da olabilirim Sad
There's no place like 127.0.0.1
WWW
Cevapla
#3
Doğru anlamışsınız hocam, bunu bende düşünmüştüm ama yazmak mı zor geldi nedendir test etmemiştim sizde yazdığınıza göre bi uygulamaya çalışayım bakalım bu gece vakit olursa, umarım işe yarar. TType zaten Fieldtype olarak geliyor bilinen tipler yani.
WWW
Cevapla
#4
Bende yanlış anlamadıysam C deki bağlı liste gibi verileri Ramde tutmak istiyorsunuz. Struct=record. Eğer öyleyse bildiğim kadarıyla pointer kaçınılmaz son
Cevapla
#5
Bu akşam biraz baktım, @SimaWB hocam, aklıma bişi geldi yazdığınızı o yüzden denemedim. Daha önce bu tip konular konuşulmuştu forumda, bende en güzeli öyle yapmak dedim ve aşağıdaki kod çıktı ortaya.Şimdilik bu haliyle işimi fazlası ile görecek gibi.

type
  TTabloRecs = array of record
    TId    : Integer;
    TValue : Variant;
 end;

Function VarToStr(const Value: Variant): string;
begin
      case VarType(Value) of
        varInteger  :  Result := IntToStr(Value) ;
        varString   :  Result := Value ;
        varCurrency :  Result := FormatFloat('#,##0.#0',Value) ;
        varDate     :  Result := datetostr(Value) ;
      end;
end;

Kısaca variant olarak alıp, istediğimiz formata çevirebiliriz.
WWW
Cevapla
#6
(14-05-2018, Saat: 17:25)esistem Adlı Kullanıcıdan Alıntı: Merhaba, birkaç gündür üzerinde düşündüğüm ve bu gün ufak tefek te olsa sonunda yazmaya başladığım bir proje parçacığım var. Standart JSon veri döndüren bir sistemden gelen tablo bilgilerini ve içeriklerini memorytable kullanmadan record şeklinde tutmaya çalışıyorum. Aslında kodu yazdım zaten ama sormak istediğim bir şey var.
Record örneği aşağıdadır.
type
 TTabloRecs = array of record
    TId    : Integer;
    TValue : String;
 end;
 
type
 TTabloFields = array of record
    TId   : Integer;
    TName : String;
    TType : Smallint;
    TSize : Integer;
    TValues : TTabloRecs;
 end;
Şu an bu şekilde sorunsuz verileri alıp doldurabiliyorum. Öğrenmek istediğim şudur, Çalışma anında TTabloRecs kısmında TValue tipini TTabloFields deki TType kısmına göre Integer, String, Date, Double vs.vs. gibi değişik tiplerde oluşturabilirmiyim? Veya Variant olarak belirleyip tipine göre işlem yapmam daha mı uygun olur?

Merhaba,
JSON olarak gelen veri TJSONArray tipinde olduğundan, kendisi bir nevi Dataset yapısındadır. 
JSON sunucudan gelen veriyi çözümleyip, dataset benzeri bir dizi yapıya refere etmeniz, TJSonArray'ı işlemenize göre hem hız kaybına sebebiyet verecek hemde kod satırlarınızın artmasına sebep olacaktır.
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
Cevapla
#7
Fesih hocam gelen veri boyutu çok büyük değil, ayrıca program tarafında kesinlikle db ile ilgili bişi kullanmıyorum, mecburen kendim çözüm üretmem gerekiyor. Record a atıp ordan stringgrid e aktarmak çok kolay oldu. Şimdilik bu yolda ilerliycem bakalım ne göstericek durum.
WWW
Cevapla
#8
Bu gün işi biraz daha kolaylaştırdım.

type
 TTabloFields = array of record
    TId   : Integer;
    TName : String;
    TType : Smallint;
    TSize : Integer;
    TValues : TStringList;
 end;

Değerleri StringList olarak dolduruyorum, böylece, StringGrid1.Cols[x]:=Tablo[x].TValues; şeklinde kolonları direk doldurabiliyoruz.
WWW
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  array of record Sıralama yhackup 2 255 27-12-2019, Saat: 16:43
Son Yorum: yhackup
  Delphi ve PHP arasında Encrypt/Decrypt İşlemi - Yardım mad85 15 3.050 23-12-2019, Saat: 13:00
Son Yorum: Halil Han Badem
  TBX Component Yardım glagher 6 382 04-12-2019, Saat: 21:13
Son Yorum: wiseman
  Record Temizleme Hayati 9 606 24-10-2019, Saat: 09:40
Son Yorum: uparlayan
  başlangıç için yardım kazimtabakli 5 375 22-10-2019, Saat: 14:51
Son Yorum: uparlayan



Konuyu Okuyanlar: 1 Ziyaretçi