Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.11.2008, 17:32   #1
Deiv
 
Регистрация: 09.11.2008
Сообщений: 8
Стрелка Движение с Миганиями?

Здравствуйте,
У следующего кода есть эффект рисования текста в движении на любом объекте TForm; этот функционирует верно, но если я ввожу TImage фона (background) TForm, Delphi показывает мне ошибку на этой линии:
Border: = BorderWidth + 3;
ERROR
raised exception EAccess Violation

Код:
PaintTo (Bitmap. Canvas, Left, Top);//Draw the border
=> Border: = BorderWidth + 3;
       BitBlt (Bitmap. Canvas. Handle, Left + Border, Top + Border, Width - Border * 2, Height - Border * 2, Canvas. Handle, Left + Border, Top + Border, SRCCOPY);//and the content
Как решать это ERROR?

.
Код:
unit MIMOuse;

interface

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

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Button1: TButton;
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Step: Double=0;
  Bitmap: TBitmap;
  Circle: array [0..255] of TPoint;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 Timer1.Interval := 33;
 Bitmap := TBitmap.Create;
 Bitmap.Width := ClientWidth;
 Bitmap.Height := ClientHeight;
 Bitmap.Canvas.Brush.Color := Color;
 Caption:= 'The New custom Cursor ';
end;

procedure TForm1.FormPaint(Sender: TObject);
var DestDC: Cardinal;
begin
 DestDC := GetWindowDC(Handle);
 BitBlt(DestDC, ClientOrigin.X - Left, ClientOrigin.Y - Top, Bitmap.Width, Bitmap.Height, Bitmap.Canvas.Handle, 0, 0, SRCCOPY);
 ReleaseDC(Handle, DestDC);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
 Size: Double;
 Value: TPoint;
 Index, Border: Integer;
begin
 Size := 360 / Length(Caption);
 with Bitmap.Canvas do
  begin
   FillRect(Classes.Rect(0, 0, Bitmap.Width, Bitmap.Height));
   for Index := 0 to ControlCount - 1 do
    with TWinControl(Controls[Index]) do
     if Visible then
      begin
       Repaint;
       PaintTo(Bitmap.Canvas, Left, Top); // Draw the border
       Border := BorderWidth + 3;
       BitBlt(Bitmap.Canvas.Handle, Left + Border, Top + Border, Width - Border * 2, Height - Border * 2, Canvas.Handle, Left + Border, Top + Border, SRCCOPY); // and the content
      end;
   SetBkMode(Handle, TRANSPARENT);
   for Index := 1 to Length(Caption) do
   begin
    with Circle[Index] do
     begin
      if Index < 1 then
        Value := Circle[Index - 1]
      else
        Value := ScreenToClient(Mouse.CursorPos);
      Inc(X, Round((Value.X - X) * 0.6));
      Inc(Y, Round((Value.Y - Y) * 0.6));
      TextOut(X + Round(66 * Cos(Step + Index * Size * (Pi / 180))),
              Y + Round(66 * Sin(Step + Index * Size * (Pi / 180))),
              Caption[Index]);
     end;
    end;
  end;
 FormPaint(nil);
 Step := Step - 0.06;
end;
end.
Как Новичок я попытался решить таким образом:
Я разместил TPanel такую (собственность Align=AllClient) как фон TForm'a и этот в свою очередь содержит TImage (собственность Align=AllClient; stretch=true), эффект работает нормально но медленнo, и у него есть проблема с перекрашенным, а именно очевидно много МИГАНИЕ, и медленнo.
Mне нужно в том, чтобы разместить в этом коде TImage как фон в TForm и также мне нужно, чтобы оно функционировало без миганий, Как?
Как решать и предотвращать это Мигание после того, когда повторно рисовано?
Как решать это без миганий?
Мигание, Мигание.......


The following code has a effect to redraw a text in movement on any object of the TForm; this it works perfectly, but if I introduce a TImage in background TForm's, Delphi shows me an error in this line:
Border: = BorderWidth + 3
ERROR
raised exception EAccess Violation
As Beginner I have tried to solve this way:
I have placed a TPanel (property Align=AllClient) as background of the Form and east in turn contains the TImage (property Align=AllClient; stretch= true), the one effect works normal but slowly, and it has a problem with the one repainted, that is to say a lot of TWINKLING (BLINKKINGS) and slowly.
I need to place in this code a background TImage in the TForm and I need that it works without twinklings, How?
How to solve and without blinkings to the redraw, please?

Последний раз редактировалось rpy3uH; 16.11.2008 в 16:12.
Deiv вне форума Ответить с цитированием
Старый 09.11.2008, 19:12   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Ну, во первых, на случай изменения размера окна:
Код:
procedure TForm1.FormPaint(Sender: TObject);
var DestDC: Cardinal;
begin
 Bitmap.Width := ClientWidth;
 Bitmap.Height := ClientHeight;
 DestDC := GetWindowDC(Handle);
 BitBlt(DestDC, ClientOrigin.X - Left, ClientOrigin.Y - Top, Bitmap.Width, Bitmap.Height, Bitmap.Canvas.Handle, 0, 0, SRCCOPY);
 ReleaseDC(Handle, DestDC);
end;
Во-вторых, на скорую руку, без фонового TImage:
Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
Timer1.Interval := 33;
Timer1.Enabled:=True;
 Bitmap := TBitmap.Create;
 Bitmap.Width := ClientWidth;
 Bitmap.Height := ClientHeight;
 Bitmap.LoadFromFile('имя файла ВМР');
 //Bitmap.Canvas.Brush.Color := Color;
 Caption:= 'The New custom Cursor ';
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var Size: Double;
 Value: TPoint;
 Index, Border: Integer;
begin
 Size := 360 / Length(Caption);
 with Bitmap.Canvas do
  begin
   //FillRect(Classes.Rect(0, 0, Bitmap.Width, Bitmap.Height));
   Bitmap.LoadFromFile('имя файла ВМР');
...
mihali4 вне форума Ответить с цитированием
Старый 10.11.2008, 01:27   #3
Deiv
 
Регистрация: 09.11.2008
Сообщений: 8
По умолчанию И раствор моей проблемы?

Здравствуйте, это мой 2-ой post в Форуме, привет во все, я из Боливии - Юг Америка.
Спасибо за ответ, но....
Ваш код ИСПРАВИТ МИГАНИЕ, которое у меня есть в этой программе?, или ... просто Вы показали меня: какого способа вводить Образ и его свойства через код?
Цитата:
Сообщение от Deiv
но если я ввожу TImage фона (background) TForm, Delphi показывает мне ошибку
Цитата:
Сообщение от Deiv
и у него есть проблема с перекрашенным, а именно очевидно много МИГАНИЕ, и медленнo.
Mне нужно в том, чтобы разместить в этом коде TImage как фон в TForm и также мне нужно, чтобы оно функционировало без миганий, Как?
Mне нужно исправлять мой источник программы для того, чтобы оно функционировало без миганий пожалуйста.

Thanks for answering, but.... Do CORRECT your code THE BLINKING that I have in my program?, or ... simply you showed me: of what way to introduce an Image and theirs properties across code?
I need how to correct my source of the program so that it works without blinkings please.

Последний раз редактировалось Deiv; 10.11.2008 в 01:38.
Deiv вне форума Ответить с цитированием
Старый 10.11.2008, 01:40   #4
Terran
Участник клуба
 
Аватар для Terran
 
Регистрация: 28.11.2007
Сообщений: 1,521
По умолчанию

Цитата:
Сообщение от Deiv Посмотреть сообщение
Здравствуйте, это мой 2-ой post в Форуме, привет во все, я из Боливии - Юг Америка.
Спасибо за ответ, но....
Ваш код ИСПРАВИТ МИГАНИЕ, которое у меня есть в этой программе?, или ... просто Вы показали меня: какого способа вводить Образ и его свойства через код?
Mне нужно исправлять мой источник программы для того, чтобы оно функционировало без миганий пожалуйста.

Thanks for answering, but.... Do CORRECT your code THE BLINKING that I have in my program?, or ... simply you showed me: of what way to introduce an Image and theirs properties across code?
I need how to correct my source of the program so that it works without blinkings please.
Если я вас правильно понял, то что бы не было миганий вам нужно добавить одну строчку кода:
Код:
Procedure TForm1.FormCreate(Sender: TObject);
Begin
Form1.DoubleBuffered:=True;
...
End;
Всегда рад помочь!
Terran вне форума Ответить с цитированием
Старый 10.11.2008, 02:03   #5
Deiv
 
Регистрация: 09.11.2008
Сообщений: 8
По умолчанию

дa, Вы хорошо поняли,
Код:
Procedure TForm1.FormCreate(Sender: TObject);
Begin
Form1.DoubleBuffered:=True;
...
End;
Спасибо, но только однa линия? Так просто и это всл? Вы это попробовали вводя TIMage как фон в моeй программe?.
В данном моменте Я нахожусь в Cybere и в этом моменте у меня нет Delphi. Я это попробую позже.

Последний раз редактировалось Deiv; 10.11.2008 в 02:06.
Deiv вне форума Ответить с цитированием
Старый 10.11.2008, 02:11   #6
Terran
Участник клуба
 
Аватар для Terran
 
Регистрация: 28.11.2007
Сообщений: 1,521
По умолчанию

Цитата:
Вы это попробовали вводя TIMage как фон в моeй программe?.
Пробовал. При изменении размеров формы миганий нет.
Всегда рад помочь!
Terran вне форума Ответить с цитированием
Старый 10.11.2008, 02:21   #7
Deiv
 
Регистрация: 09.11.2008
Сообщений: 8
По умолчанию

Спасибо: и почему ошибка в линии?:
Код:
Border: = BorderWidth + 3;
c TImage?
Существует какой-то способ исправления в этой линии, пожалуйста?
Deiv вне форума Ответить с цитированием
Старый 10.11.2008, 11:37   #8
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
почему ошибка в линии?:
Border: = BorderWidth + 3;
Ошибка в предыдущей строке, т.е.
ERROR AT PaintTo(Bitmap.Canvas, Left, Top); // Draw the border

А как исправить, я вам уже написал.
mihali4 вне форума Ответить с цитированием
Старый 10.11.2008, 20:55   #9
Deiv
 
Регистрация: 09.11.2008
Сообщений: 8
По умолчанию

Цитата:
Сообщение от mihali4
Если я вас правильно понял, то что бы не было миганий вам нужно добавить одну строчку кода:
Код:
Procedure TForm1.FormCreate(Sender: TObject);
Begin
Form1.DoubleBuffered:=True;
...
End;
Я попробовал код, и очевидно если меняется размер в более маленький TForm почти (только почти) оно функционирует хорошо, но что будет если Mне будь нужно в том большом или максимизированном TForm?
Я думаю, что не должeм зависеть от размера окон правда?, и реализовывать программы с маленькими окнами?.

Не будет другого раствора?
Не будет другого способа получения этой программы, но с фоном Образа?
Deiv вне форума Ответить с цитированием
Старый 10.11.2008, 21:28   #10
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Это писал не я.
Мой способ - пост N 2.
mihali4 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Движение окружности Ensoph Помощь студентам 4 25.09.2008 12:11
Движение песка Format C: Общие вопросы Delphi 11 26.06.2008 16:18
Движение картинки &RiU Помощь студентам 2 28.05.2008 23:46
движение по эллипсу Оля Помощь студентам 2 08.05.2007 00:50
Движение Mickle Общие вопросы Delphi 5 19.04.2007 23:24