Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.04.01;
Скачать: CL | DM;

Вниз

FireMonkey   Найти похожие ветки 

 
DVM ©   (2011-12-05 22:49) [40]


> Кто б сомневался ©   (05.12.11 22:47) [39]

лучше Form1.cs посмотри, оно больше похоже на VCL


 
И. Павел ©   (2011-12-05 22:53) [41]


> Кто б сомневался ©   (05.12.11 22:44) [37]

В обработчике нажатия кнопки (той, которая изначально на форме) написал код для заполнения массива из 1000 кнопок. Присвоил им Top = i / 20 * 20 и Lwft = i % 20 * 50 (i - индекс кнопки в массиве). потом запустил таймер с интервалом в 50мс. В таймере смещал кнопки на 2 пикселя вправо, пока у первой кнопки не станет left > 300. Тогда шел влево до left = 0 и т.д. (через переменную, хранящую направление +1/-1)


 
И. Павел ©   (2011-12-05 22:54) [42]

Lwft -> Left


 
Rouse_ ©   (2011-12-05 23:39) [43]

Накидал на скорую руку на дельфе, помедленней конечно на порядок чем WPF, но вроде побыстрей этих ваших WinForms. (Еще раз просьба - у кого есть ХЕ2, сделайте аналог на FireMonkey для теста, плз)

unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   Panel1: TPanel;
   Button1: TButton;
   Timer1: TTimer;
   procedure Button1Click(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure Timer1Timer(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
 private
   MoveToRight: Boolean;
   ButtonsOffset: ShortInt;
   Buttons: array [0..999] of TButton;
   function CalcButtonsOffset: Integer;
   procedure CreateThousandButtnos;
   procedure MoveButtons(Value: ShortInt);
   procedure ReleseButtons;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 CreateThousandButtnos;
end;

function TForm1.CalcButtonsOffset: Integer;
begin
 if MoveToRight then
   Dec(ButtonsOffset)
 else
   Inc(ButtonsOffset);
 if ButtonsOffset < 1 then
   MoveToRight := False;
 if ButtonsOffset > 16 then
   MoveToRight := True;
 Result := ButtonsOffset;
end;

procedure TForm1.CreateThousandButtnos;
var
 I: Integer;
begin
 for I := 0 to 999 do
 begin
   Buttons[I] := TButton.Create(nil);
   Buttons[I].Parent := Self;
   Buttons[I].Caption := IntToStr(I);
 end;
 Timer1.Enabled := True;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 Timer1.Enabled := False;
 MoveToRight := False;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 ReleseButtons;
end;

procedure TForm1.MoveButtons(Value: ShortInt);
var
 I: Integer;
 D: THandle;
begin
 D := BeginDeferWindowPos(1000);
 try
   for I := 0 to 999 do
     D := DeferWindowPos(D, Buttons[I].Handle,
       0, (I * 75)  mod (20 * 75) + Value,
       I div 20 * 20 + Panel1.Height, 75, 20, SWP_NOZORDER or SWP_NOREDRAW);
 finally
   EndDeferWindowPos(D);
 end;
 RedrawWindow(Handle, nil, 0, RDW_INVALIDATE or RDW_ALLCHILDREN or RDW_UPDATENOW);
end;

procedure TForm1.ReleseButtons;
var
 I: Integer;
begin
 for I := 0 to 999 do
   Buttons[I].Free;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 MoveButtons(CalcButtonsOffset);
end;

end.


 
Rouse_ ©   (2011-12-05 23:44) [44]

зы: таймер на полтинник, алигн панели вверх, на панели Button1...


 
DVM ©   (2011-12-05 23:47) [45]


> Rouse_ ©   (05.12.11 23:39) [43]

А если вмеcто TButton взять TSpeedButton? Так оно более честно по сравнению с WPF.


 
DVM ©   (2011-12-05 23:48) [46]


> Rouse_ ©   (05.12.11 23:44) [44]
> зы: таймер на полтинник, алигн панели вверх, на панели Button1.
> ..
>
>

Дай DFM а лучше весь проект сделаю XE2 + FM


 
Rouse_ ©   (2011-12-05 23:53) [47]


> DVM ©   (05.12.11 23:47) [45]
>
>
> > Rouse_ ©   (05.12.11 23:39) [43]
>
> А если вмеcто TButton взять TSpeedButton?

Ща попробую...


 
Rouse_ ©   (2011-12-05 23:57) [48]

Не получится, этож график контрол. Хэндла нема, стало быть править положение через Buttons[I].SetBounds придется с дикими тормозами, проще сразу на канве как нужно и оч быстро всю эту байду нарисовать.

Вот DFM:

object Form1: TForm1
 Left = 0
 Top = 0
 Caption = "Form1"
 ClientHeight = 337
 ClientWidth = 635
 Color = clBtnFace
 Font.Charset = DEFAULT_CHARSET
 Font.Color = clWindowText
 Font.Height = -11
 Font.Name = "Tahoma"
 Font.Style = []
 OldCreateOrder = False
 OnCreate = FormCreate
 OnDestroy = FormDestroy
 PixelsPerInch = 96
 TextHeight = 13
 object Panel1: TPanel
   Left = 0
   Top = 0
   Width = 635
   Height = 41
   Align = alTop
   TabOrder = 0
   ExplicitLeft = 120
   ExplicitTop = 144
   ExplicitWidth = 185
   object Button1: TButton
     Left = 8
     Top = 8
     Width = 75
     Height = 25
     Caption = #1057#1090#1072#1088#1090
     TabOrder = 0
     OnClick = Button1Click
   end
 end
 object Timer1: TTimer
   Interval = 50
   OnTimer = Timer1Timer
   Left = 88
   Top = 8
 end
end


 
DVM ©   (2011-12-06 00:00) [49]

FM на создании тысячи кнопок стал нереально тормозить. Короче даже окно двигается с ними с трудом.


 
Rouse_ ©   (2011-12-06 00:01) [50]

Да и на создании тыщи обычных кнопок дельфя секунды три курит...


 
DVM ©   (2011-12-06 00:02) [51]


> Rouse_ ©   (06.12.11 00:01) [50]

У меня он минуту уже курит.


 
Rouse_ ©   (2011-12-06 00:03) [52]


> DVM ©   (06.12.11 00:02) [51]
>
>
> > Rouse_ ©   (06.12.11 00:01) [50]
>
> У меня он минуту уже курит.
>

Ну тогда интересно - отрисовывать то он их хоть быстро будет или не? :)


 
DVM ©   (2011-12-06 00:12) [53]


> Rouse_ ©   (06.12.11 00:03) [52]

Отрисовывает и двигает нормально, но очень медленно. Примерно шаг в 1 секунду.


 
DVM ©   (2011-12-06 00:25) [54]

http://narod.ru/disk/33450847001/Project2.zip.html

вот для FM. Экзешник правда здоровый 8 мег.


 
Rouse_ ©   (2011-12-06 00:29) [55]

Удалено модератором
Примечание: 404


 
DVM ©   (2011-12-06 00:31) [56]


> 404 выдает

вроде нормально уже


 
Rouse_ ©   (2011-12-06 00:35) [57]

Хм, скачал.
Быстрее работает чем в моей демке и WebForm.
Медленней чутка чем в WPF, но совсем чутка и однозначно быстрее чем остальные.


 
icelex ©   (2011-12-06 00:47) [58]


> Кто б сомневался ©   (05.12.11 18:58) [9]

> 5. Давайте чтобы решить спор - напишем 2 программы - VCL(WinForms)
> и WPF - в которых по форме будут быстро перемещаться несколько
> стандартных виз. компонентов. (либо 50 прогресс баров) Это
> уже делали на одном форуме кстати, года 4 назад.

я не спорил, я спросил
мне фигней заниматься некогда и письками с кем-нибудь другим меряйся :)


 
знайка   (2011-12-06 01:29) [59]

Прикольно во время отрисовки еще и порисайзить окно.


 
Кто б сомневался ©   (2011-12-06 05:25) [60]


> Да и на создании тыщи обычных кнопок дельфя секунды три
> курит...


Нужно поменять местами строчки

Buttons[I].Parent := Self;
Buttons[I].Caption := IntToStr(I);

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

WPF явно быстрее при передвижении кнопок, вот только разницы в тормозах нет что на виртуальной машине, что на реальной с GTS 450 - проц грузится по максимуму, а тормоза те же. Видяха явно не слабая. Видимо все таки подгружает проц, как и в WinControls. Возможно там используется по умолчанию двойная буферизация, с ней и со стандартными контролами Windows не должно быть тормозов.
Но в целом ощущения неповоротливости от .Net программ, главным образом от интерфейсов остается. Реакция пользователя > <задержка> > отклик интерфейса. Возможно это проблемы реализации, но что-то слишком часто они встречаются, причем в качественных продуктах.


 
DVM ©   (2011-12-06 10:15) [61]


> Rouse_ ©   (06.12.11 00:35) [57]

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


 
icelex ©   (2011-12-06 11:14) [62]


> Но в целом ощущения неповоротливости от .Net программ, главным
> образом от интерфейсов остается.

"Серебро-то нашлось. А вот остаток неприятный таки остался." (С)


 
han_malign   (2011-12-06 15:57) [63]


> А если вмеcто TButton взять TSpeedButton? Так оно более честно по сравнению с WPF.

> Хэндла нема, стало быть править положение через Buttons[I].SetBounds придется с дикими тормозами

TControl
...
protected
   procedure UpdateBoundsRect(const R: TRect);
...

- ну а Invalidate уж - не мелочась - всему родителю...
Хотя там и так, кроме 2000 x InvalidateRect, особо тормозов не должно быть...


 
Кто б сомневался ©   (2011-12-06 17:37) [64]


> icelex ©   (06.12.11 11:14) [62]


Не совсем нашлось то что искалось.

GPU так и не использовалось вместо него CPU. Причем разницы что на эмулируемой видяхе, что на реальной с кнопками+формой нет.

Кстати
Требования к ресурсам выше на пустых активных формах с кнопкой (1072\5288 PrivateWS; 7792\21036 WS) выше у .net
3. Мелочь но все таки - Если ресайзить пустую форму обоих проектов (.Net и нативного) - форма .Net медленнее ресайзиться, при быстрой смене размера, видны черные прямоугольники, в VCL такого нет, и форма ресайзится плавнее (проверял на виртуалке).
Наверняка есть и другие ньюансы в плане производительности. Должно быть объяснение неповоротливости .net программ, врядли это эффекты конкретной реализации.


 
Rouse_ ©   (2011-12-06 18:53) [65]


> han_malign   (06.12.11 15:57) [63]

Угу, в таком варианте работает побыстрее даже WPF.

unit Unit1;

interface

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

type
 TFriendlySpeedButton = class(TSpeedButton);

 TForm1 = class(TForm)
   Panel1: TPanel;
   Button1: TButton;
   Timer1: TTimer;
   procedure Button1Click(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure Timer1Timer(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
 private
   MoveToRight: Boolean;
   ButtonsOffset: ShortInt;
   Buttons: array [0..999] of TFriendlySpeedButton;
   function CalcButtonsOffset: Integer;
   procedure CreateThousandButtnos;
   procedure MoveButtons(Value: ShortInt);
   procedure ReleseButtons;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 CreateThousandButtnos;
end;

function TForm1.CalcButtonsOffset: Integer;
begin
 if MoveToRight then
   Dec(ButtonsOffset)
 else
   Inc(ButtonsOffset);
 if ButtonsOffset < 1 then
   MoveToRight := False;
 if ButtonsOffset > 16 then
   MoveToRight := True;
 Result := ButtonsOffset;
end;

procedure TForm1.CreateThousandButtnos;
var
 I: Integer;
begin
 for I := 0 to 999 do
 begin
   Buttons[I] := TFriendlySpeedButton.Create(nil);
   Buttons[I].Caption := IntToStr(I);
   Buttons[I].Parent := Self;
 end;
 Timer1.Enabled := True;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 Timer1.Enabled := False;
 MoveToRight := False;
 DoubleBuffered := True;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 ReleseButtons;
end;

procedure TForm1.MoveButtons(Value: ShortInt);
var
 I: Integer;
//  D: THandle;
 R: TRect;
begin
//  D := BeginDeferWindowPos(1000);
//  try
//    for I := 0 to 999 do
//      D := DeferWindowPos(D, Buttons[I].Handle,
//        0, (I * 75)  mod (20 * 75) + Value,
//        I div 20 * 20 + Panel1.Height, 75, 20, SWP_NOZORDER or SWP_NOREDRAW);
//  finally
//    EndDeferWindowPos(D);
//  end;
//  LockWindowUpdate(Handle);
   for I := 0 to 999 do
   begin
     R.Left := (I * 75)  mod (20 * 75) + Value;
     R.Top := I div 20 * 20 + Panel1.Height;
     R.Right := R.Left + 75;
     R.Bottom := R.Top + 20;
     Buttons[I].UpdateBoundsRect(R);
   end;
//  LockWindowUpdate(0);
//  RedrawWindow(Handle, nil, 0, RDW_INVALIDATE or RDW_ALLCHILDREN or RDW_UPDATENOW);
 Invalidate;
end;

procedure TForm1.ReleseButtons;
var
 I: Integer;
begin
 for I := 0 to 999 do
   Buttons[I].Free;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 MoveButtons(CalcButtonsOffset);
end;

end.



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

Текущий архив: 2012.04.01;
Скачать: CL | DM;

Наверх




Память: 0.61 MB
Время: 0.009 c
15-1323034873
alexdn
2011-12-05 01:41
2012.04.01
Allsoft, отзывы


15-1322992097
мамон
2011-12-04 13:48
2012.04.01
Каталогом товаров со штрих кодми


2-1323774868
igorium
2011-12-13 15:14
2012.04.01
цвета вкладок в TabControl


3-1260010688
Xmen
2009-12-05 13:58
2012.04.01
не могу соединится с базой


15-1323156427
OW
2011-12-06 11:27
2012.04.01
Excell 2000 открыть *.xlsx