PDA

View Full Version : اشکال در اشاره گر TMemoryStream



ابوالفضل عباسی
سه شنبه 01 فروردین 1396, 22:16 عصر
سلام خدمت دوستان.
بنظر شما کد زیر مشکلی دارد؟

برنامه درست کار میکند اما زمانی که برنامه در حافظه پردازشی انجام میدهد،تصویر خروجی(image2) در تایمر درست کار نمی کند.
برای رفع این مشکل چه باید کرد؟

باتشکر


..
.
var
a:array of ^TMemoryStream;
b:array of TMemoryStream;








procedure TForm1.button1onclick(sender:Tobject);
var i:integer;
begin
for i:=1 to 10 do
begin
SetLength(a,i+1);
SetLength(b,i+1);
b[i]:=TMemoryStream.Create;
Image1.picture.bitmap.savetostream(b[i]);
b[i].position:=0;
a[i]:=@b[i];
image2.picture.bitmap.LoadFromStream(a[i]^);
end;
//حذف سلول پنجم
for i := 5 to 9 do
begin
a[i]:=a[i+1];
end;
Timer1.Enabled:=true;
end;


procedure TForm1.Timer1Timer(Sender: TObject);
begin
image2.picture.bitmap.LoadFromStream(a[6]^);
Timer1.Enabled:=false;
end;

بهروز عباسی
یک شنبه 06 فروردین 1396, 00:27 صبح
موقع ساخت ارایه بجایی اینکه داخل حلقه SetLength بزاری قبل از حلقه به تعداد 10 تا یا n تا رو SetLength کن بعد داخل حلقه ابجکت ها رو بساز.

ابوالفضل عباسی
یک شنبه 06 فروردین 1396, 10:29 صبح
ممنون از پاسخ.
ولی مشکل از این نیست.
مشکل در آن است،TmemoryStream با اشاره گر (pointer) سازگار نیست و محتوا رو تغییر می دهد.راه حلی برای این مشکل وجود ندارد؟:گریه:

Mahmood_M
سه شنبه 08 فروردین 1396, 15:53 عصر
مشکل در آن است،TmemoryStream با اشاره گر (pointer) سازگار نیست و محتوا رو تغییر می دهد.راه حلی برای این مشکل وجود ندارد؟
"سازگار نیست" و "محتوا رو تغییر می دهد" یعنی چی ؟

برنامه درست کار میکند اما زمانی که برنامه در حافظه پردازشی انجام میدهد،تصویر خروجی(image2) در تایمر درست کار نمی کند و خطا می دهد
"تصویر خروجی(image2) در تایمر درست کار نمی کند" یعنی چی ؟
چه خطایی میده ؟ متن خطا رو باید بذارید
...
استفاده از SetLength به اون صورت در داخل حلقه for منطقی نیست، دلیل این کار چیه ؟

لطفا سئوال رو درست و با توضیح کافی بپرسید تا جواب درستی بگیرید

ابوالفضل عباسی
دوشنبه 14 فروردین 1396, 14:55 عصر
شما اگر یکبار کد رو اجرا کنید متوجه منظورم می شدید.

1-"سازگار نیست"و"محتوا را تغییر میدهد" یعنی اینکه اصلا خروجی مطابق با الگوریتم نیست(وقتی روی کاغذ پیاده میکنی باید خروجی رو بدهد)
2- image 2 اصلا خروجی نمی دهد.پیغام خطایی در کار نیست.
3-حالا به فرض اینکه setlength رو بیرون حلقه بگذاریم،اما باز هم تغییری حاصل نمی شود.

کامل تر از این توضیح نمی توان داد.

Felony
سه شنبه 15 فروردین 1396, 21:47 عصر
با این مدل سوال پرسیدن نباید هم جوابی بگیری .
کار نمیکنه و و سازگار نیست و محتوا رو تغییر میده سوال نشد .
بگو کدت قراره چه کاری انجام بده و نمیده ، چه کار غیر منطقی انجام میده ، چطور مشکلت رو میشه reproduce کرد !

علی ایحال تو تایمر چک کن که Image خالی نباشه و بعد سعی کن بریزیش تو اون خونه آرایه ! کدی که نوشتی وقتی تایمر فعال باشه و برنامه رو اجرا کنی اگر خطا نده باید تعجب کنی !


if (not Image2.picture.bitmap.Empty) then
Image2.picture.bitmap.savetostream(a[6]^);

ابوالفضل عباسی
چهارشنبه 16 فروردین 1396, 10:20 صبح
من به چه زبانی بگم،اصلا خطا و ارور نمی دهد.از روی منطق باید image2 تصویر image1 رو خروجی بده.(چون تمام درایه های این آرایه، Stream شده تصویر image1 است پس باید در loadFromStream تصویر image1 رو در image2 بریزه)

این سوال رو رها کنید و به این سوال پاسخ دهید.

آیا میشه TmemoryStream رو به صورت Pointer از نوع Global تعریف کرد؟ (ممنون میشم جواب بدهید)

تشکر

Felony
چهارشنبه 16 فروردین 1396, 11:17 صبح
سوالت از پایه و اساس مشکل داره ؛


آیا میشه TmemoryStream رو به صورت Pointer از نوع Global تعریف کرد؟ (ممنون میشم جواب بدهید)
TMemoryStream در درخت ثوارثش در آخر ختم به TObject میشه ، پس چیزی که داری میسازی یک object هست ( بماند که همون کلاس بودنش کفایت میکنه ) ، Object یک حافظه اختصاصی در حافظه اختصاص داده شده به پروسه برای خودش داره که Memory Manager وظیفه مدیریتش رو بر عهده داره . پس تا اینجی کار هیچ مشکلی نیست .

کاری که داری میکنی این هست که یه سری آبجکت MemoryStream میسازی و بعد آدرسشون رو میریزی تو یه ارایه از نوع پوینتر ... پس بازم مشکلی نیست .

کد قبلیت مشکل داشت و دوباره SaveToStream زده بودی که باید هم لود نمیکرد تصویر رو در image2 که الان ویرایشش کردی درست شد .
کدی که ویرایش کردی و گذاشتی الان درست هست و کار میکنه ؛ حالا این قسمت سوالت که ویرایش کردی رو توضیح بده "اما زمانی که برنامه در حافظه پردازشی انجام میدهد" ؛ خوب یعنی چه پردازشی ، گفتم شرط حل مشکلت قابل بازسازی بودنش هست ، چی کار کنیم که برای ما هم لود نشه و به مشکل بخوره ؟!

ابوالفضل عباسی
چهارشنبه 16 فروردین 1396, 11:34 صبح
آره کد رو اشتباه توی تاپیک نوشتم.الان درسته.
الان حتی حافظه هم خالی باشه تصویر نمیده.در هر شرایطی(برای شما image 2 رو نمایش میده؟)

توضیح اینکه چه موقع تصویر نمیداد سخته.بگیر نگیر داشت.ولی قبلا اگر دلفی رو روی کامپایل قرار میدادی ram که روی 500 MB Used میرفت اون موقع تصویر نمیداد.ولی الان هیچی نمیده.

Felony
پنج شنبه 17 فروردین 1396, 13:48 عصر
برای من بدون مشکل کار میکنه .
کد ضمیمه نمونه ای هست که برای من کار میکنه ، اگر نمیتونید خروجی مناسب بگیرید باید جای دیگری دنبال مشکل باشید که ممکنه روی کد شما side effect هایی داره .