ورود

View Full Version : سوال: افزودن خاصیت جدید لیست به Combobox



hadisalahi2
پنج شنبه 10 تیر 1389, 12:39 عصر
سلام به همگی دوستان.
من قصد دارم یک کامپوننت بسازم که از کلاس TcomboBox مشتق میشه.
میخوام توی این کامپوننت یک لیست دیگه مثل Items بسازم.
اما وقتی کامپوننت رو نصب کردم و خواستم وارد این خاصیت بشم و مقادیر واردش کنم پیغام خطا میده.
متن خطا



Cannot Assign a nil to a TrichEditString



کد کامپوننت:



unit ComboBoxValue;

interface

uses
SysUtils, Classes, Controls, StdCtrls;

type
TComboBoxValue = class(TComboBox)
private
FValueList:TStringList ;
procedure SetList(Value: TStringList);
{ Private declarations }
protected
{ Protected declarations }
public
Constructor create(aowner:TComponent);
{ Public declarations }
published
property ValueList: TStringList read FValueList write FValueList;
{ Published declarations }
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('pascalComponent', [TComboBoxValue]);
end;
//QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ QQQQQQQQQQQQQQQQQQQQQQQQQQQQ
Constructor TComboBoxValue.create(aowner:TComponent);
begin
inherited create(aowner);
FValueList := TStringList.Create;
end;
//QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ QQQQQQQQQQQQQQQQQQQQQQQQQQQQ
procedure TComboBoxValue.SetList(Value: TStringList);
begin
if Value <> FValueList then FValueList.Assign(Value);
end;
//QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ QQQQQQQQQQQQQQQQQQQQQQQQQQQQ

hadisalahi2
پنج شنبه 10 تیر 1389, 17:37 عصر
من منتظر نظرات ارزشمند دوستان هستم

vcldeveloper
پنج شنبه 10 تیر 1389, 19:00 عصر
این متد SetList در اون کد چیکاره هست؟ شما که کلاس رو طوری تعریف کردید که هم خواندن و هم نوشتن در خصوصیت ValueList از طریق فیلد FValueList انجام میشه، نه از طریق متد SetList.
در ضمن، TRichEditString کجا هست؟ توی این کد که من TRichEditString نمی بینم که در خطای شما بهش اشاره شده.

hadisalahi2
شنبه 12 تیر 1389, 09:22 صبح
با سلام
البته این متد SetList رو قبلا خودتون بهم گفتید و من برای چند کامپوننت که توی اونهاخاصیت List وجود داره استفاده کردم و مشکل اونها در مورد StringList حل شده.
توی اون کامپوننت ها مشکلی نداره و اگه از این متد استفاده نکنی پیغام خطا میده.
ولی توی این کامپوننت نمیدونم چرا این پیغام خطا رو میده.
در مورد TRichEditString هم باید بگم که خودم هم نمیدونم چرا این پیغام خطا رو میده ولی دقیقا هنگامی که روی اون علامت سه نقطه خاصیت لیست جدید کلیک میکنم هنگام طراحی ، این پیغام رو نمایش میده.

vcldeveloper
شنبه 12 تیر 1389, 16:54 عصر
البته این متد SetList رو قبلا خودتون بهم گفتید و من برای چند کامپوننت که توی اونهاخاصیت List وجود داره استفاده کردم و مشکل اونها در مورد StringList حل شده.
من گفتم؛ ولی اون چیزی که در پست قبل بهش اشاره کردم این هست که شما SetList را تعریف کردید، ولی در property از اون استفاده نکردید. الان اون کد SetList شما در اون کلاس اجرا نمیشه، چون برای خصوصیت مربوطه نوشتید:


property ValueList: TStringList read FValueList write FValueList;

hadisalahi2
یک شنبه 13 تیر 1389, 19:49 عصر
خوب الان پیشنهاد شما برای رفع این مشکل چیه؟
چه طوری این کار رو روی ComboBox انجام بدم؟

AliReza Vafakhah
یک شنبه 13 تیر 1389, 23:14 عصر
خوب الان پیشنهاد شما برای رفع این مشکل چیه؟
چه طوری این کار رو روی ComboBox انجام بدم؟

خوب شما Constractor مربوط به کامپوننت را Override نکرده بودید و به اشتباه از TStringList به جای TStrings استفاده کرده بودید و همونطور که آقای کشاورز اشاره کردند در Property مربوط از یک فیلد برای write در Property استفاده کرده بودید که این هم درست نبود .

این هم کد اصلاح شده .

unit Comp;

interface

uses
SysUtils, Classes, Controls, StdCtrls;

type
TComboBoxValue = class(TComboBox)
private
FItems2: TStrings;
procedure SetItems2(const Value: TStrings);
{ Private declarations }
protected
{ Protected declarations }
public
Constructor Create(AOwner:TComponent);override;
{ Public declarations }
published
property Items2:TStrings read FItems2 write SetItems2;
{ Published declarations }
end;

procedure Register;

implementation

procedure Register;
begin
RegisterComponents('pascalComponent', [TComboBoxValue]);
end;

constructor TComboBoxValue.Create(AOwner: TComponent);
begin
inherited;
FItems2 := TStringList.Create;
end;

procedure TComboBoxValue.SetItems2(const Value: TStrings);
begin
FItems2.Assign(Value);
end;

end.

hadisalahi2
دوشنبه 14 تیر 1389, 09:03 صبح
سلام
با این کد فقط میشه اطلاعات رو داخل خاصیت Items2 ذخیره کرد ولی مقادیر رو اصلا توی ComboBox نشون نمیده و کاربر نمیتونه این مقادیر رو انتخاب کنه

vcldeveloper
دوشنبه 14 تیر 1389, 13:49 عصر
ولی مقادیر رو اصلا توی ComboBox نشون نمیده و کاربر نمیتونه این مقادیر رو انتخاب کنه
خب، طبیعی هست که نشون نده! شما که هر خصوصیتی از نوع TStrings درست کنید، ComboBox خود به خود محتوای اون رو نمایش نمیده! اگر مقادیر خصوصیت Items در داخل ComboBox نمایش داده میشند، به این خاطر هست که در هنگام رسم لیست مربوط به ComboBox، مقادیر خصوصیت Items توسط ComboBox رسم میشند.

hadisalahi2
دوشنبه 14 تیر 1389, 18:10 عصر
به این خاطر هست که در هنگام رسم لیست مربوط به ComboBox، مقادیر خصوصیت Items توسط ComboBox رسم میشند
خوب چه طوری باید این کار رو انجام داد؟