اشکال در اشاره گر TMemoryStream
سلام خدمت دوستان.
بنظر شما کد زیر مشکلی دارد؟
برنامه درست کار میکند اما زمانی که برنامه در حافظه پردازشی انجام میدهد،تصویر خروجی(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;
نقل قول: اشکال در اشاره گر TMemoryStream
موقع ساخت ارایه بجایی اینکه داخل حلقه SetLength بزاری قبل از حلقه به تعداد 10 تا یا n تا رو SetLength کن بعد داخل حلقه ابجکت ها رو بساز.
نقل قول: اشکال در اشاره گر TMemoryStream
ممنون از پاسخ.
ولی مشکل از این نیست.
مشکل در آن است،TmemoryStream با اشاره گر (pointer) سازگار نیست و محتوا رو تغییر می دهد.راه حلی برای این مشکل وجود ندارد؟:گریه:
نقل قول: اشکال در اشاره گر TMemoryStream
نقل قول:
مشکل در آن است،TmemoryStream با اشاره گر (pointer) سازگار نیست و محتوا رو تغییر می دهد.راه حلی برای این مشکل وجود ندارد؟
"سازگار نیست" و "محتوا رو تغییر می دهد" یعنی چی ؟
نقل قول:
برنامه درست کار میکند اما زمانی که برنامه در حافظه پردازشی انجام میدهد،تصویر خروجی(image2) در تایمر درست کار نمی کند و خطا می دهد
"تصویر خروجی(image2) در تایمر درست کار نمی کند" یعنی چی ؟
چه خطایی میده ؟ متن خطا رو باید بذارید
...
استفاده از SetLength به اون صورت در داخل حلقه for منطقی نیست، دلیل این کار چیه ؟
لطفا سئوال رو درست و با توضیح کافی بپرسید تا جواب درستی بگیرید
نقل قول: اشکال در اشاره گر TMemoryStream
شما اگر یکبار کد رو اجرا کنید متوجه منظورم می شدید.
1-"سازگار نیست"و"محتوا را تغییر میدهد" یعنی اینکه اصلا خروجی مطابق با الگوریتم نیست(وقتی روی کاغذ پیاده میکنی باید خروجی رو بدهد)
2- image 2 اصلا خروجی نمی دهد.پیغام خطایی در کار نیست.
3-حالا به فرض اینکه setlength رو بیرون حلقه بگذاریم،اما باز هم تغییری حاصل نمی شود.
کامل تر از این توضیح نمی توان داد.
نقل قول: اشکال در اشاره گر TMemoryStream
با این مدل سوال پرسیدن نباید هم جوابی بگیری .
کار نمیکنه و و سازگار نیست و محتوا رو تغییر میده سوال نشد .
بگو کدت قراره چه کاری انجام بده و نمیده ، چه کار غیر منطقی انجام میده ، چطور مشکلت رو میشه reproduce کرد !
علی ایحال تو تایمر چک کن که Image خالی نباشه و بعد سعی کن بریزیش تو اون خونه آرایه ! کدی که نوشتی وقتی تایمر فعال باشه و برنامه رو اجرا کنی اگر خطا نده باید تعجب کنی !
if (not Image2.picture.bitmap.Empty) then
Image2.picture.bitmap.savetostream(a[6]^);
نقل قول: اشکال در اشاره گر TMemoryStream
من به چه زبانی بگم،اصلا خطا و ارور نمی دهد.از روی منطق باید image2 تصویر image1 رو خروجی بده.(چون تمام درایه های این آرایه، Stream شده تصویر image1 است پس باید در loadFromStream تصویر image1 رو در image2 بریزه)
این سوال رو رها کنید و به این سوال پاسخ دهید.
آیا میشه TmemoryStream رو به صورت Pointer از نوع Global تعریف کرد؟ (ممنون میشم جواب بدهید)
تشکر
نقل قول: اشکال در اشاره گر TMemoryStream
سوالت از پایه و اساس مشکل داره ؛
نقل قول:
آیا میشه TmemoryStream رو به صورت Pointer از نوع Global تعریف کرد؟ (ممنون میشم جواب بدهید)
TMemoryStream در درخت ثوارثش در آخر ختم به TObject میشه ، پس چیزی که داری میسازی یک object هست ( بماند که همون کلاس بودنش کفایت میکنه ) ، Object یک حافظه اختصاصی در حافظه اختصاص داده شده به پروسه برای خودش داره که Memory Manager وظیفه مدیریتش رو بر عهده داره . پس تا اینجی کار هیچ مشکلی نیست .
کاری که داری میکنی این هست که یه سری آبجکت MemoryStream میسازی و بعد آدرسشون رو میریزی تو یه ارایه از نوع پوینتر ... پس بازم مشکلی نیست .
کد قبلیت مشکل داشت و دوباره SaveToStream زده بودی که باید هم لود نمیکرد تصویر رو در image2 که الان ویرایشش کردی درست شد .
کدی که ویرایش کردی و گذاشتی الان درست هست و کار میکنه ؛ حالا این قسمت سوالت که ویرایش کردی رو توضیح بده "اما زمانی که برنامه در حافظه پردازشی انجام میدهد" ؛ خوب یعنی چه پردازشی ، گفتم شرط حل مشکلت قابل بازسازی بودنش هست ، چی کار کنیم که برای ما هم لود نشه و به مشکل بخوره ؟!
نقل قول: اشکال در اشاره گر TMemoryStream
آره کد رو اشتباه توی تاپیک نوشتم.الان درسته.
الان حتی حافظه هم خالی باشه تصویر نمیده.در هر شرایطی(برای شما image 2 رو نمایش میده؟)
توضیح اینکه چه موقع تصویر نمیداد سخته.بگیر نگیر داشت.ولی قبلا اگر دلفی رو روی کامپایل قرار میدادی ram که روی 500 MB Used میرفت اون موقع تصویر نمیداد.ولی الان هیچی نمیده.
1 ضمیمه
نقل قول: اشکال در اشاره گر TMemoryStream
برای من بدون مشکل کار میکنه .
کد ضمیمه نمونه ای هست که برای من کار میکنه ، اگر نمیتونید خروجی مناسب بگیرید باید جای دیگری دنبال مشکل باشید که ممکنه روی کد شما side effect هایی داره .