PDA

View Full Version : سوال: ذخیره یک آرایه در بلاب فیلد



MohsenTi
یک شنبه 26 مهر 1388, 22:56 عصر
سلام دوستان
من تو برنامم یه آرایه دارم که سایزش متغیره می خواستم تو یه بلاب فیلد ذخیرش کنم کسی راهی میدونه
از همگی پیشا پیش تشکر می کنم
راستی کسی می دونه چرا تابع Sizeof نمی تونه اندازه ی آرایه ها و توابع رو بر گردونه ( تابع SizeOf سی این قابلیت ها رو داره)

vcldeveloper
دوشنبه 27 مهر 1388, 05:53 صبح
راستی کسی می دونه چرا تابع Sizeof نمی تونه اندازه ی آرایه ها و توابع رو بر گردونه ( تابع SizeOf سی این قابلیت ها رو داره)
اندازه چه نوع آرایه ایی؟ اگر منظور اندازه آرایه دینامیک هست، بخاطر اینکه آرایه دینامیک خودش یک اشاره گر به یک ساختار داده در Heap هست، در نتیجه مقداری که SizeOf برای آن برمیگردانه مساوی طول یک اشاره گر هست. برای بدست آوردن اندازه داده موجود در این نوع از آرایه، باید از Length استفاده کنید.

طول توابع را هم متوجه نمیشم منظورتون چی هست!!


من تو برنامم یه آرایه دارم که سایزش متغیره می خواستم تو یه بلاب فیلد ذخیرش کنم کسی راهی میدونه
اونو به عنوان بافر به یک MemoryStream بدید، و MemoryStream را در فیلد BLOB ذخیره کنید.

MohsenTi
دوشنبه 27 مهر 1388, 08:10 صبح
TMemoryStream داده ها رو خراب می کنه چون آرایه ی من داینامیکه .
تابع Length طول یک آرایه رو میده نه اندازش رو منظورم از اندازه حجمیه که اشغال می کنه.
تابع sizeof در سی می تونه حجمی رو که هر تابعی اشغال می کنه رو بر گردونه.

vcldeveloper
دوشنبه 27 مهر 1388, 17:59 عصر
تابع Length طول یک آرایه رو میده نه اندازش رو منظورم از اندازه حجمیه که اشغال می کنه.
حجم آرایه شما مساوی هست با طول آن ضربدر طول داده ایی که در هر خانه از آرایه قرار میگیره.


TMemoryStream داده ها رو خراب می کنه چون آرایه ی من داینامیکه .
خراب میکنه؟! من خودم بارها آرایه دینامیک را در Stream ریختم. شما احتمالا نحوه انجام کار را بلد نیستید. کدی که برای این کار نوشتید و فکر می کنید داده شما را خراب کرد، اینجا بزارید.

MohsenTi
سه شنبه 28 مهر 1388, 01:46 صبح
Var
Mem:TMemoryStream;
ALength:Integer;
Begin
Mem:=TMemoryStream.Create;
ALength:=0;
ALength:=Length(UserAccess);
Mem.Clear;
Mem.Write(Main.UserAccess,ALength);
Users.T_Users_PAccess.LoadFromStream(Mem);
Users.T_Users_P.Post;
Mem.Free;

آرایه من هم که همون UserAccess هست اینه

UserAccess:array of TUserAccess;
TUserAccess هم یه رکورد که اینه

TUserAccess=record
Index:Integer;
Caption:string;
Access:Boolean;
end;

vcldeveloper
سه شنبه 28 مهر 1388, 02:22 صبح
باید اولین خانه آرایه را به متد Write ارسال کنید، نه خودِ آرایه را، در پست قبلی گفتم که آرایه دینامیک فقط یک اشاره گر به یک ساختار داده در حافظه Heap هست، اگر شما متغیر آرایه دینامیک را به تابع Write ارسال کنید، فقط آدرس ذخیره شده در اشاره گر مورد نظر در Stream ذخیره میشه.


Mem.Write(Main.UserAccess[0], ALength);

همچین پارامتر دوم متد Write اندازه بافر را براساس بایت میخواد، شما فقط دارید تعداد عناصر آرایه را به آن ارسال می کنید، باید تعداد عناصر را ضربدر اندازه TUserAccess کنید:


ALength := Length(UserAccess) * SizeOf(TUserAccess);

MohsenTi
سه شنبه 28 مهر 1388, 08:50 صبح
شما احتمالا نحوه انجام کار را بلد نیستی
حق با شما بود.