![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Предосмотр картинки на форме [D7, XP]
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 класс.