Yorumları: 902
Konuları: 68
Kayıt Tarihi: 30-06-2017
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 8.392 Üstad
Merhaba,
İki değişkenim (A ve B) ve bir class'ım (X) var. Bunlardan birisini (A'yı) çalıştırıp içini dolduruyorum. Diğerini (B'yi) ise A'dan birebir kopyalamak istiyorum. Bilinen bir yol yöntem var mı, Bunu nasıl yapabilirim?
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
Yorumları: 858
Konuları: 35
Kayıt Tarihi: 12-08-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 3.731 Uzman
(12-09-2018, Saat: 10:59)uparlayan Adlı Kullanıcıdan Alıntı: Merhaba,
İki değişkenim (A ve B) ve bir class'ım (X) var. Bunlardan birisini (A'yı) çalıştırıp içini dolduruyorum. Diğerini (B'yi) ise A'dan birebir kopyalamak istiyorum. Bilinen bir yol yöntem var mı, Bunu nasıl yapabilirim?
Create Edip, B:=A; demeniz yeterli değilmi? Yada
var
a,b:TXXClass;
begin
a:=TXXClass.Create;
b:=a.Create;
a.DegerA:='Njt';
a.DegerB:='Tajen';
bu şekilde olmuyormu?
Yorumları: 902
Konuları: 68
Kayıt Tarihi: 30-06-2017
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 8.392 Üstad
12-09-2018, Saat: 12:22
(Son Düzenleme: 12-09-2018, Saat: 12:23, Düzenleyen: uparlayan.)
Yok, olmuyor üstad. Şöyle bir örnek vereyim;
program Project1;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils;
type
TNesne = class
private
FAd : String;
FSoyad : String;
protected
public
property Ad : String read FAd write FAd;
property Soyad : String read FSoyad write FSoyad;
end;
var
A, B: TNesne;
begin
A := TNesne.Create;
A.Ad := 'Uğur';
A.Soyad := 'Parlayan';
Writeln(' A = ' + A.Ad + ' ' + A.Soyad); // Mevcut değeri okuduk
B := A; // Atamayı yaptık
B.Ad := 'Berkan'; // Yeni değeri diğerine girdik
Writeln(' B = ' + B.Ad + ' ' + B.Soyad); // Yeni değeri diğerinden okuduk
Writeln(' A = ' + A.Ad + ' ' + A.Soyad); // Bu noktada A'nın Uğur PARLAYAN" sonucunu vermesi gerekiyor.
Readln;
end.
C#'da "MemberWiseClone" diye bir yöntem var, delphi'de karşılığını bulamadım.
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
Yorumları: 858
Konuları: 35
Kayıt Tarihi: 12-08-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 3.731 Uzman
Aşağıdaki şekilde sorun çıkarmadan çalıştı hocam, bi deneyin isterseniz.
type
TNjtClass = class(tpersistent)
private
FDegerA : String ;
FDegerB : String ;
published
property DegerA: String read FDegerA write FDegerA ;
property DegerB: String read FDegerB write FDegerB ;
end;
procedure CopyObject(Source, Dest: TNjtClass);
var
TypInfo: PTypeInfo;
PropList: TPropList;
PropCount, i: integer;
Value: variant;
begin
TypInfo := Source.ClassInfo;
PropCount := GetPropList(TypInfo, tkAny, @PropList);
for i := 0 to PropCount - 1 do
begin
Value := GetPropValue (Source, PropList [i]^.Name);
SetPropValue (Dest, PropList [i]^.Name, Value);
end;
end;
procedure TForm2.Button1Click(Sender: TObject);
var
a,b:TNjtClass;
begin
a:=TNjtClass.Create;
b:=TNjtClass.Create;
a.DegerA:='Njt';
a.DegerB:='Tajen';
memo1.Lines.Add(a.DegerA+' - '+a.DegerB);
CopyObject(a,b);
b.DegerA:=b.DegerA+'111';
b.DegerB:=b.DegerB+'111';
memo1.Lines.Add(b.DegerA+' - '+b.DegerB);
memo1.Lines.Add(a.DegerA+' - '+a.DegerB);
end;
Yorumları: 902
Konuları: 68
Kayıt Tarihi: 30-06-2017
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 8.392 Üstad
12-09-2018, Saat: 13:32
(Son Düzenleme: 12-09-2018, Saat: 13:38, Düzenleyen: uparlayan.
Sebep: Örneklerde düzeltme yapıldı.
)
Üstad, Tokyo ile denemelerimi yaptığımda B'nin A'dan gelen değerleri saklamadığını gördüm, bir yandan da araştırmaya devam ediyordum JSON kullanarak sonuca ulaştım;
C#'daki MemberWiseClone metodunu Delphi'ye uyarladım ve sorunumu çözdüm, ilgin ve yardımın için teşekkür ederim.
implementation
uses
System.JSON
, Data.DBXJSONReflect
, System.SysUtils
;
function MemberWiseClone(aNesne: TObject): TObject;
var
TEMP : TJSONValue; // Bu bizim ara nesnemiz, kopyalamak için kullanacağız
Donusturucu : TJSONMarshal; // Bu bizim parametreyle gelen nesnemizin elemanlarını tarayacak
Klon : TJSONUnMarshal; // Bu da bizim sonuç nesnemiz olacak.
begin
Result := nil;
Klon := TJSONUnMarshal.Create; // Bu nesnenin içini dolduracağız
Donusturucu := TJSONMarshal.Create; // Bu, bizim asıl nesnemizi temsil eden ön işleyicili başka bir nesne
try
TEMP := Donusturucu.Marshal( aNesne ); // Nesnemizi JSON verisi haline dönüştürüyoruz
try
if Assigned(TEMP) then Result := Klon.Unmarshal(TEMP); // JSON verisini bir nesneye dönüştürüyoruz
finally
FreeAndNil(TEMP);
end;
finally
FreeAndNil(Donusturucu);
FreeAndNil(Klon);
end;
end;
Şu şekilde kullanıyorum;
var
A, B: TNesne;
begin
A := TNesne.Create;
A.Ad := 'Uğur';
A.Soyad := 'Parlayan';
Writeln(' A = ' + A.Ad + ' ' + A.Soyad); // Mevcut değeri okuduk
B := TNesne( MemberWiseClone( A ) );
// B := A; // BU SATIR İPTAL
B.Ad := 'Berkan'; // Yeni değeri diğerine girdik
Writeln(' B = ' + B.Ad + ' ' + B.Soyad); // Yeni değeri diğerinden okuduk
Writeln(' A = ' + A.Ad + ' ' + A.Soyad); // Bu noktada A'nın Uğur PARLAYAN" sonucunu vermesi gerekiyor.
Readln;
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
Yorumları: 858
Konuları: 35
Kayıt Tarihi: 12-08-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 3.731 Uzman
12-09-2018, Saat: 13:56
(Son Düzenleme: 12-09-2018, Saat: 13:57, Düzenleyen: esistem.)
Yazdığım şekilde Community Tokyo da sorunsuz çalışıyor hocam.
Uses TypInfo çağırdınızmı dicem ama gereksiz olucak.
Ayrıca class(tpersistent) olmasıda gerekiyor ama oda olmalı zaten sizde.
Yorumları: 902
Konuları: 68
Kayıt Tarihi: 30-06-2017
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 8.392 Üstad
12-09-2018, Saat: 14:12
(Son Düzenleme: 12-09-2018, Saat: 14:12, Düzenleyen: uparlayan.)
(12-09-2018, Saat: 13:56)esistem Adlı Kullanıcıdan Alıntı: Yazdığım şekilde Community Tokyo da sorunsuz çalışıyor hocam.
Uses TypInfo çağırdınızmı dicem ama gereksiz olucak.
Ayrıca class(tpersistent) olmasıda gerekiyor ama oda olmalı zaten sizde.
Pardon, sıfırdan tekrar denediğimde sonuç aldım, hata için özür dilerim. En azından alternatif üretmiş olduk
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
Yorumları: 1.571
Konuları: 88
Kayıt Tarihi: 09-08-2016
Rep Puanı: 13.829 Üstad
12-09-2018, Saat: 16:48
(Son Düzenleme: 12-09-2018, Saat: 16:49, Düzenleyen: SimaWB.)
Bence class'a Copy yada Clone fonksiyonu yazmak daha güzel olur. Yada class yerine record kullanmak.
Yukarıda verilen örnek için söylüyorum; tek yapılması gereken
TNesne = class yerine TNesne = record yazmak.
There's no place like 127.0.0.1
Yorumları: 902
Konuları: 68
Kayıt Tarihi: 30-06-2017
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 8.392 Üstad
(12-09-2018, Saat: 16:48)SimaWB Adlı Kullanıcıdan Alıntı: Bence class'a Copy yada Clone fonksiyonu yazmak daha güzel olur. Yada class yerine record kullanmak.
Yukarıda verilen örnek için söylüyorum; tek yapılması gereken
TNesne = class yerine TNesne = record yazmak.
Bir makaleye altyapı olsun diye sorulan bir soruydu ve verilen örnek soruyu basitleştirmek için o şekilde kurgulanmıştı.
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
Yorumları: 1.571
Konuları: 88
Kayıt Tarihi: 09-08-2016
Rep Puanı: 13.829 Üstad
O zaman sabırsızlıkla makaleyi bekliyoruz
There's no place like 127.0.0.1
|