PDA

View Full Version : راهنمایی در مورد ساخت کامپوننت



Mohammad_Mnt
پنج شنبه 24 آذر 1384, 00:03 صبح
من یه کامپوننت Label ساختم که موقع اجرای برنامه ، Caption خودش رو با Caption فرم یکی می کنه . مشکل این جا است که وقتی چون فرم دلفی ، کپشن این لیبل رو توی خودش ذخیره می کنه ، لیبل نمی تونه کپشن خودش رو با فرم یکی کنه . یا این دلفی کپشن لیبل رو بعد از کدی که من نوشتم تغییر می ده .
کدی که من می نویسم توی کانستراکتور لیبل است و حالت csDesigning رو هم در نظر گرفته ام .
ممنون می شم راهنمایی کنین

Developer Programmer
پنج شنبه 24 آذر 1384, 09:30 صبح
ببخشید، قر و قاطی نوشتید، نفهمیدم چی شد!

خوب وقتی Enable کامپوننت رو True میکنید، caption والد(parent) رو پاس بدید.

خوش باشین

Mohammad_Mnt
پنج شنبه 24 آذر 1384, 15:02 عصر
من متوجه نشدم . بگین چرا این کامپوننت درست کار نمی کنه . قراره که کپشن این کامپوننت با کپشن فرم یکی باشه !


unit UTTitle;

interface

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

type
TTTitle = class(TPanel)
private
{ Private declarations }
protected
{ Protected declarations }
public
{ Public declarations }
procedure setProperty;
published
{ Published declarations }
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('Tornado', [TTTitle]);
end;

{ TTTitle }

procedure TTTitle.setProperty;
begin
self.BiDiMode:= bdRightToLeft;
self.Font.Name:= 'MMETahoma';
self.Font.Size:= 10;
self.Font.Style:= [fsBold];
self.Font.Color:= clRed;
self.Width:= 200;
self.Height:= 20;

if (self.Parent is TForm) then
self.Caption:= (self.Parent as TForm).Caption;
end;

end.

Developer Programmer
پنج شنبه 24 آذر 1384, 19:20 عصر
واستون نوشتم، توی سیستم من که درست کار کرد.


procedure TForm1.FormCreate(Sender: TObject);
begin
Self.Caption:='http://AfshinZavar.50megs.com' ;
myLabel1.SetActive(True);
end;
این هم کد کامپوننت ( فایلی به نام mylabel.pas بسازید و کد زیر رو Paste کنید)


unit myLabel;
interface
uses SysUtils, Classes, Controls, StdCtrls,Forms;
type
//
TmyLabel = class(TLabel)
//
private
Owner: TComponent;
protected
{ Protected declarations }
public
Constructor Create(aOwner:TComponent); override; //To override a method, redeclare it with the override directive
Destructor Destroy; override;
Procedure SetActive(aActive:Boolean=False);
published
end;

procedure Register;

implementation

Constructor TmyLabel.Create(aOwner:TComponent);
begin
inherited;
Owner:=aOwner;
end;
(**********************)

Destructor Tmylabel.Destroy;
begin
inherited;
end;
(**********************)

Procedure TmyLabel.SetActive(aActive:Boolean=False);
begin
If aActive Then
begin
self.Text:=(Self.Parent as Tform).Caption;
end;
end;
(**********************)

procedure Register;
begin
RegisterComponents('Afshin', [TmyLabel]);
end;
end.

Mohammad_Mnt
جمعه 25 آذر 1384, 15:52 عصر
نه افشین خان . این راه رو رفته بودم . من می خوام این کار فقط از طریق خود کامپوننت انجام بشه ، نه این که من توی فرم یه متد رو فراخوانی کنم .
مرسی از وقتی که می ذارین

Developer Programmer
جمعه 25 آذر 1384, 16:20 عصر
خوب حاجی کاری نداره که...
در متد Create کامپوننت بنویس، اینطوری به محض گذاشته شدن روی فرم؛ Caption رو برمیداره
خوش باشی

Naficy
شنبه 26 آذر 1384, 13:09 عصر
۱ - یه راه منطقی اینه که از TCustomLabel به عنوان پدر کامپوننتتون استفاده کنید و خصوصیت Caption رو در قسمت Published کلاس نیارید. این کار باعث می شه Caption مربوط به label اصلا در فایل فرم ذخیره نشه. ضمنا دیگه کاربر هم نمی تونه کپشن رو تغییر بده.
۲ - راه ساده دیگه اینه که کدتون رو درون متد loaded (اگه اشتباه نکنم) قرار بدین. کد درون این متد بعد از لود شدن تمام خصوصیات از درون فایل فرم اجرا می شه.
*) در هر دو روش؛ اگر کاربر کپشن فرم را بعد از اجرای کد شما تغییر دهد؛ شما متوجه این تغییر نمی شوید!

Mohammad_Mnt
شنبه 26 آذر 1384, 17:11 عصر
مرسی . می رم امتحان کنم :)