PDA

View Full Version : سوال: ايجاد خاصيتهاي ليستي نامحدود مانند Items در ListBox



hadisalahi2
یک شنبه 04 اسفند 1387, 12:35 عصر
سلام
چطور ميتونم به يك كامپوننت خاصيت ليست نامحدود اضافه كنم. البته منظورم از ليست نا محدود يعني اينكه بتونم داخل يك ليست هر تعداد گزينه كه ميخوام اضافه كنم البته منظور اينكه كاربر بتونه گزينه هاي اون رو وارد كنه.
به عنوان مثال يك چيزي مثل خاصيت Items در Listbox ,Combobox . البته اين رو هم ميخوام بدونم كه گزينه هاي اين ليست بايد كجا قرار بگيرند.البته خودم حدس ميزنم بايد داخل يك آرايه پويا قرار بگيرند ولي روش كار و نحوه تعريف ليست رو بلد نيستم.
ممنون از همگي

vcldeveloper
یک شنبه 04 اسفند 1387, 17:12 عصر
يك چيزي مثل خاصيت Items در Listbox ,Combobox .


TMyClass = class(TComponent)
private
FList : TStringList;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property List: TStringList read FList;
end;


constructor TMyClass.Create(AOwner: TComponent);
begin
inherited;
FList := TStringList.Create
end;

destructor TMyClass.Destroy;
begin
FreeAndNil(FList);
inherited;
end;

hadisalahi2
دوشنبه 05 اسفند 1387, 09:20 صبح
با سلام
استاد من از کد شما استفاده کردم، حالت لیست رو برای من ایجاد میکنه و همون شکل Items در Listbox میشه ولی متاسفانه بعد از اینکه مقادیر رو وارد میکنی و خارج میشی پیغام خطای Access Validation میده.
در ضمن حالا من چطوری باید به گزینه های این لیست دسترسی پیدا کنم؟

vcldeveloper
دوشنبه 05 اسفند 1387, 15:25 عصر
پیغام خطای Access Validation میده.
کد بالا به خودی خود AV نمیده. اگر شما AV میگیرید، یعنی در نحوه استفاده شما از آن اشکال وجود داره.


حالا من چطوری باید به گزینه های این لیست دسترسی پیدا کنم؟
همانطوری که به Itemهای یک ListBox یا Lines یک Memo دسترسی پیدا می کردید:


List.Clear;
List.Add('Test');

hadisalahi2
دوشنبه 05 اسفند 1387, 15:51 عصر
من فقط روی دکمه سه نقطه کلیک میکنم و مقادیر رو مثلا 1 2 3 4 5 رو در سطرهای جدا وارد میکنم و از پنجره لیست خارج میشم و به محض خارج شدن پیغام خطا میده.من دقیقا کد شما رو استفاده کردم و چیز زیاد تری ننوشتم که باعث تولید خطا بشه به نظر شما مشکل از کجاست؟
این هم کد اون قسمتی که لیست رو تعریف کردم.



unit SQLSelect;

interface

uses
SysUtils, Classes,ADODB;

type
TMyEnum=(Equal,NotEqual,Greater,GreaterEqual,Less, LessEqual);
// TMyEnum = (meItem1,meItem2,meItem3);
TSQLSelect = class(TComponent)

private
FOperator:TMyEnum;
F_ADOQ:TADOQuery;
F_TableName:String;
F_FieldName:string;
F_OrderField:string;
FList : TStringList;

{ Private declarations }
//QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ QQQQQQQQQQQQQQQQQQQQQQQQQQQQ
protected
{ Protected declarations }
//QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ QQQQQQQQQQQQQQQQQQQQQQQQQQQQ
public
Constructor Create(aowner:TComponent);override;
procedure SimpleSelect;
procedure SelectByOrder;
{ Public declarations }
//QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ QQQQQQQQQQQQQQQQQQQQQQQQQQQQ
published
property ADOQ:TADOQuery read F_ADOQ write F_ADOQ;
property TableName:String read F_TableName write F_TableName;
property FieldName:String read F_FieldName write F_FieldName;
property OrderField:String read F_OrderField write F_OrderField;
property Operator: TMyEnum read FOperator write FOperator;
property FiledList: TStringList read FList;


{ Published declarations }

end;
//QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ QQQQQQQQQQQQQQQQQQQQQQQQQQQQ
procedure Register;
//QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ QQQQQQQQQQQQQQQQQQQQQQQQQQQQ
implementation
//QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ QQQQQQQQQQQQQQQQQQQQQQQQQQQQ
Constructor TSQLSelect.create(aowner:TComponent);
begin
inherited create(aowner);
FList := TStringList.Create
end;
//QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ QQQQQQQQQQQQQQQQQQQQQQQQQQQQ

vcldeveloper
دوشنبه 05 اسفند 1387, 16:56 عصر
شما اینجا متد destructor ندارید، کد مربوط به سایر بخش های کلاس هم مشخص نیست، در متد Constructor هم فقط FList را ساختید، و خبری از ساخت سایر اشیاء (مثل F_ADOQ) نیست، و قاعداتا هر نوع ارجاعی به آن موجب ایجاد AV خواهد شد.

hadisalahi2
سه شنبه 06 اسفند 1387, 10:00 صبح
با سلام
من کد کامل رو براتون نگداشتم.
حالا در مورد کد زیر هم همین توری خطا میده من هیچ چیز اضافی نگذاشتم.



unit CustomeList;

interface

uses
SysUtils, Classes;

type
TCustomeList = class(TComponent)
private
FList : TStringList;

{ Private declarations }
protected
{ Protected declarations }
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;

{ Public declarations }
published
property List: TStringList read FList;

{ Published declarations }
end;

procedure Register;

implementation

constructor TCustomeList.Create(AOwner: TComponent);
begin
inherited;
FList := TStringList.Create
end;

destructor TCustomeList.Destroy;
begin
FreeAndNil(FList);
inherited;
end;
procedure Register;
begin
RegisterComponents('temp', [TCustomeList]);
end;

end.



این هم پیغام خطایی که میده.

hadisalahi2
چهارشنبه 07 اسفند 1387, 08:58 صبح
دوستان کسی نمیتونه کمکی کنه؟
به نظر شما این خط



property List: TStringList read FList;


احتیاج به Write نداره؟

vcldeveloper
چهارشنبه 07 اسفند 1387, 17:19 عصر
من کد کامل رو براتون نگداشتم.
حالا در مورد کد زیر هم همین توری خطا میده من هیچ چیز اضافی نگذاشتم.
کد مشکلی نداره. مشکل از کدی هست که برای استفاده از کد بالا نوشتید.


به نظر شما این خط

احتیاج به Write نداره؟
خیر. اگر بخواید write هم بزارید، باید حتما یک متد SetList تعریف کنید، و مستقیما از FList برای write استفاده نکنید، وگرنه موجب ایجاد Memory Leak میشه!


property List: TStringList read FList write SetList;



procedure TCustomeList.SetList(Value: TStringList);
begin
if Value <> FList then
FList.Assign(Value);
end;

hadisalahi2
جمعه 09 اسفند 1387, 11:34 صبح
آقاي كشاورز ممنون از لطفتون مشكل حل شد ، گير تو همون يه پروسيجر آخر بود.
حالا من همين ليست رو به صورت ليست كامپوننت تعريف ميكنم به صورت زير:



unit CustomeList;

interface

uses
SysUtils, Classes,Contnrs;

type
TCustomeList = class(TComponent)
private
FList : TStringList;
FCList: TComponentList;
procedure SetList(Value: TStringList);
procedure SetCList(Value: TComponentList);
{ Private declarations }
protected
{ Protected declarations }
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;

{ Public declarations }
published
property List: TStringList read FList write SetList;
property CList: TComponentList read FCList write SetCList;

{ Published declarations }
end;

procedure Register;

implementation

constructor TCustomeList.Create(AOwner: TComponent);
begin
inherited;
FList := TStringList.Create;
FCList:=TComponentList.Create;
end;

destructor TCustomeList.Destroy;
begin
FreeAndNil(FList);
inherited;
end;

procedure TCustomeList.SetCList(Value: TComponentList);
begin
if Value <> FCList then
FCList.(Value);
end;

procedure TCustomeList.SetList(Value: TStringList);
begin
if Value <> FList then
FList.Assign(Value);
end;

procedure Register;
begin
RegisterComponents('temp', [TCustomeList]);
end;

end.


ولي موقع استفاده از اون و موقع باز كردن داخل Object Inspector پيغام خطاي Unable To expand رو ميده.
به نظر شما براي تعريف ليست كامپوننت ها بايد چكار كنم؟

vcldeveloper
جمعه 09 اسفند 1387, 18:35 عصر
ولي موقع استفاده از اون و موقع باز كردن داخل Object Inspector پيغام خطاي Unable To expand رو ميده.
TComponentList با TStringList فرق میکنه. دلفی برای TStringList یک Editor رجیستر شده برای IDE داره. برای همین هم به راحتی میشه ازش در Properties Inspector استفاده کرد. TComponentList همچین چیزی نداره، و Properties Inspector نمیدونه چطور باید آن را باز کنه. برای همچین کاری باید یک Property Editor نوشت، و آن را در IDE نصب کرد. معلوم نیست چرا CList را Published کردید. چرا باید به لیست کامپوننت ها در زمان طراحی از طریق Properties Inspector دسترسی داشت؟

hadisalahi2
سه شنبه 13 اسفند 1387, 13:12 عصر
در مورد Clist اشتباه شده و اشتباها این کار رو کردم.
ولی اینکه چرا باید به لیست کامپوننت ها دسترسی داشت؟ علتش اینه که من میخوام موقع طراحی میخوام چند تا مثلا Edit رو انتخاب کنم تا موقع اجرای برنامه مقادیری که وارد اونها میشه رو داخل یک آرایه قرار بدم.
یعنی نمیخوام موقع اجرا کد بنویسم و میخوام بدون کد نویسی مقادیر داخل کامپوننت ها رو داخل ارایه قرار بدم.