Paint esnasında çizgi bileşenlerin altında neden kalıyor?

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
cengaver
Üye
Mesajlar: 111
Kayıt: 01 Nis 2014 05:02
Konum: İstanbul

Paint esnasında çizgi bileşenlerin altında neden kalıyor?

Mesaj gönderen cengaver »

Ş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?
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Paint esnasında çizgi bileşenlerin altında neden kalıyor

Mesaj gönderen mrmarman »

.


İ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. :idea: :bravo:

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.

Resim

Resim
Resim
Resim ....Resim
Kullanıcı avatarı
cengaver
Üye
Mesajlar: 111
Kayıt: 01 Nis 2014 05:02
Konum: İstanbul

Re: Paint esnasında çizgi bileşenlerin altında neden kalıyor

Mesaj gönderen cengaver »

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...
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Paint esnasında çizgi bileşenlerin altında neden kalıyor

Mesaj gönderen mrmarman »

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 : :roll:

- 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. :idea: :idea:

Resim

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
Resim
Resim ....Resim
Kullanıcı avatarı
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

Mesaj gönderen barisatalay »

@mrmarman hocam hala büyük ilgi ile takibinizdeyim elinize sağlık :)
Cevapla