
64 bit sistemlerde PageControl'ün DrawTab sorunu
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
- 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
İ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. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .
- 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
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.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

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;
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) 188 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. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .
- 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
Bu da diğer yöntem. Daha derli toplu başka çözümler varsa onları da eklemek gerek.
Windows 64 bit mi? -> viewtopic.php?f=19&t=26777
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;
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .
Re: 64 bit sistemlerde PageControl'ün DrawTab sorunu
@sabanakman
Acaba nerde hata yapıyorum. iki yöntemi de denedim ama sonuç gene aynı.Ya da daha efektif bir çözüm buldun mu?
Acaba nerde hata yapıyorum. iki yöntemi de denedim ama sonuç gene aynı.Ya da daha efektif bir çözüm buldun mu?
- 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
İ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. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .
Re: 64 bit sistemlerde PageControl'ün DrawTab sorunu
teşekkürler..
Re: 64 bit sistemlerde PageControl'ün DrawTab sorunu
@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?
Bunu JVGPagecontrolde de çalıştırmanın bir yolu varmıdır acaba?
- 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
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. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .