Yeni bileşen Width ve height sorunu

Yapmak istediğiniz işle ilgili doğru bileşeni bulmak için burayı kullanabilirsiniz. Sadece bulmak için, diğer sorular Programlama forumuna lütfen.
Forum kuralları
Bu forum sadece yapacağınız işle alakalı doğru bileşeni bulmak içindir. Şöyle bir şey yapmam lazım, hangi bileşeni kullanıyım diyorsanız, doğru yerdesiniz.
Cevapla
DrCakir
Üye
Mesajlar: 5
Kayıt: 02 Tem 2009 05:44

Yeni bileşen Width ve height sorunu

Mesaj gönderen DrCakir »

Merhaba!

Ben yeni bir klavye bileşeni yazıyorum. Ancak bir yerde takıldım bir türlü çözüm bulamadım.
Tanım şu şekilde.

Kod: Tümünü seç

type
  TdcKlvDil = (klvTurkce, klvAlmanca, klvIngilizce);

type
  TdcKlavye = class(TCustomControl)
  private
    { Private declarations }
    FOnClick_Caps : TNotifyEvent;
    FOnClick_Sayisal : TNotifyEvent;
    FOnClick_Harf : TNotifyEvent;
    FOnChange_ColorStyle : TNotifyEvent;

    FYatayAralik, FDikeyAralik : Integer;
    FDil : TdcKlvDil;
    FBuyukHarf : Boolean;
    FSayisal : Boolean;
    FColorStyle : TdcColorStyle;
    FEnterCaption, FSpaceCaption, FBackSpaceCaption,
    FCapsCaption, FDelCaption, FTabCaption : String[10];
    gTus : array [0..40] of TdcTusSpeedButton;

    procedure HarfAta;
    procedure TusHazirla;
    procedure TusYerlestir;

    procedure Click_btCaps(Sender:TObject);
    procedure Click_btSayisal(Sender:TObject);
    procedure Click_btHarf(Sender:TObject);
    procedure OnChange_ColorStyle;

    procedure SetColorStyle(prStyle : TdcColorStyle);

  protected
    { Protected declarations }
    procedure Resize; override;
  public
    { Public declarations }
    constructor Create(AOwner: TComponent); Override;
    destructor Destroy;
  published
    { Published declarations }
    property ColorStyle : TdcColorStyle read FColorStyle write SetColorStyle;
    property Align;
    property Font;
    property Visible;
    property Enabled;
    property Width default 550;
    property Height default 250;
  end;
Create;

Kod: Tümünü seç

constructor TdcKlavye.Create(AOwner: TComponent);
begin
  inherited;
  //Width := 550;
  //Height := 250;
  FDil := klvAlmanca;
  FBuyukHarf := True;
  FSayisal := False;
  FYatayAralik := 5;
  FDikeyAralik := 5;
  Font := TFont.Create;
  Font.Color := clBlack;
  Font.Size := 12;
  Font.Style := [];
  FColorStyle := dcsStandard;

  TusHazirla;
  TusYerlestir;
  HarfAta;
end;
Sorun Tus Yerlestir metodunda;

Kod: Tümünü seç

procedure TdcKlavye.TusYerlestir;
var
  lTusWidth, lTusHeight : Byte;
  I, lTop, lLeft : Integer;
begin
  FYatayAralik := 4;
  FDikeyAralik := 4;
  lTop := 1;
  lLeft := 1;

  lTusWidth := (Width-(11*FYatayAralik)) div 14;
  lTusHeight := (Height-(4*FDikeyAralik)) div 4;
Sorun Width ve Heigth dgerlerinin 0 gelmesinde. Eğer create fonksiyonunda değer ataması yaparsam o değer geliyor. Fakat Tasarımda mesala klavye boyutunu 800x550 yapsam bile eğer atama yapmışsam Create'deki değer, atama yapmamışsam 0 geliyor.

Klavyeyi kullandığım formda atama yaparsam çalışıyor. Ama tasarımda verdiğim değer gelmiyor.

Sorunu bir türlü çözemedim. Yardımlarınızı bekliyorum. Teşekkür ederim.
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: Yeni bileşen Width ve height sorunu

Mesaj gönderen sabanakman »

constructor Create içinde bu değeri muhakkak atamak zorundasınız. Yukarıdaki tanımda geçen default anahtar sözcüğü, o bileşen form üzerindeyken o değere sahip olarak tasarım kayıt edilirse, bu değer .dfm dosyasına yazılmadan kayıt edilir. Dikkat edilirse bazı özellik değerleri değiştirildiğinde değer yazan font kalın (bold) olur. Tekrar default değere geri dönüldüğünde ise font normale döner. Bunun anlamı o özelliğin varsayılan değerine dönüyor olmasıdır ve bu da constructor oluşturucu metod içinde ayarlanmalıdır.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
DrCakir
Üye
Mesajlar: 5
Kayıt: 02 Tem 2009 05:44

Re: Yeni bileşen Width ve height sorunu

Mesaj gönderen DrCakir »

sabanakman yazdı:constructor Create içinde bu değeri muhakkak atamak zorundasınız. Yukarıdaki tanımda geçen default anahtar sözcüğü, o bileşen form üzerindeyken o değere sahip olarak tasarım kayıt edilirse, bu değer .dfm dosyasına yazılmadan kayıt edilir. Dikkat edilirse bazı özellik değerleri değiştirildiğinde değer yazan font kalın (bold) olur. Tekrar default değere geri dönüldüğünde ise font normale döner. Bunun anlamı o özelliğin varsayılan değerine dönüyor olmasıdır ve bu da constructor oluşturucu metod içinde ayarlanmalıdır.
Yukarıda da yazdığım gibi Create'de bir değer atadığım zaman, sadece o değeri alıyor. DFM'den gelen değeri yine almıyor. Mesela;
Create'de width=500, Height=250 değerini verirsem Tasarımda wdith=800, height=500 değerini de versem Create'de verdiğim değeri alıyor. Yani yine yanlış değer gidiyor.
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: Yeni bileşen Width ve height sorunu

Mesaj gönderen sabanakman »

.dfm tasarımının uygulanabilmesi için öncelikle bileşen Create edilir ve ondan sonra diğer özellik (property) değerleri tasarımdan gelir. Buradaki düzenleme kodlarınızda create içinde olduğu için daha Height ve Width değerleri ayarlanmadan bu değerleri TusYerlestir metodunda kullanmaya çalışmanız nedeniyle sorun yaşamaktasınız. TusYerlestir metodunu Create içinde değil, bileşene Width veya Height ile yeni boyut verildiği zaman çalışmasını sağlamak çözüm olabilir.

Kod: Tümünü seç

 TdcKlavye =class(TCustomControl)
.......
 protected
   procedure Resize; override;
 end;

procedure TdcKlavye.Resize;
begin
  inherited Resize;
  TusYerlestir;
end;
Eğer resize ile istediğiniz sonucu alamazsanız bunu SetBounds metoduyla da yapabilirsiniz.

Kod: Tümünü seç

 TdcKlavye =class(TCustomControl)
.....
 public
   procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
 end;

procedure TdcKlavye.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
begin
  inherited SetBounds(ALeft, ATop, AWidth, AHeight);
  TusYerlestir;
end;
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
DrCakir
Üye
Mesajlar: 5
Kayıt: 02 Tem 2009 05:44

Re: Yeni bileşen Width ve height sorunu

Mesaj gönderen DrCakir »

Onu yaptım zaten. Mesela şu anda öyle. Create'den sildim tusyerlertiri. Sadece resize'da. Tasarım anında çalışıyor sorunsuz. Ama bu sefer da butonları çizmiyor. Yine çalıştırdıktan sonra boyutlandırınca ancak tekrar çiziyor. Yani klavyeyi kullandığım programdan kodla width veya height'i yeniden atarsam o zaman düzeliyor.
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: Yeni bileşen Width ve height sorunu

Mesaj gönderen sabanakman »

Resize yerine bir de SetBounds'u deneyin isterseniz.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
DrCakir
Üye
Mesajlar: 5
Kayıt: 02 Tem 2009 05:44

Re: Yeni bileşen Width ve height sorunu

Mesaj gönderen DrCakir »

setbounds'u da denemiştim. Onu ekleyince Access Violation Error veriyor. Resize'ı silip sadece Setbounds'ı bırakıp da denedim. Yine aynı. Setbounds içinden TusYerlertiri çağıramıyorum kısacası.
DrCakir
Üye
Mesajlar: 5
Kayıt: 02 Tem 2009 05:44

Re: Yeni bileşen Width ve height sorunu

Mesaj gönderen DrCakir »

Sorunu şu şekilde çözdüm sonunda. Bir yerde gördüm. Loaded kelimesi denemek için iyi bir fikir olarak gözüme göründü.

Kod: Tümünü seç

procedure TdcKlavye.Loaded;
begin
  inherited;
  if not (csDesigning in ComponentState) then
  begin
    TusYerlestir;
    HarfAta;
  end;
end;
Cevapla