bir nesneyi bir formdan diğer forma nasıl kopyalayabilirim?
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
-
- Üye
- Mesajlar: 360
- Kayıt: 10 Nis 2006 09:07
bir nesneyi bir formdan diğer forma nasıl kopyalayabilirim?
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?
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?
- huseyinkucuk
- Üye
- Mesajlar: 142
- Kayıt: 29 Nis 2005 10:03
- Konum: İstanbul
- İletişim:
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
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...
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;
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.
- huseyinkucuk
- Üye
- Mesajlar: 142
- Kayıt: 29 Nis 2005 10:03
- Konum: İstanbul
- İletişim:
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...
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.
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.
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.
“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.
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.
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.
Ş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.
“Uzaklastir” adını verdiğim yordamı bu şekilde hazırladıktan sonra “Aktar” düğmesinin Click yordamanını aşağıdaki gibi düzenledim.
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;
Kod: Tümünü seç
procedure TForm1.SilClick(Sender: TObject);
begin
Form1.Components[0].Free;
Form1.Components[1].Free;
end;
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 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;
Kod: Tümünü seç
procedure TForm1.SilClick(Sender: TObject);
begin
Form1.Components[1].Free;
Form1.Components[0].Free;
end;
Kod: Tümünü seç
procedure TForm1.Uzaklastir(Bilesen: TComponent; Sahip: TComponent);
begin
Bilesen.Owner.RemoveComponent(Bilesen);
Sahip.InsertComponent(Bilesen);
end;
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;
Memik YANIK - http://www.memikyanik.com
mesajlarda code blokları
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.
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
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
-
- Üye
- Mesajlar: 360
- Kayıt: 10 Nis 2006 09:07
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: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.
“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.Kod: Tümünü seç
procedure TForm1.SilClick(Sender: TObject); begin Form1.Components[0].Free; Form1.Components[1].Free; end;
Kod: Tümünü seç
procedure TForm1.SilClick(Sender: TObject);
begin
Form1.Components[1].Free;
Form1.Components[0].Free;
end;
İyi çalışmalar.
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..
Memik YANIK - http://www.memikyanik.com