Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Предосмотр картинки на форме [D7, XP]


Страницы:   1 2

Laguna ©   (2011-11-03 11:54:00) 

В базе храню картинки. Затем реализую возможность их предосмотра в отдельной форме, на которой есть Timage со свойсвами:

Align = alClient
AutiSize = False
Proportional = True
Stretch = False
IncrementalDisplay = False

Приоткрытии формы картинка в ней пропорционально показывается, а ширина/выслта(в зависимости от картинки) не управляется, т.е. получается вот такой эффект http://s017.radikal.ru/i444/1111/17/96501bb30864.jpg.
А установка Form1.Width := Image1.Widthне дает эффекта и на создание формы вешал и на ресайз. Даже если форму в рантайм тягать мышью, то картинка пропорционально изменяется, но размеры формы под нее не подстраиваются. Вопрос в том, как сделать правильно так, чтобы при первом открытии формы каринка пропорционально размерам формы показалась в ней полностью и при этом форма должна быть размером с картинку. При максимайз формы тоже все должно соответствовать размерам друг друга.


Laguna   (2011-11-10 16:44:00) [1]


> а зачем нужен размер всей формы? Достаточно знать размеры
> клиентской области

Ну это я все из той оперы, что высчитав размер картинки подгоняю под нее форму, чтобы якобы красиво упакована картинка была при просмотре.

procedure TGladImageFrm.ShowImage;
begin
 Im_W := Image1.Picture.Width; {ширина картинки}
 Im_H := Image1.Picture.Height; {высота картинки}
 F_CW := GladImageFrm.ClientWidth; {800 - ширина формы}
 F_CH := GladImageFrm.ClientHeight;{600 - высота формы}

 if Im_W < Im_H then
  Ratio := Trunc(600 * Im_W/Im_H)
 else
  Ratio := Trunc(800 * Im_H/Im_W);

 if (Im_W < F_CW) and (Im_H < F_CH) then
  begin
    GladImageFrm.ClientWidth := Im_W;
    GladImageFrm.ClientHeight := Im_H;
  end
 else
  if (Im_W < F_CW) and (Im_H > F_CH) then
   GladImageFrm.ClientWidth := Trunc(Ratio)
 else
  if (Im_W > F_CW) and (Im_H < F_CH) then
   GladImageFrm.ClientHeight := Trunc(Ratio)
 else
  if (Im_W > F_CW) and (Im_H > F_CH) and (Im_W < Im_H) then
   GladImageFrm.ClientWidth := Trunc(Ratio)
 else
  if (Im_W > F_CW) and (Im_H > F_CH) and (Im_W > Im_H) then
   GladImageFrm.ClientHeight := Trunc(Ratio)
 else
  if (Im_W = F_CW) and (Im_H <> F_CH) then
   begin
      {Еще не придумал}
   end;
 left := (Screen.Width div 2) - (Width div 2);
 top  := (Screen.Height div 2) - (Height div 2);
end;


В этом коде tit максимайз не обработан, точнее размер картинки и формы при максимайзе.


clickmaker   (2011-11-10 16:17:00) [2]

> И что я вижу, что размер формы при максимайз больше на 8
> пикс, чем реальный размер экрана

а зачем нужен размер всей формы? Достаточно знать размеры клиентской области


Омлет   (2011-11-10 16:07:00) [3]

> Laguna ©   (10.11.11 15:43) [35]

Ну и что, что больше. Чему это мешает?


Laguna   (2011-11-10 15:59:00) [4]

Какую еще тень? Это ж размер формы больше чем размер экрана, а не наоборот.


Jeer   (2011-11-10 15:56:00) [5]

Наверное нужно "тень" отключить :)


Laguna   (2011-11-10 15:43:00) [6]

Уже разобрался, спасибо за помощь.

А вот еще один конфуз. Чтобы позиционировать правильно картинку на форме, нужно точно знать относительные размеры и экрана и формы и картинки. Есть некая форма, показанная посредине экрана. Запоминаю размеры(рис. слева). Затем форму распахиваю до максимайз и сновы вычисляю размеры(рис справа ). И что я вижу, что размер формы при максимайз больше на 8 пикс, чем реальный размер экрана.

http://s017.radikal.ru/i416/1111/32/4595d95df983.jpg

В чем просчет? И походу на разных компах эти значения могут быть разными, в звыисимости от настроек самой винды.


Anatoly Podgoretsky   (2011-11-10 15:07:00) [7]


> А дальше то что? Как программа будет контролировать эти
> события? Код незаконченный какой то. Полагаю, что еще что
> то нужно прописать на onCreate формы.

Она уже контролирует, MESSAGE + F1


Омлет   (2011-11-10 13:36:00) [8]

 TForm1 = class(TForm)
 private
   procedure WMWindowPosChanged(var Message: TWMWindowPosChanged); message WM_WINDOWPOSCHANGED;
 end;

...

procedure TForm1.WMWindowPosChanged(var Message: TWMWindowPosChanged);
const
 SWP_STATECHANGED = $8000;
begin
 inherited;
 if (Message.WindowPos^.flags and SWP_STATECHANGED <> 0) then
    case WindowState of
      wsNormal: Caption := 'Normal';
      wsMaximized: Caption := 'Maximized';
    end;
end;


Laguna   (2011-11-10 13:32:00) [9]

Ура, подобрал набор событий. Поправьте, если не все верно.

 public
   procedure WMSysCommand(var message : TMessage); message WM_SYSCOMMAND;
   procedure WMNCLBUTTONDBLCLK(var message : TMessage); message WM_NCLBUTTONDBLCLK;
   procedure WMENTERSIZEMOVE(var Message: TMessage ); message WM_ENTERSIZEMOVE;
   procedure WMEXITSIZEMOVE(var Message: TMessage ); message WM_EXITSIZEMOVE;
 end;
...

procedure TGladImageFrm.WMSysCommand(var message : TMessage) ;
begin
 inherited;
 if (message.wParam = SC_MAXIMIZE) then
   Caption := 'Это конец максимайза';
end;

procedure TGladImageFrm.WMENTERSIZEMOVE(var Message: TMessage);
begin
 Caption := 'Начало изменения размера';
end;

procedure TGladImageFrm.WMEXITSIZEMOVE(var Message: TMessage);
begin
 Caption := 'Окончание изменения размера';
end;

procedure TGladImageFrm.WMNCLBUTTONDBLCLK(var message : TMessage);
begin
 inherited;
 Caption := 'Двойной клик по шапке формы';
end;


Laguna   (2011-11-10 13:18:00) [10]

А как тогда правильно отлавливать событие максимайза(правая кнопка, двойной клик по шапке формы) и возврата к нормальному размеру?

>clickmaker ©   (10.11.11 13:01) [29]
procedure WMSysCommand(var message : TMessage); message WM_SYSCOMMAND;

procedure TForm1. WMGetSysCommand(var message : TMessage) ;
begin
 inherited;
 if (message.wParam = SC_MAXIMIZE) then
   Caption := 'Это конец максимайза';
end
;


Работает, но только по кнопке. Клик по шапке не обрабатывается.


Медвежонок Пятачок   (2011-11-10 13:09:00) [11]

чтобы отловить именно окончание максимайза формы(что мне и нужно), то нужно использовать как раз эти сообщения.


Не нужно. При максимайзе форма их не получает.


clickmaker   (2011-11-10 13:01:00) [12]

procedure WMSysCommand(var message : TMessage); message WM_SYSCOMMAND;

procedure TForm1.WMGetSysCommand(var message : TMessage) ;
begin
 inherited;
 if (message.wParam = SC_MAXIMIZE) then
   Caption := 'Это конец максимайза';
end;


Laguna   (2011-11-10 13:01:00) [13]

Кажется нашел где собака порылась, что я не видел реакции.
У меня была установка BorderStyle = bsSingle . Как только установил BorderStyle = bsSizeable - все заработало.
А для того, чтобы отловить именно окончание максимайза формы(что мне и нужно), то нужно использовать как раз эти сообщения.


Медвежонок Пятачок   (2011-11-10 12:50:00) [14]

procedure TForm1.WMENTERSIZEMOVE(var Message: TMessage);
begin
 Caption := 'Это начало изменения размера, а не начало максимайза';
end;

procedure TForm1.WMEXITSIZEMOVE(var Message: TMessage);
begin
 Caption := 'Это окончание изменения размера, а не конец максимайза формы на весь экран';
end;


Медвежонок Пятачок   (2011-11-10 12:46:00) [15]

работает все.
правда не то, что ты думаешь.
и реакция есть.


Laguna   (2011-11-10 12:42:00) [16]

Так ничего не работает, если все оставить как я показал. Никакой реакции.


clickmaker   (2011-11-10 12:40:00) [17]

> Полагаю, что еще что то нужно прописать на onCreate формы

не нужно


Laguna   (2011-11-10 12:17:00) [18]

Хочу отловить событие, точнее окончание события раскрытия формы на макс. Нашел вот такой пример

type
 TForm1 = class(TForm)
 private
   { Private declarations }
 public
   { Public declarations }
   procedure WMENTERSIZEMOVE( var Message: TMessage ); message WM_ENTERSIZEMOVE;
   procedure WMEXITSIZEMOVE( var Message: TMessage ); message WM_EXITSIZEMOVE;
 end;

implementation

procedure TForm1.WMENTERSIZEMOVE(var Message: TMessage);
begin
  Caption := 'Начало изменения размера';
end;

procedure TForm1.WMEXITSIZEMOVE(var Message: TMessage);
begin
  Caption := 'Окончание изменения размера';
end;


А дальше то что? Как программа будет контролировать эти события? Код незаконченный какой то. Полагаю, что еще что то нужно прописать на onCreate формы.


Laguna   (2011-11-03 22:27:00) [19]

> Омлет
Согласен, подзабыл слегонца... :)
Впринципе решение найдено. Высчитав к-ент пропорциональности устанавливаю размеры формы. Теперь непонятно вот что. Т.к. Image1 имеет привязку к форме alClient и Proportional = True, то подогнав ширину формы под ширину картинки с условием , что высота картинки остается  равной высоте формы по умолчанию, ширина Image1 должна стать равной ClientWidth формы. Однако цифры не равны. Почему так?
http://s011.radikal.ru/i316/1111/08/04f4be0fbd1e.jpg


Омлет   (2011-11-03 20:51:00) [20]

Арифметика, 3 класс.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо