PDA

View Full Version : type casting



Farhad.B.S
پنج شنبه 04 دی 1382, 18:29 عصر
سلام.
فرض کنید یه لیست باکس داریم که قراره آیتم هاش از یه نوع بخصوص ، مثلا از نوع کلاس زیر باشند :



Type TMyClass = class
Word : string;
Id : string;
end;


پر شدن این لیست باکس به این صورته که یه سری ورودی گرفته میشه ، تو یه نمونه از این کلاس گذاشته میشه و بعد وارد لیست باکس میشه :



var a : TMyClass;
begin
a.Word := user_input1;
a.Id := user_input2;
ListBox1.AddItem(a.Word,a);





تا اینجا مشکلی نیست ولی وقتی که قراره این ایتم ها بازیابی بشند :



var a : TMyClass;
begin
a := ListBox1.Items.Objects[0] as TMyClass;


تو این مرحله خطای "Invalid class typecast" به وجود میاد ؟؟؟

مهدی کرامتی
پنج شنبه 04 دی 1382, 20:29 عصر
من که مشکلی نداشتم.
اینم سورس یونیتی که تست کردم:

unit Unit1;

interface

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

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

var
Form1: TForm1;

type
TMyClass = class
Word: string;
Id: string;
end;

var a: TMyClass;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

begin
a := TMyClass.Create;
a.Word := 'Mehdi';
a.Id := 'Keramati';
ListBox1.AddItem(a.Word, a);
end;

procedure TForm1.FormDestroy(Sender: TObject);
var i: integer;
begin
a.free;

end;

procedure TForm1.Button2Click(Sender: TObject);
var a: TMyClass;
begin
a := ListBox1.Items.Objects[0] as TMyClass;
showmessage(a.Word);
end;

end.


اگر هنوز مشکلی دارید یک مثال در اینجا ضمیمه کنید تا بررسی شود.

اینم خود پروژه تست من:

hr110
پنج شنبه 04 دی 1382, 20:43 عصر
با سلام
بهتر است که نوع کلاس را حداقل از نوع TObject گرفت ، هم مشکل شما حل میشود هم مزایای دیگری دارد.

Farhad.B.S
جمعه 05 دی 1382, 18:44 عصر
با سلام.
با تشکر از جناب کرامتی و hr110 ، مشکل از این جاست :



var a : TMyClass;
begin
a.Word := user_input1;
a.Id := user_input2;
ListBox1.AddItem(a.Word,a);



متغیر a توسط متد سازنده ، ساخته نشده بود ، با اضافه کردن خط



a := TMyClass.Create();

مشکل حل شد :D