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

Вниз

Panel и fade эффект   Найти похожие ветки 

 
Eraser ©   (2013-06-02 18:53) [0]

Давно не покидает навязчивая идея для интерфейса настроек и визардов задействовать fade-in/fade-out эффект при переключении вкладок.

Чтобы было понятнее о чем речь - сделал видео
https://dl.dropboxusercontent.com/u/26403307/fade-panel.mp4

Программа из этого видео явно написана с использованием WPF или что-то вроде того, поэтому там такие эффект поддерживаются, думаю, "из коробки". Кто-нибудь сталкивался с подобной задачей на Delphi? У devexp нашел нечто подобное в их компоненте-визарде, но этого мало, хотелось бы более универсального решения + не хочется изобретать велосипед.


 
Inovet ©   (2013-06-02 18:57) [1]

Может, AnimateWindow.


 
Eraser ©   (2013-06-02 18:59) [2]


> Inovet ©   (02.06.13 18:57) [1]

это рассматривалось в первую очередь, не подходит по причине
AW_BLEND
0x00080000
Uses a fade effect. This flag can be used only if hwnd is a top-level window.


 
Юрий Зотов ©   (2013-06-02 23:49) [3]


object Form1: TForm1
 Left = 250
 Top = 154
 Width = 696
 Height = 480
 Caption = "Form1"
 Color = clBtnFace
 Font.Charset = DEFAULT_CHARSET
 Font.Color = clWindowText
 Font.Height = -13
 Font.Name = "MS Sans Serif"
 Font.Style = []
 OldCreateOrder = False
 OnClose = FormClose
 OnShow = Label1Click
 PixelsPerInch = 120
 TextHeight = 16
 object Panel1: TPanel
   Left = 0
   Top = 0
   Width = 185
   Height = 450
   Align = alLeft
   TabOrder = 0
   object Label1: TLabel
     Left = 40
     Top = 28
     Width = 71
     Height = 16
     Cursor = crHandPoint
     Caption = "ShowForm2"
     OnClick = Label1Click
   end
   object Label2: TLabel
     Left = 40
     Top = 60
     Width = 71
     Height = 16
     Cursor = crHandPoint
     Caption = "ShowForm3"
     OnClick = Label2Click
   end
 end
 object Panel2: TPanel
   Left = 185
   Top = 0
   Width = 503
   Height = 450
   Align = alClient
   TabOrder = 1
 end
end

----------------------------------------------------

object Form2: TForm2
 Left = 244
 Top = 119
 AlphaBlend = True
 AlphaBlendValue = 0
 BorderStyle = bsNone
 Caption = "Form2"
 ClientHeight = 450
 ClientWidth = 688
 Color = clBtnFace
 Font.Charset = DEFAULT_CHARSET
 Font.Color = clWindowText
 Font.Height = -13
 Font.Name = "MS Sans Serif"
 Font.Style = []
 OldCreateOrder = False
 PixelsPerInch = 120
 TextHeight = 16
 object Edit1: TEdit
   Left = 32
   Top = 48
   Width = 121
   Height = 24
   TabOrder = 0
   Text = "Edit1"
 end
end

----------------------------------------------------

object Form3: TForm3
 Left = 244
 Top = 119
 AlphaBlend = True
 AlphaBlendValue = 0
 BorderStyle = bsNone
 Caption = "Form3"
 ClientHeight = 450
 ClientWidth = 688
 Color = clBtnFace
 Font.Charset = DEFAULT_CHARSET
 Font.Color = clWindowText
 Font.Height = -13
 Font.Name = "MS Sans Serif"
 Font.Style = []
 OldCreateOrder = False
 PixelsPerInch = 120
 TextHeight = 16
 object Memo1: TMemo
   Left = 24
   Top = 16
   Width = 185
   Height = 89
   Lines.Strings = (
     "Memo1")
   TabOrder = 0
 end
end

----------------------------------------------------

unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   Panel1: TPanel;
   Label1: TLabel;
   Label2: TLabel;
   Panel2: TPanel;
   procedure Label1Click(Sender: TObject);
   procedure Label2Click(Sender: TObject);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

uses Unit3, Unit2;

{$R *.dfm}

procedure TForm1.Label1Click(Sender: TObject);
var
 R: TRect;
 i: integer;
begin
 if Assigned(Form2) then
   Exit;
 Form2 := TForm2.Create(Panel2);
 try
   if Sender = Label1 then
   begin
     R.TopLeft := Panel2.ClientToScreen(Panel2.ClientRect.TopLeft);
     R.BottomRight := Panel2.ClientToScreen(Panel2.ClientRect.BottomRight);
     Form2.BoundsRect := R;
     Form2.Visible := True;
     for i := 0 to 255 do
     begin
       if Assigned(Form3) then
         Form3.AlphaBlendValue := 255 - i;
       Form2.AlphaBlendValue := i;
       Sleep(1)
     end;
     FreeAndNil(Form3);
     Form2.Visible := False
   end;
   Form2.Parent := Panel2;
   Form2.Align := alClient;
   Form2.Visible := True
 except
   FreeAndNil(Form2);
   raise
 end
end;

procedure TForm1.Label2Click(Sender: TObject);
var
 R: TRect;
 i: integer;
begin
 if Assigned(Form3) then
   Exit;
 Form3 := TForm3.Create(Panel2);
 try
   R.TopLeft := Panel2.ClientToScreen(Panel2.ClientRect.TopLeft);
   R.BottomRight := Panel2.ClientToScreen(Panel2.ClientRect.BottomRight);
   Form3.BoundsRect := R;
   Form3.Visible := True;
   for i := 0 to 255 do
   begin
     if Assigned(Form2) then
       Form2.AlphaBlendValue := 255 - i;
     Form3.AlphaBlendValue := i;
     Sleep(1)
   end;
   FreeAndNil(Form2);
   Form3.Visible := False;
   Form3.Parent := Panel2;
   Form3.Align := alClient;
   Form3.Visible := True
 except
   FreeAndNil(Form3);
   raise
 end
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 FreeAndNil(Form2);
 FreeAndNil(Form3)
end;

end.

----------------------------------------------------

unit Unit2;

interface

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

type
 TForm2 = class(TForm)
   Edit1: TEdit;
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form2: TForm2;

implementation

{$R *.dfm}

end.

----------------------------------------------------

unit Unit3;

interface

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

type
 TForm3 = class(TForm)
   Memo1: TMemo;
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form3: TForm3;

implementation

{$R *.dfm}

end.


 
antonn ©   (2013-06-03 08:22) [4]

ужасные костыли... :)
а некостыльных методов нет, только руками самому все рисовать


 
DVM ©   (2013-06-03 08:52) [5]

Firemonkey там все есть


 
Inovet ©   (2013-06-03 09:35) [6]

> [4] antonn ©   (03.06.13 08:22)
> а некостыльных методов нет, только руками самому все рисовать

> [5] DVM ©   (03.06.13 08:52)
> Firemonkey там все есть

В смысле - костыли уже встроенные?:)


 
antonn ©   (2013-06-03 09:43) [7]

ну если контролы "руками" рисуются, а не винапишные "окна" пытаются выводить - то наверное не костыли :)


 
Юрий Зотов ©   (2013-06-03 09:59) [8]


> antonn ©   (03.06.13 08:22) [4]
> ужасные костыли... :)
> а некостыльных методов нет, только руками самому все рисовать

Конечно, костыли. Именно потому, что "некостыльных методов нет".

Однако же, нужный результат достигнут, а юзеру ведь без разницы, как оно сделано - на костылях или по науке.

Да и в поддержке проблем нет: код более чем прост и канонов VCL не нарушает - значит, глюков быть не должно.

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

Это же всего лишь пример, набросанный "на скорую руку". В реальном проекте я бы убрал глобальные переменные и сделал один обработчик вместо двух. Ну и поискал бы способ избавления от уже упоминавшегося подмаргивания.


 
DVM ©   (2013-06-03 10:35) [9]


> Inovet ©   (03.06.13 09:35) [6]


> В смысле - костыли уже встроенные?:)

Эффекты все эти.


 
antonn ©   (2013-06-03 11:59) [10]


> Единственный, на мой взгляд, недостаток - есть небольшое
> подмаргивание из-за переключения видимости формы при назначении
> ей парента. Но оно именно небольшое, с ним можно смириться.
>  А можно и другой способ поискать, без переключения видимости.
>

это "небольшое" - очень расплывчатое понятие, и на разных системах оно может повести себя совсем не так как ожидается (например на терминальном сервере). к тому же не зря ремарка про top_level окна указана, везде ли сработает такой финт?


 
Юрий Зотов ©   (2013-06-03 12:48) [11]


> antonn ©   (03.06.13 11:59) [10]


> это "небольшое" - очень расплывчатое понятие, и на разных
> системах оно может повести себя совсем не так как ожидается

Да, кэп! Может. Надо просто пробовать.

> не зря ремарка про top_level окна указана, везде ли сработает такой финт?

Извините, а вы разобрались, как работает этот код? Похоже, что нет.

> All

Друзья, показан пример обхода ограничения "top-level only". Всего лишь пример и не более того. То, что в коде есть некая "костылеобразность", что  на разных системах он может вести себя по-разному и прочая, и прочая - все это я знаю не хуже других, можете поверить.

Посему - всем желающим предлагается вместо абсолютно очевидной критики абсолютно очевидных вещей просто  предложить свой вариант. Это было бы конструктивнее.


 
antonn ©   (2013-06-03 13:16) [12]


> Да, кэп! Может. Надо просто пробовать.

я предпочитаю следовать правилам, а не метод тыка :)


 
Eraser ©   (2013-06-03 14:56) [13]


> Юрий Зотов ©   (02.06.13 23:49) [3]

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


 
Юрий Зотов ©   (2013-06-03 15:03) [14]

> antonn ©   (03.06.13 13:16) [12]
> я предпочитаю следовать правилам


Я тоже. Поэтому, как только Вы покажете мне правила, с помощью которых можно определить, будет ли данный код работать "на разных системах ... например на терминальном сервере" - так я немедленно начну этим правилам следовать.

Фокус только в том, что я не знаю, где взять такие правила применительно к конкретному коду в [3]. Если Вы знаете, где их взять, то был бы признателен за информацию.


 
Юрий Зотов ©   (2013-06-03 15:10) [15]

> Eraser ©   (03.06.13 14:56) [13]

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


 
antonn ©   (2013-06-03 15:12) [16]

да "Мы" пока заняты, чтобы показывать полную перерисовку контролов


 
Юрий Зотов ©   (2013-06-03 15:21) [17]


> antonn ©   (03.06.13 15:12) [16]

Это ничего, я подожду. Только имейте, плз, в виду, что:

а). Вы говорили не о перерисовке, а о каких-то правилах, которым надо следовать - их я и просил, а не перерисовку.

б). Как только вы покажете "полную перерисовку контролов" (если покажете, конечно), так я тут же произнесу Ваше же очевидное: "на разных системах оно может повести себя совсем не так как ожидается (например на терминальном сервере)".


 
Лукошко   (2013-06-03 15:40) [18]

ДядьЮра в последнее время злой какой-то стал.


 
Eraser ©   (2013-06-03 15:50) [19]


> DVM ©   (03.06.13 08:52) [5]

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


 
Юрий Зотов ©   (2013-06-03 15:57) [20]

> Лукошко   (03.06.13 15:40) [18]

Я не злой. Пока меня не злят. А так - добрый и пушистый, тут пара десятков человек, думаю, это подтвердит.  
:o)


 
antonn ©   (2013-06-03 16:50) [21]


> Только имейте, плз, в виду

хорошо, буду иметь :)


> Как только вы покажете

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


 
Юрий Зотов ©   (2013-06-03 17:07) [22]

> antonn ©   (03.06.13 16:50) [21]

Вы читали [8]?

Если нет, то следовало бы. А если да, то зачем повторяться?


 
antonn ©   (2013-06-03 17:09) [23]

мы все читали, но повторяться с поучительным тоном - научился тут ;)

полагаю спор себя исчерпал? :) или таки последнее слово все же надо сказать не мне?


 
Юрий Зотов ©   (2013-06-03 17:34) [24]


> antonn ©   (03.06.13 17:09) [23]

1. В [4] вы сказали все верно. С Вами согласились - на том и следовало закончить.

2. Почему-то Вы решили продолжить и в [10] сказали очевиднейшую вещь - зачем?

3. В [12], простите, Вы сказали уже полную туфту. Нет таких правил, чтобы по ним можно было четко установить работоспособность конкретного кода на той или иной платформе.

4. Полную ручную перерисовку всех контролов Вы не покажете никогда, потому что никогда ее не сделаете.

5. В [21] Вы повторили [4]. Зачем?

6. Насчет поучительности - почему-то поучают именно Вас, а других не поучают. Не пробовали над эти странным фактом задуматься?

7. Насчет последнего слова - оставляю его за Вами. Рупь за сто, что не сдержитесь.
:o)


 
antonn ©   (2013-06-03 18:14) [25]


> Насчет последнего слова - оставляю его за Вами

ок :)



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

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

Наверх





Память: 0.54 MB
Время: 0.004 c
2-1360568573
Очень Злой
2013-02-11 11:42
2013.11.17
TXMLDocument проблема с кодировкой


15-1369859366
NailMan
2013-05-30 00:29
2013.11.17
Прикалываемся тут с коллегами на работе


2-1360819310
Exception
2013-02-14 09:21
2013.11.17
Templates and Inheritance


15-1369773002
Юрий
2013-05-29 00:30
2013.11.17
С днем рождения ! 29 мая 2013 среда


15-1370184813
Eraser
2013-06-02 18:53
2013.11.17
Panel и fade эффект





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский