PDA

View Full Version : ساخت .و حذف یک کلاس خاص



baradar
یک شنبه 16 خرداد 1389, 15:31 عصر
با سلام
من یک برنامه نوشتم که مثلا یک یونیت به اسم a دارد و در این یونیت
کلاسی تعریف شده که از TLabel مشتق می شود من در فرم اصلی برنامه
یک کلید قرار دادم که یک شی از ین کلاس را می سازد و به صورت رندوم
در مکانی نمایش می دهد حالا مشکل من این است که می خواهم وقتی
کاربر روی یکی از این لیبل ها کلید کرد بتواند آنرا حذف کند

لطفا راهنمایی کنید

برنامه را ضمیمه کردم

Felony
یک شنبه 16 خرداد 1389, 19:54 عصر
کدتون رو تغییر دادم :
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,a,Math;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
Procedure LabelClick(Sender: TObject);
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

Procedure TForm1.LabelClick(Sender: TObject);
begin
if Sender is TLabel then
(Sender as TLabel).Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
var m:TMyClass;
begin

m:=TMyClass.Create(nil);
m.Parent:=self;
m.Caption:='baradar';
Randomize;
m.id:= Random(100) ;
m.Left:= Random(500) ;
Randomize;
m.Top:= Random(400) ;
m.OnClick:= LabelClick;
end;

end.

SAASTN
یک شنبه 16 خرداد 1389, 20:07 عصر
سلا
اگه حذف شدن بعد از کلیک کارکرد همیشگی Labelتون هست به شکل زیر هم میشه پیاده سازیش کرد:
unit a;

interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TMyClass = class(TLabel)
private
protected
public
var id:integer;
procedure Click; override;
published
{ published declarations }
end;


implementation

{ TMyClass }
procedure TMyClass.Click;
begin
inherited;
Self.Free;
end;
end.

1485159
یک شنبه 16 خرداد 1389, 20:20 عصر
آقای مجتبی مگه ننوشتین که:

Procedure TForm1.LabelClick(Sender: TObject);
خوب پس چرا دوباره چک میکنید که لیبل هست یا نه؟

Felony
یک شنبه 16 خرداد 1389, 22:21 عصر
آقای مجتبی مگه ننوشتین که:

Procedure TForm1.LabelClick(Sender: TObject);
خوب پس چرا دوباره چک میکنید که لیبل هست یا نه؟

برای اینکه پارامتر Sender رو از نوع TObject در نظر گرفتیم و ممکنه این رویداد رو اشتباها به یک دکمه اختصاص بدیم یا ... ، حالا اگر چک نکنیم که شئ فراخوان از چه کلاسی هست دکمه آزاد و حذف میشه !

در ضمن یک مقاله در مورد تبدیل امن ( as-cast ) و تبدیل ناامن ( hard-cast ) توسط آقای خورسندی نوشته شده بود که در بخش مقالات دلفی هست ( با نام Understanding between Hard Cast and As Cast in Delphi ) که میتونه براتون مفید باشه .

baradar
دوشنبه 17 خرداد 1389, 10:05 صبح
با سلام
از پاسختون متشکرم
ولی منظور من برای حذف کردن این بود که مثلا کاربر روی یکی از این لیبل ها کلیک
کنه و بعد با زدن مثلا دکمه Del اون رو حذف کنه
به این دلیل که من برای کلیک کردن روی هر لیبل میخوام یک کار دیگه انجام بده ولی با کدی که شما نوشتید
اون رو حذف می کنه

Felony
دوشنبه 17 خرداد 1389, 10:19 صبح
کد رو به این شکل تغییر بدید :

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,a,Math;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
Procedure LabelClick(Sender: TObject);
public
{ Public declarations }
end;

var
Form1: TForm1;
CurrentObject: TObject;

implementation

{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);
begin
if Assigned(CurrentObject) then
FreeAndNil(CurrentObject);
end;

Procedure TForm1.LabelClick(Sender: TObject);
begin
if Sender is TLabel then
CurrentObject:= Sender;
end;

procedure TForm1.Button1Click(Sender: TObject);
var m:TMyClass;
begin

m:=TMyClass.Create(nil);
m.Parent:=self;
m.Caption:='baradar';
Randomize;
m.id:= Random(100) ;
m.Left:= Random(500) ;
Randomize;
m.Top:= Random(400) ;
m.OnClick:= LabelClick;
end;

end.

baradar
دوشنبه 17 خرداد 1389, 10:37 صبح
با سلام
من کد رو طبق فرمایش شما تغییر دادم ولی وقتی روی یکی از لیبل ها کلیک می کنم وروی
دکمه حذف کلیک می کنم هیچ کاری صورت نمی گیرد
لطفا یه نگاهی به فایل زیر بیندازید

Felony
دوشنبه 17 خرداد 1389, 12:35 عصر
من گفتم کد رو به صورتی که نوشتم تغییر بدید ، نگفتم که کدهای قبلی رو حذف کنید !
کدتون رو اصلاح کردم ، از ضمیمه دریافت کنید .