Форум: "Прочее";
Текущий архив: 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