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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.08.2011, 16:05   #1
Русик123
 
Регистрация: 09.08.2011
Сообщений: 7
По умолчанию не получается выделить область изображения

Пытаюсь выделить область на картинке подобным образом а он ругается

Код:
var
  F_Skrin: TF_Skrin;
  MYBMP: TBitMap;
  Xi, Yi: Integer;
  XPred, YPred: Integer;
  MyRect: TRect;
  ZoneSelected: boolean = false;
  MoveZoneSelected: boolean = false;
  dtc: TCanvas;
  wid, het: LongInt;
  mastab: byte;
  Image: TImage;
.......
procedure TF_Skrin.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Xi := X;
  Yi := Y;
  if (ZoneSelected) and (X > MyRect.Left) and (X < MyRect.Right) and
    (Y > MyRect.Top) and (Y < MyRect.Bottom) then
    MoveZoneSelected := true
  else
  begin
    Image1.Picture.Bitmap.canvas.copyrect(MyRect, dtc, MyRect);
    MoveZoneSelected := false;  //в этом месте 
  end;
end;

procedure TF_Skrin.Image1MouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
begin
  MYBMP := Image1.Picture.Bitmap;
  if (ZoneSelected) and (X > MyRect.Left) and (X < MyRect.Right) and
    (Y > MyRect.Top) and (Y < MyRect.Bottom) then
    Image1.Cursor := crMove
  else
    Image1.Cursor := crCross;
  if (ssLeft in Shift) then
    if (MoveZoneSelected) then
    begin
      Image1.canvas.copyrect(MyRect, dtc, MyRect);
      if (MyRect.Left + (X - XPred) >= 0) and
        (MyRect.Right + (X - XPred) <= Image1.Width) then
      begin
        MyRect.Left := MyRect.Left + (X - XPred);
        MyRect.Right := MyRect.Right + (X - XPred);
      end;
      if (MyRect.Top + (Y - YPred) >= 0) and
        (MyRect.Bottom + (Y - YPred) <= Image1.Height) then
      begin
        MyRect.Top := MyRect.Top + (Y - YPred);
        MyRect.Bottom := MyRect.Bottom + (Y - YPred);
      end;
      Image1.canvas.FrameRect(MyRect);
    end
    else
    begin
      Image1.canvas.copyrect(MyRect, Image1.Picture.Bitmap.canvas, MyRect);
      if not((Xi = X) or (Yi = Y)) then
      begin
        if (Xi < X) and (Yi < Y) then
          MyRect := rect(Xi, Yi, X, Y)
        else if (Xi < X) and (Yi > Y) then
          MyRect := rect(Xi, Y, X, Yi)
        else if (Xi > X) and (Yi < Y) then
          MyRect := rect(X, Yi, Xi, Y)
        else if (Xi > X) and (Yi > Y) then
          MyRect := rect(X, Y, Xi, Yi);
        if MyRect.Left < 0 then
          MyRect.Left := 0
        else if MyRect.Right > Image1.Width then
          MyRect.Right := Image1.Width;
        if MyRect.Top < 0 then
          MyRect.Top := 0
        else if MyRect.Bottom > Image1.Height then
          MyRect.Bottom := Image1.Height;

        ZoneSelected := true;
        Image1.canvas.Pen.Width := 1;
        Image1.canvas.Pen.Style := psSolid;
        Image1.canvas.Pen.Color := clBlue;
        Image1.canvas.Pen.Mode := pmNotXor;
        Image1.canvas.Pen.Style := psDot;
        Image1.canvas.Brush.Style := bsClear;
        Image1.canvas.Rectangle(MyRect.Left, MyRect.Top, MyRect.Right,
          MyRect.Bottom);
      end;
    end;
  XPred := X;
  YPred := Y;

end;

procedure TF_Skrin.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 if (X = Xi) and (Y = Yi) then
  begin
    Image1.canvas.copyrect(MyRect, dtc, MyRect);
    Image1.Cursor := crCross;
    ZoneSelected := false;
    MoveZoneSelected := false;
  end;
end;
(Image1.Picture.Bitmap.canvas.copyr ect(MyRect, dtc, MyRect);
MoveZoneSelected := false;
end а он ругается в этом месте что делать как быть?
Русик123 вне форума Ответить с цитированием
Старый 10.08.2011, 08:11   #2
Русик123
 
Регистрация: 09.08.2011
Сообщений: 7
По умолчанию

я что как то не правильно задал вопрос?
Русик123 вне форума Ответить с цитированием
Старый 10.08.2011, 10:39   #3
x128
Форумчанин
 
Регистрация: 03.02.2010
Сообщений: 178
По умолчанию

а как "ругается"? и где создается "dtc"?
x128 вне форума Ответить с цитированием
Старый 10.08.2011, 11:19   #4
Русик123
 
Регистрация: 09.08.2011
Сообщений: 7
По умолчанию

Цитата:
Сообщение от x128 Посмотреть сообщение
а как "ругается"? и где создается "dtc"?
---------------------------
SmarTeam Kit
---------------------------
Access violation at address 004659FC in module 'p_smarteam_kit.exe'. Read of address 00000000.
---------------------------
ОК
---------------------------


ругается так

а dtc создается при событии FormShow
Русик123 вне форума Ответить с цитированием
Старый 10.08.2011, 15:24   #5
Русик123
 
Регистрация: 09.08.2011
Сообщений: 7
По умолчанию

вопрос с выделением области решил, теперь надо выделенную область сохранить, и еще кто знает подскажите плиз как решить проблему с остаточной рамкой на изображение такое ощущение что проц не справляется! заранее благодарен
Русик123 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выделить текстовую область Krasi JavaScript, Ajax 1 12.07.2010 14:25
область видимости Dimarik Общие вопросы .NET 5 21.02.2010 21:32
Смена изображения при наведении не на белую область Alex Cones Общие вопросы Delphi 6 10.05.2009 17:17
Чтение изображения из базы данных, Вместо изображения - "System.Byte[]" ruelCrow Общие вопросы .NET 3 10.07.2008 23:29
область видимости ? artem779 Общие вопросы Delphi 3 14.09.2007 09:34