bir nesneyi bir formdan diğer forma nasıl kopyalayabilirim?

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
kahraman1285
Üye
Mesajlar: 360
Kayıt: 10 Nis 2006 09:07

bir nesneyi bir formdan diğer forma nasıl kopyalayabilirim?

Mesaj gönderen kahraman1285 »

Mrb.

Run time da bir nesneyi bir formdan diğer forma nasıl kopyalayabilirim.

amacım Devexpress'in cxeditrepository ve cxeditstylecontrol nesnelerini bir formdan diğerine taşımak.

Konu hakkında fikri olan var mı acaba?
Kullanıcı avatarı
huseyinkucuk
Üye
Mesajlar: 142
Kayıt: 29 Nis 2005 10:03
Konum: İstanbul
İletişim:

Mesaj gönderen huseyinkucuk »

hocam, dediğin componentleri bilmiyorum ama shape nesnesinde şu örneği yaptım az önce; mouse ile taşıdığınız zaman istediğiniz yerde bir adet kopyasını buluyorsunuz...
form1 ve form2miz var...
form1 e bir tane TShape nesnesi koydum
DragKind özelliğini DkDock yaptım...
Form1 ve Form2 nin DockSite özelliğini de true yaptım...
sonra da OnStartDock özelliğine şunları yazdım

Kod: Tümünü seç

procedure TForm1.Shape1StartDock(Sender: TObject;
  var DragObject: TDragDockObject);
var
  BenimShape:TShape;
begin
  BenimShape:=TShape.Create((sender as TShape).Owner);
  BenimShape.Left:=(sender as TShape).Left;
  BenimShape.Top:=(sender as tshape).Top;
  BenimShape.Parent:=(sender as TShape).Parent;
end;
istediğin yere mouse ile sürükleyerek kopyalayabilirsin bunu...

tabi benim örneğimde kopyaları kopyalayamıyosun...

yukardaki kodun içine kopyaların.dkdrag ini dkdock onstartdock metodunu da (sender as tshape).onstartdock yaparsan (bişey atlamadıysam) onları da kopyalayabilirsin... Kolay gelsin...
29.04.2005 tarihi itibariyle Delphi öğrenmeye başlayan yeni bir kullanıcı sayılabilirim.
Kullanıcı avatarı
huseyinkucuk
Üye
Mesajlar: 142
Kayıt: 29 Nis 2005 10:03
Konum: İstanbul
İletişim:

Mesaj gönderen huseyinkucuk »

Düzeltiyorum:
Mouse ile taşıdığınızda, orjinalini taşımış oluyorsunuz... Eski yerinde kalan kopyası oluyo... Görünürde bir fark yok... Kolay gelsin...

Ayrıca Shape nesnesinin dragModu'nu dmAutomatic yapmayı da unutma...
En son huseyinkucuk tarafından 20 Ara 2006 02:31 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
29.04.2005 tarihi itibariyle Delphi öğrenmeye başlayan yeni bir kullanıcı sayılabilirim.
memiky
Üye
Mesajlar: 116
Kayıt: 17 Kas 2004 01:52
İletişim:

Mesaj gönderen memiky »

kahraman1285 arkadaş sorduğunuz sorunun ilk kısmı oldukça teknik bir açıklamayı gerektiriyor. Aşağıda verdiğim metni yeni Delphi kitabıma almak üzere hazırlamıştım.

Bir formdaki kontrolleri başka bir forma taşırken RemoveComponent ve InsertComponent metotlarını kullanabilirsiniz. Bu 2 metodun nasıl kullanıldığını anlatmak için 2 forma sahip bir proje hazırladım ve ilk forma “Aktar” ve “Sil” adında 2 düğme yerleştirdim.

Çalışma anında “Aktar” düğmesi tıklandığında ilk formdaki Edit1 ve Edit2’nin Parent özelliklerinde değişiklik yapıp bu Edit'lerin Form2’nin üzerinde görüntülenmesini sağlayacağım.

Kod: Tümünü seç

procedure TForm1.AktarClick(Sender: TObject);
begin
  Edit1.Parent := Form2;
  Edit2.Parent := Form2;
end;
Bı kod işletildiğinde her ne kadar başlangıçta Form1’in üzerinde bulunan Edit1 ve Edit2’yi projedeki ikinci formda görüntüyor olsa bile bu 2 nesnenin sahibi Form1’dir. Çalışma anında “Sil” adını verdiğim düğme tıklandığında ise Form2’deki ilk 2 nesnenin silinmesini sağlayacağım. Bu amaçla “Sil” düğmesinin Click metodunu aşağıdaki gibi düzenledim.

Kod: Tümünü seç

procedure TForm1.SilClick(Sender: TObject);
begin
  Form1.Components[0].Free;
  Form1.Components[1].Free;
end;
“Sil” düğmesinin Click metoduna yazılan bu 2 satır sayesinde Form1’deki ilk 2 kontrol silinir. Koda dikkat ederseniniz Edit1 ve Edit2'in Form2’nin üzerinde görünürken bu kontrollerin henüz Form1’e aittir ve Edit1 ile Edit2’nin sahibi Form1’dir. Bu nedenle Free metodu ile silme işlemini yaparken Form2 yerine Form1’ın adını yazdım.

Burada yapılması gereken Parent özelliği ile nesnenin görüntülenmesinden sorumlu sınıfı değiştirdikten sonra Owner özelliğini de değiştirmektir. Bu işlemi yapmak için aşağıda verdiğim kodu yazdım.

Kod: Tümünü seç

procedure TForm1.AktarClick(Sender: TObject);
begin
  Form1.Edit1.Parent := Form2;
  Form1.Edit1.Owner.RemoveComponent(Edit1);
  Form2.InsertComponent(Edit1);
  Form1.Edit2.Parent := Form2;
  Form1.Edit2.Owner.RemoveComponent(Edit2);
  Form2.InsertComponent(Edit2);
end;
Bu kod hakkında bilgi vermeden bu kodun hataya neden olacağını söylemeliyim. Bu kodda önce Form1’deki “Edit1” nesnesi RemoveComponent metodu ile Form1’den uzaklaştırılıp InsertComponent metodu ile Form2’ye eklenmektedir. Ancak Edit’ler ve diğer nesneler RemoveComponent metodu ile Form1’den uzaklaştırıldığı anda bellekten silinmiş olmaktadır.

Bu sorunu gidermek için ilk akla gelen yöntem bu işlemi yapacak bir procedure hazırlamaktadır. Daha önce Türkiye’de yayınlanan bir kitapta bu yöntem anlatıldığı için öncelikle söz konusu Edit nesnesini RemoveComponent metodu ile Form1’den uzaklaştırmadan bir değişkene aktaracağım. Böylece belki “çalıntı” yapmakla suçlanmaktan kurtulurum.

Kod: Tümünü seç

procedure TForm1.AktarClick(Sender: TObject);
Var
  E :TEdit;
begin
  Form1.Edit1.Parent := Form2;
  E := Form1.Edit1;
  Form1.Edit1.Owner.RemoveComponent(Edit1);
  Form2.InsertComponent(E);
  Form1.Edit2.Parent := Form2;
  E := Form1.Edit2;
  Form1.Edit2.Owner.RemoveComponent(Edit2);
  Form2.InsertComponent(E);
end; 
Bu kod sayesinde Edit1 ve Edit2’nin Form1 ile bir ilişkisi kalmaz. Bu kod işletildikten sonra Form2, Edit1 ile Edit2’nin hem Owner’ı hem de Parent’ı olur. Bu şartlarda, yani Form2’de yalnızca 2 nesne varken “Sil” düğmesi için yazılan kodda önce Edit2 silinmelidir yoksa hata meydana gelir.

Kod: Tümünü seç

procedure TForm1.SilClick(Sender: TObject);
begin
  Form1.Components[1].Free;
  Form1.Components[0].Free;
end;
Şimdi ise bu konuyu bildiğimi kanıtladığım için daha önce bir kitapta anlatılan teknikle, başka bir deyişle RemoveComponent ve InsertComponent metotlarını bir yordama alıp öyle işleteceğim. Hazırlayacağım yordam TComponent tipinde 2 parametreye sahip olacaktır.

Kod: Tümünü seç

procedure TForm1.Uzaklastir(Bilesen: TComponent; Sahip: TComponent);
begin
    Bilesen.Owner.RemoveComponent(Bilesen);
    Sahip.InsertComponent(Bilesen);
end;
“Uzaklastir” adını verdiğim yordamı bu şekilde hazırladıktan sonra “Aktar” düğmesinin Click yordamanını aşağıdaki gibi düzenledim.

Kod: Tümünü seç

procedure TForm1.AktarClick(Sender: TObject);
begin
  Form1.Edit1.Parent := Form2;
  Form1.Edit2.Parent := Form2;
  Uzaklastir(Edit1, Form2);
  Uzaklastir(Edit2, Form2);
end;
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

mesajlarda code blokları

Mesaj gönderen aslangeri »

s.a.
iyi günler.
öncelikle foruma yapmış olduğunuz katkılar için teşekkür ederim. Katkılarınızın devamını beklerim.
Ancak mesajların okunurluluğu açısından örnek kodlarınızı
[code] kodlar [/code] tagları içine alırsanız kodlarınızı okumak daha kolay olur.
Mesajlarınızda bu konuya dikkat etmenizi rica ediyorum.
Çalışmalarınızda başarılar diler, iyi günler temenni ederim.
Kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
kahraman1285
Üye
Mesajlar: 360
Kayıt: 10 Nis 2006 09:07

Mesaj gönderen kahraman1285 »

cevaplarınız için çok teşekkür ederim...
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

memiky yazdı:Bı kod işletildiğinde her ne kadar başlangıçta Form1’in üzerinde bulunan Edit1 ve Edit2’yi projedeki ikinci formda görüntüyor olsa bile bu 2 nesnenin sahibi Form1’dir. Çalışma anında “Sil” adını verdiğim düğme tıklandığında ise Form2’deki ilk 2 nesnenin silinmesini sağlayacağım. Bu amaçla “Sil” düğmesinin Click metodunu aşağıdaki gibi düzenledim.

Kod: Tümünü seç

procedure TForm1.SilClick(Sender: TObject);
begin
  Form1.Components[0].Free;
  Form1.Components[1].Free;
end;
“Sil” düğmesinin Click metoduna yazılan bu 2 satır sayesinde Form1’deki ilk 2 kontrol silinir. Koda dikkat ederseniniz Edit1 ve Edit2'in Form2’nin üzerinde görünürken bu kontrollerin henüz Form1’e aittir ve Edit1 ile Edit2’nin sahibi Form1’dir. Bu nedenle Free metodu ile silme işlemini yaparken Form2 yerine Form1’ın adını yazdım.
Hocam burada bir yanlışlık oldu galiba. Zira burada ilk iki kontol değil 1 ve 3. kontoller silinir. Daha sonra verdiğiniz örnekteki gibi olursa ancak dediğiniz olacaktır:

Kod: Tümünü seç

procedure TForm1.SilClick(Sender: TObject);
begin
  Form1.Components[1].Free;
  Form1.Components[0].Free;
end;
Belki gözünüzden kaçmıştır.

İyi çalışmalar.
memiky
Üye
Mesajlar: 116
Kayıt: 17 Kas 2004 01:52
İletişim:

Mesaj gönderen memiky »

Hakan can haklısın; Free metodu ile silme işlemi yapıldıkça Components koleksiyonun elemanlarının sırası değişir. Teşekkürler..
Cevapla