نمایش نتایج 1 تا 7 از 7

نام تاپیک: مشکل با نوشتن کامپوننت

  1. #1

    مشکل با نوشتن کامپوننت

    سلام
    من می خواهم یک کامپوننت بنویسم که به جای Button از اون استفاده کنم تا حالا هم کامپوننتی ننوشتم . برای این کار یک کامپوننت با وراثت از پنل ایجاد کردم و یک label و shape در اون قرار دادم . فقط shape رو به صورت client تعریف کردم . حالا می خواهم وقتی پنل رو تغییر سایز میدم این label هم تغییر سایز پیدا کنه اما نمی دونم چه جوری این کار باید انجام بدم لطفا راهنمای کنین . باید چه طوری میزان Heightو width برچسب و با مقدار Heightو width پنل برابر کنم . البته باید برای برچسبم این میزان کوچکتر باشد .
    کد اولیم و اینجا گذاشتم . از دوستانی که لطف میکنند و جواب میدن ممنون .
    unit HRCButton;

    interface

    uses
    SysUtils, Classes, Controls, ExtCtrls,StdCtrls,Graphics;

    type
    THRCButton = class(TPanel)
    private
    SHButton: TShape;
    LBButton:tlabel;{ Private declarations }
    FOnClick_LBButton: TNotifyEvent ;

    procedure SetCaption_LBButton(newValue: TCaption);
    function GetCaption_LBButton: TCaption;
    procedure Click_LBButtonTransfer(Sender: TObject); { TNotifyEvent }

    protected
    procedure CreateWindowHandle(const Params: TCreateParams); override; { Protected declarations }

    public

    constructor Create(AOwner: TComponent); override;
    { Public declarations }
    published
    // property Width: Integer read GetWidth write SetWidth;
    property Caption_LBButton: TCaption read GetCaption_LBButton write SetCaption_LBButton;
    property OnClick_LBButton: TNotifyEvent read FOnClick_LBButton write FOnClick_LBButton;
    { Published declarations }
    end;

    procedure Register;

    implementation

    procedure Register;
    begin
    RegisterComponents('HRC', [THRCButton]);
    end;
    constructor THRCButton.Create(AOwner: TComponent);
    { Creates an object of type THRCButton, and initializes properties. }
    begin
    inherited Create(AOwner);
    Left := 1;
    Top := 1;
    Width := 80;
    Height := 28;
    TabOrder := 0;
    caption:='';
    LbButton := Tlabel.Create(Self);
    LBButton.Parent := Self;
    SHButton := Tshape.Create(Self);
    SHButton.Parent := Self;
    end; { Create }


    procedure THRCButton.CreateWindowHandle(const Params: TCreateParams);
    { Calls inherited CreateWindowHandle and initializes subcomponents. }
    begin
    inherited CreateWindowHandle(Params);
    with LBButton do
    begin
    Left := 1;
    Top := 1;
    Width := 77;
    Height := 25;
    Cursor := crHandPoint;
    Hint := 'Ctrl+P';
    AutoSize := False;
    BiDiMode := bdRightToLeft;
    Caption := ' '#1575#1606#1589#1585#1575#1601;
    Color := 6172194;
    // Font.Charset := ARABIC_CHARSET;
    Font.Color := clWhite;
    Font.Height := -13;
    Font.Name := 'Traffic';
    Font.Style := [fsBold];
    ParentBiDiMode := False;
    ParentColor := False;
    ParentFont := False;
    ParentShowHint := False;
    ShowHint := True;
    Transparent := False;

    end; { LB_Label }
    with SHButton do
    begin
    Left := 1;
    Top:= 1;
    Width := 78;
    Height := 26;
    Cursor := crHandPoint;
    Align := alClient;
    Brush.Color := clBlack ;
    Pen.Color:= clWhite;
    Pen.Mode := pmMerge;
    // ExplicitWidth := 79;
    // ExplicitHeight := 25 ;
    end; { SH_Shape }
    end; { CreateWindowHandle }


    function THRCButton.GetCaption_LBButton: TCaption;
    { Returns the Caption property from the LBButton subcomponent. }
    begin
    result := LBButton.Caption;
    end; { GetCaption_LB_Button }
    procedure THRCButton.SetCaption_LBButton(newValue: tCaption);
    { Sets the LBButton subcomponent's Caption property to newValue. }
    begin
    LBButton.Caption := newValue;
    end; { SetCaption_LBButton }


    procedure THRCButton.Click_LBButtonTransfer(Sender: TObject);
    { Transfers the LBButton OnClick event to the outside world. }
    begin
    if assigned(FOnClick_LBButton) then
    FOnClick_LBButton(Self); { Substitute Self for subcomponent's Sender. }
    end; { Click_LBButtonTransfer }
    end.

  2. #2

    نقل قول: مشکل با نوشتن کامپوننت

    من می خواهم یک کامپوننت بنویسم که به جای Button از اون استفاده کنم تا حالا هم کامپوننتی ننوشتم . برای این کار یک کامپوننت با وراثت از پنل ایجاد کردم
    خب، چرا از TCustomButton آن را مشتق نکردید؟!
    اید چه طوری میزان Heightو width برچسب و با مقدار Heightو width پنل برابر کنم . البته باید برای برچسبم این میزان کوچکتر باشد .
    کنترل ها یک متد Resize دارند که در صورت تغییر سایز آن کنترل، فراخوانی میشه. در صورت Override کردن این متد، کد شما با هر بار تغییر سایز اون کنترل اجرا میشه.


    وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
    و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.

  3. #3

    نقل قول: مشکل با نوشتن کامپوننت

    در زمان اجرا پیغام این که خصوصیت taborder وجود ندارد را نمایش میدهد مشکل از چیه ؟

  4. #4

    نقل قول: مشکل با نوشتن کامپوننت

    یک سوال دیگه در زمان طراحی من رنگ و متن این دکمه رو که تغییر میدم درست عمل میکنه اما تو اجرا همون خصوصیات اولیش و نشون میده برای اینکه تغییرات جدید و نشون بده باید چکار کتم ؟

  5. #5

    نقل قول: مشکل با نوشتن کامپوننت

    یک سوال دیگه در زمان طراحی من رنگ و متن این دکمه رو که تغییر میدم درست عمل میکنه اما تو اجرا همون خصوصیات اولیش و نشون میده برای اینکه تغییرات جدید و نشون بده باید چکار کتم ؟
    برای اینکه Theme Support در پروژه فعال هست.

    در پست قبلی هم اشاره کردم، من متوجه نمیشم شما چرا دارید همچین کلاسی می نویسید! اگر میخواید دکمه داشته باشید، باید از کلاس TCustomButtom یک کلاس جدید مشتق کنید، نه اینکه از یک Panel انتظار دکمه شدن داشته باشید. Button یکی از کنترل های اولیه سیستم عامل ویندوز هست. اگر هم کسی بخواد از اول چرخ را اختراع کنه، با همان کلاس Button ویندوز که جزو Common Controls ویندوز هست، شروع میکنه.


    وَ سَيَعْلَمُ الَّذِينَ ظَلَمُوا [آل محمد حقهم] أَيَّ مُنْقَلَبٍ يَنْقَلِبُونَ - الشعراء (227)
    و ظالمین [حق آل محمد (ص) ] به زودی خواهند دانست که به کدام بازگشتگاه بازخواهند گشت.

  6. #6

    نقل قول: مشکل با نوشتن کامپوننت

    یک سوال دیگه :
    زمانی که من یکسری از property ها رو در CreateWindowHandle مقداردهی میکنم دیگه مقادیری رو که تغییر دادم در زمان اجرا نمایش نمیدهد چه طوری میشه یک سری مقدار دهی اولیه کرد ولی بعدا هم قابل تغییر باشند ؟

  7. #7
    کاربر دائمی آواتار SAASTN
    تاریخ عضویت
    خرداد 1385
    محل زندگی
    تهران
    سن
    39
    پست
    730

    نقل قول: مشکل با نوشتن کامپوننت

    همونطور که قبلا هم گفته شده راه رو دارین اشتباه می رین.
    با توجه به کدی که قرار دادید، احتمالا قصد شما تنها ایجاد تغییرات در ظاهر Button هست. برای این کار بهتره یک کلاس از TButton مشتق کنید و Paint اون رو بازنویسی کنید. Canvas در اختیار هست و انجام هر تغییر گرافیکی با اون ممکنه.
    اگر هم از کنترل جدیدتون انتظارات دیگه ای دارید که شما رو به استفاده از Lable و Shape سوق داده بهتره اون ها رو مطرح کنید. شاید راه بهتری باشه.

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •