çalışma anında bileşenlerin boyutlarını değiştirmek
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
çalışma anında bileşenlerin boyutlarını değiştirmek
tasarım anında yapabildiğimiz gibi çalışma sırasında da bileşenlerin boyunu değiştirmek istiyorum. bileşene tıklayında etrafında karelerin belirmesi ve sağ alta gelip mouse a basıp sürükleyince boyutlarının değişmesini nasıl yapabilirim.
öğrenmek, zorlukları yenmektir.
arkadaşımıza kolaylık olması açısından bu şekilde bir yanıt verdim, yoksa öyle bir kod neden paylaşılmasın artı bunu nereye upload edeceğimide bilmiyorum 

msn: ncavus@ihlas.net.tr
MESELA:
kod içinde bunlarla oynayabilirsin...
Kod: Tümünü seç
button1.width:=100;
button1.height:=150;
yanlış anlama paylaşacağın şek kod ise foruma yazabileceğinden bahsettim.
mesela;
viewtopic.php?t=5743
mesela;
viewtopic.php?t=5743
Merhabalar...
@Pulp; herhalde sorunsalı @cyasar ile kendi aranızda çözmüşsünüzdür...
Sadece sana değil bu yazıyı genel için yazıyorum....
- Kodlar kimsenin tekelinde değildir. Eğer burada bir soru sorulmuşsa, soru topluma mal olmuştur ve cevabını biliyorsanız lütfen yine bu etik kural çerçevesinde ...
1. ya yine açık şekilde yayınlayın
2. ya cevabını biliyorum ama sana özel moduna girmeyin
3. hiç cevap vermeyin
4. soruyu sorana özel mesaj ile iletin bizi karıştırmayın...
@cfyasar ve @forum sakinleri
- Bu tip bir sorunun çözümünü normalde nesneye göre değişkenlik gösterse de mümkün olduğunca ortak bir dil kullanmak için modifiye ettim... TEdit, TPanel, TListBox gibi nesnelerle deneyip, örnekleri çoğaltabirsiniz.
- Kullanım alanı olarak RunTime form tasarımları diyebiliriz... -ben kullanıcı tanımlı baskı formu tanımlama olayında kullanmıştım-
- Kullandığınız bileşenlerin BorderStyle özelliklerini None yapın... Çünkü kenarlarını algılamak zor oluyor...
- Aşağıdaki örnekte Forma bir tane panel koyuyoruz... Adı Panel1
- Bu TPanel'in OnMouseDown olayına ve OnMouseMove olayına istisnasız aşağıdaki iki grubu kopyala/yapıştır yapıyorsunuz. Tüm hesaplamalar dinamik yapıldığından herhangi bir güncellemeye gerek yok...
- Neler yapıldığınını özetleyeyim... OnMouseMove olayında nesnenin kenarlarına yaklaşıldığında Mouse Cursor Karakteri, hangi kenara yaklaşmışsa ona göre boyutlandırmayı hangi yönde yapacaksak o yönde bir şekil alması sağlanıyor...
- OnMouseDown olayında ise eğer sol mouse butonu basılı ise işlem yapmak üzere tetiklenen bir blok bekliyor...
- Bu blokta tahmin edeceğiniz üzere mouse koordinatları eğer eski sınırlarımızdan farklı bir yerde ise bu yeni alana kadar büyütme veya küçültme yapılmakta. Yani karmaşık bişi yok basit bir işlem...
- Const ifadesinde ise (global) olarak yukarılarda bir yere koymakta fayda var, tüm Unit içerisinde ortak olan; Mouse hareketlerinin güdümünde, nesneye büyütme/küçültme yönünü system komutu olarak aktarmak için kullanılan sabitleri içeriyor.
- Kendiniz denerken ise bir tane panel'e bunu yazın ve diğer bileşenlerin -mesela TEdit- Object Inspector'deki event sayfasında OnMouseMove eventinin yanındaki açılır liste kutusundan TPanel'e ait olan OnMouseMove olayını seçin... OnMouseMove için de aynı işlemi tekrarlayın.
- Formunuzdaki her nesne için aynı TPanel'e ait kaynağı gösterebilirsiniz. Bu şekilde tek satır fazladan kod yazmadan aynı özelliği TEdit'e ve diğer yapacağınız nesnelere de yüklemiş olursunuz...
@Pulp; herhalde sorunsalı @cyasar ile kendi aranızda çözmüşsünüzdür...
Sadece sana değil bu yazıyı genel için yazıyorum....
- Kodlar kimsenin tekelinde değildir. Eğer burada bir soru sorulmuşsa, soru topluma mal olmuştur ve cevabını biliyorsanız lütfen yine bu etik kural çerçevesinde ...
1. ya yine açık şekilde yayınlayın
2. ya cevabını biliyorum ama sana özel moduna girmeyin
3. hiç cevap vermeyin
4. soruyu sorana özel mesaj ile iletin bizi karıştırmayın...

@cfyasar ve @forum sakinleri
- Bu tip bir sorunun çözümünü normalde nesneye göre değişkenlik gösterse de mümkün olduğunca ortak bir dil kullanmak için modifiye ettim... TEdit, TPanel, TListBox gibi nesnelerle deneyip, örnekleri çoğaltabirsiniz.
- Kullanım alanı olarak RunTime form tasarımları diyebiliriz... -ben kullanıcı tanımlı baskı formu tanımlama olayında kullanmıştım-

- Kullandığınız bileşenlerin BorderStyle özelliklerini None yapın... Çünkü kenarlarını algılamak zor oluyor...
- Aşağıdaki örnekte Forma bir tane panel koyuyoruz... Adı Panel1
- Bu TPanel'in OnMouseDown olayına ve OnMouseMove olayına istisnasız aşağıdaki iki grubu kopyala/yapıştır yapıyorsunuz. Tüm hesaplamalar dinamik yapıldığından herhangi bir güncellemeye gerek yok...

- Neler yapıldığınını özetleyeyim... OnMouseMove olayında nesnenin kenarlarına yaklaşıldığında Mouse Cursor Karakteri, hangi kenara yaklaşmışsa ona göre boyutlandırmayı hangi yönde yapacaksak o yönde bir şekil alması sağlanıyor...

- OnMouseDown olayında ise eğer sol mouse butonu basılı ise işlem yapmak üzere tetiklenen bir blok bekliyor...


- Const ifadesinde ise (global) olarak yukarılarda bir yere koymakta fayda var, tüm Unit içerisinde ortak olan; Mouse hareketlerinin güdümünde, nesneye büyütme/küçültme yönünü system komutu olarak aktarmak için kullanılan sabitleri içeriyor.


- Formunuzdaki her nesne için aynı TPanel'e ait kaynağı gösterebilirsiniz. Bu şekilde tek satır fazladan kod yazmadan aynı özelliği TEdit'e ve diğer yapacağınız nesnelere de yüklemiş olursunuz...

Kod: Tümünü seç
const
sizeBorder = 2;
sc_SizeLeft = $F001;
sc_SizeRight = $F002;
sc_SizeTop = $F003;
sc_SizeTopLeft = $F004;
sc_SizeTopRight = $F005;
sc_SizeBottom = $F006;
sc_SizeBottomRight = $F008;
sc_SizeBottomLeft = $F007;
sc_DragMove = $F012;
Kod: Tümünü seç
procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then
With TCustomControl(Sender) do
begin
ReleaseCapture;
if(X >= Width - sizeBorder) And
NOT((Y <= sizeBorder) or (Y >= Height -sizeBorder)) then
Perform(WM_SysCommand, sc_SizeRight, 0)
else
if Not((X <= sizeBorder) or (X >= Width -sizeBorder)) And
(Y <= sizeBorder) then
Perform(WM_SysCommand, sc_SizeTop, 0)
else
if (X <= sizeBorder) And (Y <= sizeBorder) then
Perform(WM_SysCommand, sc_SizeTopLeft, 0)
else
if (X >= Width -sizeBorder) and (Y <= sizeBorder) then
Perform(WM_SysCommand, sc_SizeTopRight , 0)
else
if Not((X <= sizeBorder) or (X >= Width -sizeBorder)) And
(Y >= Height - sizeBorder) then
Perform(WM_SysCommand, sc_SizeBottom , 0)
else
if (Y >= Height -sizeBorder) And (X <= sizeBorder) then
Perform(WM_SysCommand, sc_SizeBottomLeft , 0)
else
if (Y >= Height -sizeBorder) and (X >= Width - sizeBorder)
then
Perform(WM_SysCommand, sc_SizeBottomRight , 0)
else
if Not((Y <= sizeBorder) or (Y >= Height -sizeBorder)) And
(X <= sizeBorder) then
Perform(WM_SysCommand, sc_SizeLeft , 0)
else
begin
Perform(WM_SysCommand, SC_DragMove, 0);
end;
end;
end;
Kod: Tümünü seç
procedure TForm1.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
With TCustomControl(sender) do
begin
if ( X <= sizeBorder ) or ( X >= Width -sizeBorder ) then
begin
if ( Y >= Height - sizeBorder ) then
begin
if ( X >= Width - sizeBorder ) then
Cursor := crSizeNWSE
else
Cursor := crSizeNESW;
end
else
if ( Y <= sizeBorder ) then
begin
if ( X >= Width -sizeBorder ) then
Cursor := crSizeNESW
else
Cursor := crSizeNWSE;
end
else
Cursor := crSizeWE;
end
else
if ( Y <= sizeBorder ) or ( Y >= Height - sizeBorder ) then
begin
Cursor := crSizeNS;
end
else
Cursor := crDefault;
end;
end;
-
- Kıdemli Üye
- Mesajlar: 1223
- Kayıt: 26 Nis 2005 04:08
-
- Üye
- Mesajlar: 25
- Kayıt: 27 Nis 2005 02:09
kolay gelsin
Perform windows biriminden biryordam yanlış hatırlamıyorsam api olması lazım yanlışsam kusura bakmayın windowsun bileşene hükemdebilmesi için bileşeninin kulpu yani handle olmalı faka (başka bir deyişle TWinControl den türemiş olmalı) TLabel , TImage bu gibi nesneler TGraphicControl den türer windowsda kulpsuz oldukları için bu bileşenlere erişemez
buna benzer bir şekilde bileşenlerin Anchors olayları TGraphicControl - TWinControl sonrasında biribirini tutmaz farklı telden çalar galiba birisini windows birisini delphi düzenlemeye çalıştığı için
kolay gelsin
Perform windows biriminden biryordam yanlış hatırlamıyorsam api olması lazım yanlışsam kusura bakmayın windowsun bileşene hükemdebilmesi için bileşeninin kulpu yani handle olmalı faka (başka bir deyişle TWinControl den türemiş olmalı) TLabel , TImage bu gibi nesneler TGraphicControl den türer windowsda kulpsuz oldukları için bu bileşenlere erişemez
buna benzer bir şekilde bileşenlerin Anchors olayları TGraphicControl - TWinControl sonrasında biribirini tutmaz farklı telden çalar galiba birisini windows birisini delphi düzenlemeye çalıştığı için

kolay gelsin
- sadettinpolat
- Moderator
- Mesajlar: 2131
- Kayıt: 07 Ara 2003 02:51
- Konum: Ankara
- İletişim: