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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.09.2015, 14:02   #11
spirit-ua
Форумчанин
 
Аватар для spirit-ua
 
Регистрация: 04.06.2009
Сообщений: 351
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Нужно FP.X и FP.Y пересчитывать для отрицательных, а не просто X и Y туда. Например их знак менять, хотя это не совсем точно
в каком месте? не получается
Мне разрешено открывать только одну страницу - about :blank. Сперва было скучно, но потом я втянулся. Теперь у меня там живет 2 виртуальных друга, и я слышу голоса из розетки!
spirit-ua вне форума Ответить с цитированием
Старый 10.09.2015, 21:22   #12
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
  FLeft:=Image3.Left;
  FTop:=Image3.Top;
  FWidth:=Image3.Width;
  FHeight:=Image3.Height;
  DoubleBuffered:=True;
end;

procedure TForm1.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;
   FDeltaLeft:=Image3.Width-X;
   FDeltaTop:=Image3.Height-Y;
  end;
end;

procedure TForm1.Image3MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if FDragging then begin
    FWidth:=FWidth+X-FP.X;
    FHeight:=FHeight+Y-FP.Y;
    Image3.Width:=Abs(FWidth);
    if FWidth>=0 then begin Image3.Left:=FLeft;        FP.X:=FWidth-FDeltaLeft; end
                 else begin Image3.Left:=FLeft+FWidth; FP.X:=FDeltaLeft; end;
    Image3.Height:=Abs(FHeight);
    if FHeight>=0 then begin Image3.Top:=FTop;         FP.Y:=FHeight-FDeltaTop; end
                  else begin Image3.Top:=FTop+FHeight; FP.Y:=FDeltaTop; end;
  end;
end;

procedure TForm1.Image3MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 FDragging := False;
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 11.09.2015, 08:37   #13
spirit-ua
Форумчанин
 
Аватар для spirit-ua
 
Регистрация: 04.06.2009
Сообщений: 351
По умолчанию

Бомба!

Arigato, Аватар большое спасибо!!! весы наклонил
Мне разрешено открывать только одну страницу - about :blank. Сперва было скучно, но потом я втянулся. Теперь у меня там живет 2 виртуальных друга, и я слышу голоса из розетки!
spirit-ua вне форума Ответить с цитированием
Старый 11.09.2015, 09:00   #14
zvygin1964
Старожил
 
Аватар для zvygin1964
 
Регистрация: 19.06.2013
Сообщений: 2,463
По умолчанию

Уважаемый spirit-ua. Если вас не затруднит, дайте посмотреть то, что у вас получилось. У меня описанное в этом посте компилируется, но ничего не делает:
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Image3: TImage;
    procedure FormCreate(Sender: TObject);
    procedure Image3MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Image3MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure Image3MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  FLeft,FTop,FWidth,FHeight,FDeltaLeft,FDeltaTop: Integer;
   FP: TPoint;
   FDragging:Boolean;
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  FLeft:=Image3.Left;
  FTop:=Image3.Top;
  FWidth:=Image3.Width;
  FHeight:=Image3.Height;
  DoubleBuffered:=True;
end;

procedure TForm1.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;
   FDeltaLeft:=Image3.Width-X;
   FDeltaTop:=Image3.Height-Y;
  end;
end;

procedure TForm1.Image3MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if FDragging then begin
    FWidth:=FWidth+X-FP.X;
    FHeight:=FHeight+Y-FP.Y;
    Image3.Width:=Abs(FWidth);
    if FWidth>=0 then begin Image3.Left:=FLeft;        FP.X:=FWidth-FDeltaLeft; end
                 else begin Image3.Left:=FLeft+FWidth; FP.X:=FDeltaLeft; end;
    Image3.Height:=Abs(FHeight);
    if FHeight>=0 then begin Image3.Top:=FTop;         FP.Y:=FHeight-FDeltaTop; end
                  else begin Image3.Top:=FTop+FHeight; FP.Y:=FDeltaTop; end;
  end;
end;

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

end.
Репутация: полный "0"

Последний раз редактировалось zvygin1964; 11.09.2015 в 09:04.
zvygin1964 вне форума Ответить с цитированием
Старый 11.09.2015, 09:22   #15
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
if (Image3.Width-X<10) and (Image3.Height-Y<10) then
Мышку очень близко к правому нижнему углу Image. В Image какую-нибудь картинку и Stretch в true

PS переменные лучше не глобальные, а в private формы
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 11.09.2015 в 09:24.
Аватар вне форума Ответить с цитированием
Старый 11.09.2015, 10:03   #16
zvygin1964
Старожил
 
Аватар для zvygin1964
 
Регистрация: 19.06.2013
Сообщений: 2,463
По умолчанию

Получилось! Спасибо.
Репутация: полный "0"
zvygin1964 вне форума Ответить с цитированием
Старый 11.09.2015, 10:17   #17
spirit-ua
Форумчанин
 
Аватар для spirit-ua
 
Регистрация: 04.06.2009
Сообщений: 351
По умолчанию

Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Image3: TImage;
    procedure FormCreate(Sender: TObject);
    procedure Image3MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Image3MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure Image3MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

  FLeft,FTop,FWidth,FHeight,FDeltaLeft,FDeltaTop: Integer;
  FP: TPoint;
  FZ: TPoint;
  FDragging, ToMove:Boolean;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
  begin
   Image3.AutoSize := False;
   Image3.Width := 80;
   Image3.Height := 80;
   Image3.Picture.LoadFromFile(ExtractFilePath(Application.ExeName) + 'image.bmp');
   Image3.Stretch := True;
 end;

procedure TForm1.Image3MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
 begin
   if (Image3.Width-X<10) and (Image3.Height-Y<10)
     then
       begin
       FLeft:=Image3.Left;
       FTop:=Image3.Top;
       FWidth:=Image3.Width;
       FHeight:=Image3.Height;
       DoubleBuffered:=True;
       ToMove := False;

       FP.X := X;
       FP.Y := Y;
       FDragging := True;
       FDeltaLeft:=Image3.Width-X;
       FDeltaTop:=Image3.Height-Y;
       end
     else
       begin
       DoubleBuffered:=False;
       ToMove := True;
       FZ.X := X;
       FZ.Y := Y;
       end;
 end;

procedure TForm1.Image3MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
 begin
  if ToMove then
    begin
    with (Sender as TImage) do
      begin
      Left := Left + (x - FZ.X);
      Top := Top + (y - FZ.Y);
      end;
    end;

   if FDragging then begin
     FWidth:=FWidth+X-FP.X;
     FHeight:=FHeight+Y-FP.Y;
     Image3.Width:=Abs(FWidth);
     if FWidth>=0 then begin Image3.Left:=FLeft;        FP.X:=FWidth-FDeltaLeft; end
                  else begin Image3.Left:=FLeft+FWidth; FP.X:=FDeltaLeft; end;
     Image3.Height:=Abs(FHeight);
     if FHeight>=0 then begin Image3.Top:=FTop;         FP.Y:=FHeight-FDeltaTop; end
                   else begin Image3.Top:=FTop+FHeight; FP.Y:=FDeltaTop; end;
   end;
 end;

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

end.
прикрепил файл с исходникам и EXE-шником

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

Последний раз редактировалось spirit-ua; 11.09.2015 в 10:31.
spirit-ua вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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