64 bit sistemlerde PageControl'ün DrawTab sorunu

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

64 bit sistemlerde PageControl'ün DrawTab sorunu

Mesaj gönderen sabanakman »

İyi günler. 64 bit windows sistemlerde TPageControl bileşeninin tablarını kodlarınmızla renklendirip yazdırmak için onDrawTab ve OwnerDraw=True kullanıldığında hiç bir hareket olmamakta ve sayfaların başlıkları görünmemektedir. Normalde bu kullanılmadan kendi halinde bırakılırsa (OwnerDraw=False olarak) bir sorun olmamaktadır. Bu sorun nasıl aşılır bir bilen var mıdır acep. Yoksa tatilim bittiğinde iş başa düşecek :) . Kolay gelsin.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: 64 bit sistemlerde PageControl'ün DrawTab sorunu

Mesaj gönderen sabanakman »

Merhabalar, yine ben :) . Sanırım 64 bit windows'un bu kısmında mesaj yöntemleri farklı davranıyor galiba. TTabSheet sınıfına bulaşarak yaptığım çözüm şu anda elimde değil ama ona bulaşmadan da çözüm aşağıdaki gibi olabilmektedir.

Kod: Tümünü seç

type
  TPageControl=class(ComCtrls.TPageControl)
  private
    FTazelemeKilidi:Boolean;
  protected
    procedure WndProc(var Message: TMessage); override;
    procedure Tazele;virtual;
  end;

procedure TPageControl.WndProc(var Message: TMessage);
begin
  inherited WndProc(Message); 
  if (Message.Msg=WM_PAINT) or
   (Message.Msg=WM_FONTCHANGE) or
   (Message.Msg=WM_SIZE) or
   (Message.Msg=WM_PRINTCLIENT) or
   (Message.Msg=CN_NOTIFY) or
   (Message.Msg=CM_RECREATEWND) or
   (Message.Msg=CM_TEXTCHANGED) or
   (Message.Msg=WM_SETTEXT)
  then
   Tazele;
end;

procedure TPageControl.Tazele;
var i:Integer;
begin
  if not FTazelemeKilidi and OwnerDraw and Assigned(OnDrawTab) then begin
    FTazelemeKilidi:=True;
    for i:=0 to PageCount-1 do
     onDrawTab(Self,i,TabRect(i),ActivePageIndex=i);
  end;
  FTazelemeKilidi:=False;
end;
gibi bir müdahale ile onDrawTab olayını çalıştırıp gerekli kodların çalışmasını sağlayabildim. Bu yöntem biraz sallama gibi olsa da işimi gördü.

Not:Bu kodu ek bir pas dosyası içerisinde yazdıktan sonra projeye eklemek ve PageControl sınıfının kullanıldığı formlarda uses satırında en sona ekleyerek istenen sağlanmaktadır.

Windows 64 bit mi? -> viewtopic.php?f=19&t=26777
Dosya ekleri
Pagex64.zip
(4.04 KiB) 189 kere indirildi
En son sabanakman tarafından 06 May 2010 02:16 tarihinde düzenlendi, toplamda 2 kere düzenlendi.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: 64 bit sistemlerde PageControl'ün DrawTab sorunu

Mesaj gönderen sabanakman »

Bu da diğer yöntem. Daha derli toplu başka çözümler varsa onları da eklemek gerek.

Kod: Tümünü seç

type
  TPageControl=class(ComCtrls.TPageControl)
  private
    procedure CMRecreateWnd(var Message: TMessage); message CM_RECREATEWND;
  protected
    procedure Change; override;
    procedure Tazele;virtual;
  public
    procedure Update; override;
  end;

  TTabSheet=class(ComCtrls.TTabSheet)
  private
    procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED;
  end;
  
implementation

{ TPageControl }

procedure TPageControl.Change;
begin
  inherited Change;
  Update;
end;

procedure TPageControl.CMRecreateWnd(var Message: TMessage);
begin
  inherited;// CMRecreateWnd(Message);
  Update;
end;

procedure TPageControl.Update;
begin
  inherited Update;
  Tazele;
end;


procedure TPageControl.Tazele;
var i:Integer;
begin
  if OwnerDraw and Assigned(OnDrawTab) then
   for i:=0 to PageCount-1 do
    onDrawTab(Self,i,TabRect(i),ActivePageIndex=i);
end;

{ TTabSheet }

procedure TTabSheet.CMTextChanged(var Message: TMessage);
begin
  inherited;
  if Assigned(PageControl) then
   PageControl.Update;
end;
Windows 64 bit mi? -> viewtopic.php?f=19&t=26777
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
NewMember
Üye
Mesajlar: 990
Kayıt: 29 Haz 2005 06:57
Konum: Bursa

Re: 64 bit sistemlerde PageControl'ün DrawTab sorunu

Mesaj gönderen NewMember »

@sabanakman
Acaba nerde hata yapıyorum. iki yöntemi de denedim ama sonuç gene aynı.Ya da daha efektif bir çözüm buldun mu?
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: 64 bit sistemlerde PageControl'ün DrawTab sorunu

Mesaj gönderen sabanakman »

İlk cevabıma örnek bir proje ekledim, onu indirip göz atabilirsiniz. Buradaki hile, PageControl kullanan formların üstteki uses satırında en sona PageControlx64 ismini eklemek o kadar.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
NewMember
Üye
Mesajlar: 990
Kayıt: 29 Haz 2005 06:57
Konum: Bursa

Re: 64 bit sistemlerde PageControl'ün DrawTab sorunu

Mesaj gönderen NewMember »

teşekkürler..
Kullanıcı avatarı
NewMember
Üye
Mesajlar: 990
Kayıt: 29 Haz 2005 06:57
Konum: Bursa

Re: 64 bit sistemlerde PageControl'ün DrawTab sorunu

Mesaj gönderen NewMember »

@sabanakman kullandığım page control bileşeni TJVGPageControl.Vermiş olduğun örnek bende çalışmama nedeni bundanmış.Örnek projeni de indirdim.Gayet güzel çalışıyor.Ama JVGPageControle işlemiyor.(Tabii unitinide ona göre güncelledim yani pagecontrollleri JVGPagecontrol olarak değiştirdim.)

Bunu JVGPagecontrolde de çalıştırmanın bir yolu varmıdır acaba?
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: 64 bit sistemlerde PageControl'ün DrawTab sorunu

Mesaj gönderen sabanakman »

PageControlx64.pas unitindeki TPageControl=class(ComCtrls.TPageControl) satırındaki tanımın anlamı ComCtrls.pas unitindeki TPageControl kontrolünü ele alır ve düzenler. Eğer bu satırı gerektiği gibi (TJVGPagecontrol=?JVGPagecontrolunitAdi?.TJVGPagecontrol) değiştirdiğiniz halde olmuyorsa biraz daha araştırma yapmalısınız, zira bu bileşenden elimde yok ve şu sıra incelemek için ele alacak kadar müsait değilim.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Cevapla