Şimdi şöyle bir problem var;
Formda bir TPageControl nesnem var, bunun bir kaç sayfası var ve her sayfada çeşitli butonlar editboxlar vesair var...
Ben Kilitle := TRUE olduğunda o formun üzerinde kocaman bir çarpı şeklinde çizgi çizsin istiyorum fakat FormOnPaint olayına canvas ile birşeyler çizdiğimde ekrandaki diğer kontrollerin altında kalıyor.
Bu sorunu nasıl aşabilirim?
Paint esnasında çizgi bileşenlerin altında neden kalıyor?
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Re: Paint esnasında çizgi bileşenlerin altında neden kalıyor
.
İlüzyon yaparak..
(1) (Şart değil ama anlaşılır ve aynı zamanda sizin için kolaylık olsun diye) önce kontrol altına alacağınız bileşenleri bir PANEL üzerine yerleştirin. Daha sonra bu panel'in Visible özelliğini false edeceksiniz ve üzerindeki tüm bileşenler ve kontroller görünmez olacak.
(2) Bu panelin işi bittiğine (kullanıma kapatılacağı zaman) resmini bir TImage nesenesine kopyalyın.
(3) Bu TIMage nesnesini TPanel ile aynı en/boy/left/top değerlerine eşitleyin.
(4) TImage nesnesinin üzerine normal canvas operasyonu ile kırmızı çarpı işaretinizi ve istediğiniz ekstra grafiği basın. Böylece panel üzerindeki tüm kontrolleri kapsayan bir üzerine boyama yapmış oldunuz. Dilerseni siyah / beyaz hatta başka efektler de verebilirsiniz. Böylece görsel zenginleşme katarsınız.
(5) TPanel'in Visible özelliğini false yapın.
oldu size kontrolleri disable edilmiş bir panel.

Ben örneği yaptım. Başaramazsanız kaynak kodu da paylaşırım. Siz de yapınca paylaşırsanız bu başlığı okuyanlar için faydalı olur.


İlüzyon yaparak..

(1) (Şart değil ama anlaşılır ve aynı zamanda sizin için kolaylık olsun diye) önce kontrol altına alacağınız bileşenleri bir PANEL üzerine yerleştirin. Daha sonra bu panel'in Visible özelliğini false edeceksiniz ve üzerindeki tüm bileşenler ve kontroller görünmez olacak.
(2) Bu panelin işi bittiğine (kullanıma kapatılacağı zaman) resmini bir TImage nesenesine kopyalyın.
(3) Bu TIMage nesnesini TPanel ile aynı en/boy/left/top değerlerine eşitleyin.
(4) TImage nesnesinin üzerine normal canvas operasyonu ile kırmızı çarpı işaretinizi ve istediğiniz ekstra grafiği basın. Böylece panel üzerindeki tüm kontrolleri kapsayan bir üzerine boyama yapmış oldunuz. Dilerseni siyah / beyaz hatta başka efektler de verebilirsiniz. Böylece görsel zenginleşme katarsınız.
(5) TPanel'in Visible özelliğini false yapın.
oldu size kontrolleri disable edilmiş bir panel.


Ben örneği yaptım. Başaramazsanız kaynak kodu da paylaşırım. Siz de yapınca paylaşırsanız bu başlığı okuyanlar için faydalı olur.


Re: Paint esnasında çizgi bileşenlerin altında neden kalıyor
marman hocam önerdiğin yöntem çalışıyor ama pek efektif değil, yani bu yöntemi uygulamak için tek tek tüm formları elden geçirmek lazım. Halbuki bir çizgi çizen bir component olsa iş daha basite inecek gibi...
Re: Paint esnasında çizgi bileşenlerin altında neden kalıyor
Merhaba.
- No pain no gain demişler, neden basite indirgiyorsunuz. Bunu siz kendiniz bir component formuna sokabilirsiniz. Component dediğiniz de bir kodlar bütünüdür değil mi ?
- Şimdi sizin için hazırladığım aşağıdaki procedure'ü sunuyorum. Tekrar değerlendirip kullanımının ne kadar zor ve karmaşık olduğunu söyleyin lütfen :
- Dizi halindeki TImage grubuna yönelik merak edenler için; kodlarda dikkat ediniz, dizi boyutu sürekli artmıyor, daha önce kullanılan ancak FREE edilmiş boş yerler varsa onlar kullanılıyor. Hepsi dolu ise SetLength ile bir arttırılıyor.

Kullanımı :
- No pain no gain demişler, neden basite indirgiyorsunuz. Bunu siz kendiniz bir component formuna sokabilirsiniz. Component dediğiniz de bir kodlar bütünüdür değil mi ?
- Şimdi sizin için hazırladığım aşağıdaki procedure'ü sunuyorum. Tekrar değerlendirip kullanımının ne kadar zor ve karmaşık olduğunu söyleyin lütfen :

- Dizi halindeki TImage grubuna yönelik merak edenler için; kodlarda dikkat ediniz, dizi boyutu sürekli artmıyor, daha önce kullanılan ancak FREE edilmiş boş yerler varsa onlar kullanılıyor. Hepsi dolu ise SetLength ile bir arttırılıyor.



Kullanımı :
Kod: Tümünü seç
procedure TForm1.CheckBox4Click(Sender: TObject);
begin
PanelKontrolu( self, Panel1, TCheckBox(Sender).Checked);
end;
Kod: Tümünü seç
Var
xResimDizisi : Array of TImage;
Procedure PanelKontrolu( Form:TForm; Panel:TPanel; boolErisim:Boolean );
procedure PanelResminiYakala(Panel : TPanel;Image : TImage);
var
EkranDC : HDC;
begin
try
// TImage içeriğini boşaltıyoruz...
Image.Picture.Graphic := Nil;
// TPanel'in resimsel içeriğinin handle'ini tespit ediyoruz ...
EkranDC := GetDC(Panel.Handle);
try
With Image.Picture.Bitmap do
begin
Width := Panel.Width;
Height := Panel.Height;
// TPanel'in resmini TImage'in Bitmap'ine aktarıyoruz...
BitBlt( Canvas.Handle, 0, 0, Width, Height
, EkranDC, 0, 0
, SRCCOPY);
end;
finally
ReleaseDC(Panel.Handle, EkranDC);
end;
finally
end;
end;
Var
Image : TImage;
i, ImageIdx : Integer;
boolBosYerVar : Boolean;
begin
Image := TImage( Form.FindComponent( 'Image_ARMAN_'+ Panel.Name ) );
if Image <> NIL
then ImageIdx := Image.Tag
else ImageIdx := -1;
case boolErisim of
True:
begin
if Image <> NIL then
begin
xResimDizisi[ImageIdx].Free;
xResimDizisi[ImageIdx] := Nil;
end;
Panel.Visible := True;
end;
False:
begin
if High( xResimDizisi ) < 0
then ImageIdx := 0 // Dizide hiç resim yoksa
else ImageIdx := High( xResimDizisi ) + 1;
boolBosYerVar := False;
i := -1;
while (NOT boolBosYerVar) AND (i < high(xResimDizisi)) do
begin
inc(i);
if TImage( xResimDizisi[i] ) = nil
then boolBosYerVar := True;
end;
if NOT boolBosYerVar
then SetLength( xResimDizisi, ImageIdx+1 )
else ImageIdx := i;
Image := TImage.Create( Form );
Image.Name := Format('%s_%s', [ 'Image_ARMAN', Panel.Name ] );
Image.Tag := ImageIdx; // işi bitince free edeceğimiz Index nosunu TAG ile bağladım.
Image.Parent := Form;
PanelResminiYakala( Panel, Image );
// TPanel ile TImage nesnesi boyutlarını üst üste gelecek şekilde eşitliyoruz...
Image.Width := Panel.Width;
Image.Height := Panel.Height;
Image.Left := Panel.Left;
Image.Top := Panel.Top;
// TImage üzerine kırmızı çarpı çiziyoruz...
With Image.Picture.Bitmap do
begin
Canvas.Pen.Color := clRed;
Canvas.Pen.Width := 2;
Canvas.MoveTo( 0,0 );
Canvas.LineTo( Width, Height );
Canvas.MoveTo( Width, 0 );
Canvas.LineTo( 0, Height );
end;
xResimDizisi[ImageIdx] := Image; // Diziye alıyoruz...
Image.Visible := True;
Image.BringToFront;
Panel.Visible := False;
end;
end;
end;
- Dosya ekleri
-
- PanelIcerigi_TImage.rar
- Proje Örneği (Kaynak Kodları mevcuttur)
- (203.8 KiB) 66 kere indirildi
- barisatalay
- Üye
- Mesajlar: 398
- Kayıt: 02 Nis 2013 05:43
- İletişim:
Re: Paint esnasında çizgi bileşenlerin altında neden kalıyor
@mrmarman hocam hala büyük ilgi ile takibinizdeyim elinize sağlık 

Yeni bloğum: http://brsatalay.blogspot.com.tr/