PDA

View Full Version : پرش زیاد در حرکت دادن Image !!



Mahmood_M
دوشنبه 03 اردیبهشت 1386, 19:00 عصر
سلام
من میخوام یک TImage رو حرکت بدم ، درواقع میخوام با زیاد کردن عرض و طول اون ، یک حرکتی موقع نمایشش اضافه کنم که مثلا با افکت اجرا بشه ...
ولی مشکل اینجاست که خیلی پرش داره ...
کدی که استفاده کردم به صورت زیر بوده توی یک Timer :

procedure TMainFrm.ImgShowTimerTimer(Sender: TObject);
begin
WM := MainImg.Width;
HM := MainImg.Height;
if (WM < 580) then
begin
Inc(W, 2);
MainImg.Width := W;
if HM < 500 then
begin
Inc(H, 2);
MainImg.Height := H;
end;
end
else
begin
ImgShowTimer.Enabled := False;
MainImg.Align := alClient;
MainImg.Center := True;
end;
end;

می خوام ببینم راهی هست که این مشکل پیش نیاد یا حتما باید از کامپوننت خاصی استفاده کنم ؟
من توی کد بالا و در آخر قسمت اول شرط if ، کد MainImg.Repaint یا MainImg.Refresh رو هم نوشتم ولی جواب نداد و خیلی پرش داره ...
من Interval تایمر رو روی 2 ( 2 هزارم ثانیه ) تنظیم کردم ، ممکنه که مشکل از این بازه زمانی باشه ؟

با تشکر ...
منتظر نظر دوستان هستم ...

موفق و پیروز باشید ...

hossein taghi zadeh
دوشنبه 03 اردیبهشت 1386, 20:41 عصر
با سلام

شما برای این کار باید در هر لحظه تصویر مورد نظر خود را در یک Image دیگر رسم کنید.
با استفاده از متد

Image.Canvas.Draw(x, y, TempImg.Picture.Graphic)

vcldeveloper
سه شنبه 04 اردیبهشت 1386, 08:26 صبح
از خصوصیت DoubleBuffer مربوط به form و TImage استفاده کنید.

Valadi
سه شنبه 04 اردیبهشت 1386, 22:19 عصر
آقای کشاورز امکان داره بیشتر توضیح بدی که چه جوری استفاده کنیم


از خصوصیت DoubleBuffer مربوط به form و TImage استفاده کنید.

vcldeveloper
چهارشنبه 05 اردیبهشت 1386, 08:10 صبح
کار خاصی لازم نیست انجام بدید. فقط مقدارش را True کنید.

توضیحات از MSDN:


Double buffering uses a memory buffer to address the flicker problems
associated with multiple paint operations. When double buffering is enabled,
all paint operations are first rendered to a memory buffer instead of the
drawing surface on the screen. After all paint operations are completed,
the memory buffer is copied directly to the drawing surface
associated with it. Because only one graphics operation
is performed on the screen, the image flickering associated with
complex painting operations is eliminated.

dkhatibi
چهارشنبه 05 اردیبهشت 1386, 09:46 صبح
کار خاصی لازم نیست انجام بدید. فقط مقدارش را True کنید.

سبب کند شدن و یا مشکلی در اجرای برنامه های ویندوز می گردد یا خیر؟

Keramatifar
چهارشنبه 05 اردیبهشت 1386, 09:57 صبح
ولی من پیشنهاد می کنم که بجای Draw کردن و اذیت کردن خودت و برنامت از یکی از کامپوننتهای گرافیکی مثل ImageEn، ExtraMediaPack یا Billenium Effects استفاده کنی تا بدون هیچ دردسری ده ها افکت بسیار حرفه ای و جذاب به هر جای برنامت از جمله همین Image هات اضافه کنی

vcldeveloper
پنج شنبه 06 اردیبهشت 1386, 08:38 صبح
سبب کند شدن و یا مشکلی در اجرای برنامه های ویندوز می گردد یا خیر؟
کند نمیشه، اما حافظه بیشتری مصرف میشه.

Valadi
پنج شنبه 06 اردیبهشت 1386, 11:18 صبح
آقای کشاورز شما که فرمودید

کار خاصی لازم نیست انجام بدید. فقط مقدارش را True کنید.
آدرس دقیق این خاصیت کجاست ؟

Mahmood_M
پنج شنبه 06 اردیبهشت 1386, 13:43 عصر
سلام

آدرس دقیق این خاصیت کجاست ؟
Form1.DoubleBuffered := True ( آقای کشاورز درسته ؟ )
ولی Image این خاصیت رو نداره !
با این حال بازم پرش داشت !!

از کامپوننت BellineiumEffect استفاده کردم ، ولی فقط تونستم برای فرم ازش استفاده کنم ، از کامپوننت Panel ای که داره ( EffectPanel ) چطوری اید استفاده کرد ؟

با تشکر ...
موفق باشید ...

vcldeveloper
جمعه 07 اردیبهشت 1386, 09:15 صبح
بله، همون DoubleBuffered مربوط به Form.
یک مثال ساده از Drag کردن تصویر روی فرم:


procedure TForm1.FormDragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
Accept := (Source is TImage);
if Accept then
with (Source as TImage) do
begin
Left := x;
Top := y;
end;
end;

procedure TForm1.Image1DragOver(Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
Accept := (Source = Sender) and (State = dsDragMove);
if Accept then
begin
(Sender as TImage).Left := (Sender as TImage).Left + X;
(Sender as TImage).Top := (Sender as TImage).Top + Y;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
DoubleBuffered := True;
end;