İ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
Bir diziye iki farklı record
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
- fatihtolgaata
- Üye
- Mesajlar: 382
- Kayıt: 04 Mar 2004 09:46
- Konum: K.çekmece / İstanbul
- İletişim:
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.
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.
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;
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;
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;
1. yol'da değer alıp vermek içinegedenizi 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..........
Kod: Tümünü seç
Tip1(arrayim[0]^).tip =1;
Tip1(arrayim[0]^).a =23;
x := Tip1(arrayim[0]^).a;
@akdatilla, bellek te ayrılan yer miktarı sabittir. Record'un olabilecek en büyük olasılığına göre yer ayrılıyordur.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