Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2012.02.19;
Скачать: [xml.tar.bz2];

Вниз

Предосмотр картинки на форме   Найти похожие ветки 

 
Laguna ©   (2011-11-03 11:54) [0]

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

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

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


 
Плохиш ©   (2011-11-03 12:01) [1]


> Stretch = True


 
И. Павел ©   (2011-11-03 12:07) [2]

Лучше делать все это вручную. Т.е. убрать у картинки align. Сперва определите размер картинки и установите такой же размер для клиентского прямоугольника формы (ClientWidth/ClientHeight). В дальнейшем отлавливайте события OnResize формы. В этом событии увеличиваете картинку так, чтобы она вписывалась в прямоугольник формы (т.е. ее ширина или высота была равна ширине/высоте формы). Потом уменьшаете форму до размера картинки. При уменьшении формы алгоритм аналогичный.


 
И. Павел ©   (2011-11-03 12:10) [3]

> [2] И. Павел ©   (03.11.11 12:07)

Ну тоесть при каждом изменении размеров формы подгоняете под нее картинку. Получится не совсем ровно, если картинка имеет другие пропорции, чем форма. Часть формы будет оставаться пустой. Поэтому потом нужно будет просто уменьшить размер формы. И не забудьте выключить обработчик OnResize внутри самого себя, иначе все это зациклится :)


 
Laguna ©   (2011-11-03 12:15) [4]

Stretch = True тоже ничего не дает, если Proportioan включен.

> И. Павел
А как тогда отлавливать соотношение пропорциональности картинки и размера формы?


 
И. Павел ©   (2011-11-03 12:29) [5]

> А как тогда отлавливать соотношение пропорциональности картинки
> и размера формы?

Ничего не нужно отлавливать. В объекте формы храните исходные Width и Height картинки (или их отношение). Этого будет достаточно, чтобы определить максимальные габариты картинки, которая впишется в форму с новыми размерами.


 
И. Павел ©   (2011-11-03 12:31) [6]

> [5] И. Павел ©   (03.11.11 12:29)

Проще говоря у вас есть картинка 10 (Width) на 20.  Форма сменила размер, став 20 на 50. Максимальный множитель, на который можно увеличить длины сторон картинки это 2. Увеличиваете картинку. теперь строны станут 20 на 40. Потом отрезаете 10 пикселей от ClientHeight формы.


 
И. Павел ©   (2011-11-03 12:37) [7]

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


 
Laguna ©   (2011-11-03 12:50) [8]

> И. Павел ©   (03.11.11 12:29) [5]

> В объекте формы храните исходные Width и Height картинки
> (или их отношение).

Не понял, откуда форма знает размер картинки? Может речь идет о Timage?

> Проще говоря у вас есть картинка 10 (Width) на 20.

Лучше не так. Возьмеме живой пример. В базе каринка в размерах 1024х768. Открываем форму, которая по умолчанию в размерах Width =850 Height=620
На форме Timage с Align = alClient(или без этого). На создании формы нужно вычислить размеры формы. Мы знаем, что Timage хранит в Picture.Bitmap.Width и высота соотв. реальные размеры загруженной картинки. Значит нужно посмотрев на размер формы высчитать какой должна быть картинка, чтобы в нее сначала вписаться пропорционально, просчитав соотношения ширин и высот, выбрать лучший вариант, который будет за основу, а второй под него подгонять(всмысле ширину или высоту)


 
MBo ©   (2011-11-03 13:00) [9]

Сделайте всё без TImage.


 
И. Павел ©   (2011-11-03 13:13) [10]

> Значит нужно посмотрев на размер формы высчитать какой должна
> быть картинка, чтобы в нее сначала вписаться пропорционально,
> просчитав соотношения ширин и высот, выбрать лучший вариант,
> который будет за основу, а второй под него подгонять(всмысле
> ширину или высоту)

Да, именно про это я и говорю.


 
Laguna ©   (2011-11-03 13:49) [11]

> MBo ©   (03.11.11 13:00) [9]

> Сделайте всё без TImage.

Каким образом? Есть предложения?


 
Омлет ©   (2011-11-03 14:09) [12]

TPaintBox + TBitmap.


 
И. Павел ©   (2011-11-03 14:19) [13]

> Каким образом? Есть предложения?

У формы есть канва. На ней можно рисовать что-нибудь напрямую. Например - вашу картинку. В обработчике события OnPaint. Исходную картинку можно держать в TBitmap.


 
Медвежонок Пятачок ©   (2011-11-03 15:03) [14]

это ненужные и малополезные действия.
надо всего лишь перед созданием формы получить размерность картинки и передавать в кастомный конструктор формы эти размеры.


 
Laguna ©   (2011-11-03 15:48) [15]

Размер картинки, находяшийся в Timage всегда будет постоянный
1) Форма загруженная по умолчанию http://s017.radikal.ru/i407/1111/15/b2787b1987f1.jpg
2) Форма сдвинута к краю картинки http://s55.radikal.ru/i147/1111/0f/afa08fc09dd1.jpg. Размер Timage только изменяется, размер картинки прежний
3) Форма уменьшена, соответственно и каринка http://s017.radikal.ru/i420/1111/e9/5adb06449933.jpg .

Следовательно размер картинки - const. Нужно варьировать размером Timage + размер формы.


 
Laguna ©   (2011-11-03 15:50) [16]

Картинка 2) не вставилась нормально http://s55.radikal.ru/i147/1111/0f/afa08fc09dd1.jpg


 
Медвежонок Пятачок ©   (2011-11-03 15:54) [17]

в чем проблема-то?

procedure ShowPic(Image: ...);
begin
with TShowPicForm.Create(nil) do
 try
  высота  := высота картинки;
  ширина := ширина картинки;
  максимальнаявысота := высота картинки;
  максимальнаяширина := ширина картинки;
  ...
  ShowModal;
 finally
 end;
end;


 
Laguna ©   (2011-11-03 16:12) [18]

В приведенном примере простая вставка картинки как есть. А если картинка размером 3072х2304 (обычное разрешение дигита с хорошим качеством) ???
Я же специально и делаю сперва форму определенного размера, а в ней Timage с Align = alClient + Proportional. Чел смотрит на картинку. Если разрешения ему мало, разворачивает форму на весь экран. Я уже нашел, что форму нужно подгонять через ClientWidth и ClientHeight.Только нужно знать какого размера Timage в данный момент и какой коэффициент отношений между реальным размером картинки и показанным на форме.


 
Плохиш ©   (2011-11-03 17:40) [19]


> Медвежонок Пятачок ©   (03.11.11 15:54) [17]
>
> в чем проблема-то?
>

Чё не понятно, программист отсутствует.

> Laguna ©   (03.11.11 16:12) [18]


> Чел смотрит на картинку. Если разрешения ему мало, разворачивает
> форму
на весь экран. Я уже нашел, что форму нужно подгонять

Как всегда телега впереди лошади. Картинку надо подгонять под форму, а не форму под картинку. Да и вообще делать ничего не нужно, всё уже реализовано в vcl.


 
Laguna ©   (2011-11-03 20:31) [20]

> Плохиш ©   (03.11.11 17:40) [19]

> Чё не понятно, программист отсутствует.

Рад за вас, что вы программист сильный.


> Картинку надо подгонять под форму, а не форму под картинку.
>  Да и вообще делать ничего не нужно, всё уже реализовано
> в vcl.

Я на китайском пишу что ли? ДА, нужно подгонять друг под друга и про том СОБЛЮСТИ ПРОПОРЦИЮ КАРТИНКИ!


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

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


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

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


 
Laguna ©   (2011-11-10 12:17) [23]

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

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 формы.


 
clickmaker ©   (2011-11-10 12:40) [24]

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

не нужно


 
Laguna ©   (2011-11-10 12:42) [25]

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


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

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


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

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

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


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

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


 
clickmaker ©   (2011-11-10 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) [30]

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


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


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

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

>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
;


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


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

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

 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;



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

 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;


 
Anatoly Podgoretsky ©   (2011-11-10 15:07) [34]


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

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


 
Laguna ©   (2011-11-10 15:43) [35]

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

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

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

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


 
Jeer ©   (2011-11-10 15:56) [36]

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


 
Laguna ©   (2011-11-10 15:59) [37]

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


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

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

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


 
clickmaker ©   (2011-11-10 16:17) [39]

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

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


 
Laguna ©   (2011-11-10 16:44) [40]


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

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

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 максимайз не обработан, точнее размер картинки и формы при максимайзе.



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2012.02.19;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.57 MB
Время: 0.005 c
2-1320820407
Юлька
2011-11-09 10:33
2012.02.19
Turbo Pascal - Композиция Двух Двумерных Массивов 100x100


15-1320092990
Юрий
2011-10-31 23:29
2012.02.19
С днем рождения ! 1 ноября 2011 вторник


6-1251739894
bodun
2009-08-31 21:31
2012.02.19
WinSock - UDP протокол: подскажите статейку или пример!


6-1247641927
diizell
2009-07-15 11:12
2012.02.19
NewCamD 5.25


2-1320826326
I_D
2011-11-09 12:12
2012.02.19
Перевод проекта с Delphi 7 в Delphi XE. Проблема с ShortString





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский