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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.09.2015, 16:37   #1
spirit-ua
Форумчанин
 
Аватар для spirit-ua
 
Регистрация: 04.06.2009
Сообщений: 351
По умолчанию Изменение размера TImage в run-time

Всем Привет!
Код:
procedure TForm_Main.Image3MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 if (Image3.Width-X<10) and (Image3.Height-Y<10) then
  begin
   FP.X := X;
   FP.Y := Y;
   FDragging := True;
  end;
end;

procedure TForm_Main.Image3MouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
begin
 if FDragging then
  begin
   Image3.Width := Image3.Width + X-FP.X;
   Image3.Height := Image3.Height + Y-FP.Y;
   FP.X := X;
   FP.Y := Y;
  end;
end;

procedure TForm_Main.Image3MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 FDragging := False;
end;
все работает но когда ширина\высота становиться меньше единицы Image естественно "пропадает"...
Нужно сделать так когда ширина меньше... Image растягивался в "противоположную" сторону

пробовал играться с условиями (ширина < 1) но ничего не вышло
помогите, пожалуйста
Мне разрешено открывать только одну страницу - about :blank. Сперва было скучно, но потом я втянулся. Теперь у меня там живет 2 виртуальных друга, и я слышу голоса из розетки!

Последний раз редактировалось spirit-ua; 09.09.2015 в 16:42.
spirit-ua вне форума Ответить с цитированием
Старый 09.09.2015, 17:15   #2
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,569
По умолчанию

Значит надо использовать Abs, чтобы знак убрать и делать проверку, если отрицательные размеры, то менять позицию (т.к. она отсчитывается от верхнего левого угла) и отражать картинку.
Arigato вне форума Ответить с цитированием
Старый 10.09.2015, 08:35   #3
spirit-ua
Форумчанин
 
Аватар для spirit-ua
 
Регистрация: 04.06.2009
Сообщений: 351
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
Значит надо использовать Abs, чтобы знак убрать и делать проверку, если отрицательные размеры, то менять позицию (т.к. она отсчитывается от верхнего левого угла) и отражать картинку.
не совсем понял... менять позицию чего? самой картинки?

нужно уменьшать размер Image по ширине в меньшую сторону (влево) и когда ширина становится 0 то уже будет не уменьшение, а увеличение Image в противоположную сторону. не нужно перемещать Image

я так понимаю что когда ширина становится равной левой позиции (ширина равняется нулю) то нужно правую границу оставлять на позиции левой, а левую смещать влево
Код:
   if Image3.Width > 0
     then Image3.Width := Image3.Width + X-FP.X
     else Image3.Left := ...
но по этому условию как только сменится левая позиция ширина станет больше нуля... как побороть? ставить "флаг" и в зависимости от значения менять ширину или левую позицию?

помогите
Мне разрешено открывать только одну страницу - about :blank. Сперва было скучно, но потом я втянулся. Теперь у меня там живет 2 виртуальных друга, и я слышу голоса из розетки!
spirit-ua вне форума Ответить с цитированием
Старый 10.09.2015, 09:41   #4
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,569
По умолчанию

Позиция определяется левым верхним углом, именно поэтому придется двигать сам Image и менять ему размер. Тогде визуально сложится впечатление, что он растягивается в другую сторону.
Arigato вне форума Ответить с цитированием
Старый 10.09.2015, 09:46   #5
spirit-ua
Форумчанин
 
Аватар для spirit-ua
 
Регистрация: 04.06.2009
Сообщений: 351
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
Позиция определяется левым верхним углом, именно поэтому придется двигать сам Image и менять ему размер. Тогде визуально сложится впечатление, что он растягивается в другую сторону.
это я понимаю, с этим и проблема
Код:
procedure TForm_Main.Image3MouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
begin
 if FDragging then
  begin
   if flag_as = 0
     then
       begin
       if Image3.Width > 5
         then
           Image3.Width := Image3.Width + X - FP.X;
         else
           flag_as := 1;
       end
     else
       begin
       Image3.Left := ???
       Image3.Width := ???
       end;

   Image3.Height := Image3.Height + Y-FP.Y;
   FP.X := X;
   FP.Y := Y;
  end;
end;
в правильную сторону думаю? какие значения ставить?
Мне разрешено открывать только одну страницу - about :blank. Сперва было скучно, но потом я втянулся. Теперь у меня там живет 2 виртуальных друга, и я слышу голоса из розетки!
spirit-ua вне форума Ответить с цитированием
Старый 10.09.2015, 10:00   #6
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,569
По умолчанию

Как-то так:
Код:
  public
    FDragging: Boolean;
    Img3Width, Img3Height: Integer;
    Img3Pos, FP: TPoint;
  end;
Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
  FDragging:=False;
  Img3Width:=Image3.Width;
  Img3Height:=Image3.Height;
  Img3Pos.X:=Image3.Left;
  Img3Pos.Y:=Image3.Top;
end;

procedure TForm1.Image3MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  FP.X:=X;
  FP.Y:=Y;
  FDragging:=True;
end;

procedure TForm1.Image3MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  FDragging:=False;
end;

procedure TForm1.Image3MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if FDragging then begin
    Inc(Img3Width,X-FP.X);
    Inc(Img3Height,Y-FP.Y);
    FP.X:=X;
    FP.Y:=Y;
    if Img3Width<0 then
      Image3.Left:=Img3Pos.X+Img3Width
      else Image3.Left:=Img3Pos.X;
    if Img3Height<0 then
      Image3.Top:=Img3Pos.Y+Img3Height
      else Image3.Top:=Img3Pos.Y;
    Image3.Width:=Abs(Img3Width);
    Image3.Height:=Abs(Img3Height);
  end;
end;
Arigato вне форума Ответить с цитированием
Старый 10.09.2015, 10:40   #7
spirit-ua
Форумчанин
 
Аватар для spirit-ua
 
Регистрация: 04.06.2009
Сообщений: 351
По умолчанию

Arigato, то что надо, но
Код:
    if Img3Width<0 then
      Image3.Left:=Img3Pos.X+Img3Width  ???????????????????
      else Image3.Left:=Img3Pos.X;
    if Img3Height<0 then
      Image3.Top:=Img3Pos.Y+Img3Height  ???????????????????
      else Image3.Top:=Img3Pos.Y;
в строках где знаки вопроса видимо не хватает еще одной переменной т.к. при сдвиге влево/вверх после условия <0 курсов забегает левее/выше картинки, наберусь наглости еще раз попросить помочь
Мне разрешено открывать только одну страницу - about :blank. Сперва было скучно, но потом я втянулся. Теперь у меня там живет 2 виртуальных друга, и я слышу голоса из розетки!
spirit-ua вне форума Ответить с цитированием
Старый 10.09.2015, 10:58   #8
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,569
По умолчанию

А как он может на картинке оказаться? Мы же не за край хватаем, а за любое место изображения, вот и оказывается в минусе курсор за его пределами. Сами попробуйте представить, как может быть иначе.
Arigato вне форума Ответить с цитированием
Старый 10.09.2015, 11:22   #9
spirit-ua
Форумчанин
 
Аватар для spirit-ua
 
Регистрация: 04.06.2009
Сообщений: 351
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
А как он может на картинке оказаться? Мы же не за край хватаем, а за любое место изображения, вот и оказывается в минусе курсор за его пределами. Сами попробуйте представить, как может быть иначе.
в вашем примере не за край
Код:
procedure TForm1.Image3MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  FP.X:=X;
  FP.Y:=Y;
  FDragging:=True;
end;
а вот если так
Код:
procedure TForm_Main.Image3MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 if (Image3.Width-X<10) and (Image3.Height-Y<10) then
  begin
   FP.X := X;
   FP.Y := Y;
   FDragging := True;
  end;
end;
то как раз таки за правый нижний край и вправо/вниз тягается точно за курсором, а вот если уходит левее/выше начальных границ курсор забегает левее/выше самого рисунка, навернека это можно поправить
Код:
if Img3Width<0 then
      Image3.Left:=Img3Pos.X+Img3Width  ???????????????????
      else Image3.Left:=Img3Pos.X;
    if Img3Height<0 then
      Image3.Top:=Img3Pos.Y+Img3Height  ???????????????????
      else Image3.Top:=Img3Pos.Y;
только сам не соображаю
Мне разрешено открывать только одну страницу - about :blank. Сперва было скучно, но потом я втянулся. Теперь у меня там живет 2 виртуальных друга, и я слышу голоса из розетки!

Последний раз редактировалось spirit-ua; 10.09.2015 в 11:26.
spirit-ua вне форума Ответить с цитированием
Старый 10.09.2015, 11:58   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Нужно FP.X и FP.Y пересчитывать для отрицательных, а не просто X и Y туда. Например их знак менять, хотя это не совсем точно
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменение размера TImage SkOle Компоненты Delphi 3 24.09.2013 10:07
Run-time форма. ComboBox.itemindex не реагирует на изменение, баг? Человек_Борща Общие вопросы Delphi 4 03.11.2011 22:26
TImage изменение размера batrak C++ Builder 3 23.05.2011 07:40
Создание TImage в Run-time mrbadge Помощь студентам 9 03.02.2011 22:48
Изменение размера TImage alexprey Общие вопросы Delphi 4 23.06.2010 21:17