Bir diziye iki farklı record

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
egedenizi
Üye
Mesajlar: 38
Kayıt: 25 May 2005 02:01

Bir diziye iki farklı record

Mesaj gönderen egedenizi »

İyi gunler.
Bir diziye iki farklı record eklenebilirmi?

örneğin

a=record
kayit1:integer
end;

b=record
kayitharf:string;
kayitno:integer;
end;

c:array[1..2] of ....

c[1]:=a;c[2]:=b gibi
Kullanıcı avatarı
fatihtolgaata
Üye
Mesajlar: 382
Kayıt: 04 Mar 2004 09:46
Konum: K.çekmece / İstanbul
İletişim:

Mesaj gönderen fatihtolgaata »

.Net olsaydı bir şeyler düşünürdük ama Win32'de bunu doğrudan yapmak için array yerine TList kullanmalısın. Ya da record yerine class kullanmalısın.

vesselam.
Kullanıcı avatarı
undefined
Moderator
Mesajlar: 565
Kayıt: 06 Eki 2003 12:01
Konum: Bursa
İletişim:

Mesaj gönderen undefined »

1. yol :
Array'da recordların pointerlarını tutarsın,
her recordun ilk kaydını recordun tipini gösterecek şekilde byte tipinde ayarlarsın. Ve tipini anlamak için array kaydını deference edip, byte a cast ederek record tipini alaiblirsin. Ufak bir örnek hazırladım. Metodu tam test etmedim ama umarım işe yarar. Sen değerler verip test edersen iyi olur.

Kod: Tümünü seç

type
 Ptip1 = ^tip1;
 tip1 = record
   tip:byte;
   a:integer;
   x:string;
 end;

 Ptip2 = ^tip2;
 tip2 =  record
   tip:byte;
   x:string;
   a,b,c:string;
 end;

procedure TfrmAna.Button5Click(Sender: TObject);
var
  arrayim:array [0..1] of pointer;
  I: Integer;
begin

  arrayim[0] := new(Ptip1);
  byte(arrayim[0]^) := 1;

  arrayim[1] := new(Ptip2);
  byte(arrayim[1]^) := 2;

  for I := low(arrayim) to high(arrayim) do
  begin
    case byte(arrayim[i]^)   of
      1: showmessage('tip1');
      2: showmessage('tip2');
    end;
  end;
  dispose(Ptip1(arrayim[0]));
  dispose(Ptip2(arrayim[1]));
end;

2. Yol : Eğer kayıtların mantığı uygunsa, variant bölümlü record kullanabilirsin.

Bu konuda helpte örnek var direk yapıştırıyorum.

Kod: Tümünü seç

type
  TPerson = record
    FirstName, LastName: string[40];
    BirthDate: TDate;
    case Citizen: Boolean of
        True: (Birthplace: string[40]);
        False: (Country: string[20];
                EntryPort: string[20];
                EntryDate, ExitDate: TDate);
  end;
akdatilla
Üye
Mesajlar: 292
Kayıt: 02 Nis 2006 06:04
Konum: Antalya

Mesaj gönderen akdatilla »

S.A.
Abi şu ikinci yol varya. Hakikaten süper bir özellik bence.
yaklaşık 8 yıldır delphi kullanıyorum. Bu kadar önemli bir özelliği senin sayende öğrendim. Böyle bir tanımlama olacağını tahmin bile etmezdim. Demek değişkenin durumuna göre bellekde yer ayırıyor!

Allah razı olsun.
egedenizi
Üye
Mesajlar: 38
Kayıt: 25 May 2005 02:01

Mesaj gönderen egedenizi »

Yardımlarınız için çok teşekkür ederim.
1.yolu denedim programda hata yok fakat benim pointerlerla fazla bilgim olmadiği için deger alıp veremedim.
2.yol için akdatilla arkadaşım yaptığın uygulamayı yapıştırırmısın?Mantığı anlamak açısından.
ÇOK TEŞEKKÜRLER..........
akdatilla
Üye
Mesajlar: 292
Kayıt: 02 Nis 2006 06:04
Konum: Antalya

Mesaj gönderen akdatilla »

Kod: Tümünü seç

type
  ktype=(atipi,btipi);
  ctipi=record case ktype of
      atipi:(kayit1:integer);
      btipi:(kayitharf:string[5];
             kayitno:integer;
      );
end;

procedure TForm1.Button2Click(Sender: TObject);
Var
   c:Array [1..2] of ctipi;
begin
     c[1].kayit1:=5;
     c[2].kayitharf:='5';
     c[2].kayitno:=1;
end;
Kullanıcı avatarı
undefined
Moderator
Mesajlar: 565
Kayıt: 06 Eki 2003 12:01
Konum: Bursa
İletişim:

Mesaj gönderen undefined »

egedenizi yazdı:Yardımlarınız için çok teşekkür ederim.
1.yolu denedim programda hata yok fakat benim pointerlerla fazla bilgim olmadiği için deger alıp veremedim.
2.yol için akdatilla arkadaşım yaptığın uygulamayı yapıştırırmısın?Mantığı anlamak açısından.
ÇOK TEŞEKKÜRLER..........
1. yol'da değer alıp vermek için

Kod: Tümünü seç

Tip1(arrayim[0]^).tip =1;
Tip1(arrayim[0]^).a =23;
x := Tip1(arrayim[0]^).a;
gibi bir kullanıım yapman lazım.
egedenizi yazdı:S.A.
Abi şu ikinci yol varya. Hakikaten süper bir özellik bence.
yaklaşık 8 yıldır delphi kullanıyorum. Bu kadar önemli bir özelliği senin sayende öğrendim. Böyle bir tanımlama olacağını tahmin bile etmezdim. Demek değişkenin durumuna göre bellekde yer ayırıyor!

Allah razı olsun
@akdatilla, bellek te ayrılan yer miktarı sabittir. Record'un olabilecek en büyük olasılığına göre yer ayrılıyordur.
Cevapla