TCount

Forum Replies Created

Viewing 20 posts - 401 through 420 (of 560 total)
  • Author
    Posts
  • in reply to: Два вопроса относительно формы #51872
    TCount
    Participant
    'Support' wrote:

    Вот так вот получается. Не знаю насколько правильно…

    Хм…А как? Можно посмотреть?

    in reply to: Два вопроса относительно формы #51864
    TCount
    Participant
    'Support' wrote:

    Уголки можно сделать плавные если задать свои ExtendedBorders в редакторе.

    Здесь приложена демка как сделать BlendOnMoving, но она будет работать только с версией 9.02, которая скоро будет выложена. Нужно немного подождать.

    Спасибо. Но по поводу рамки хочу сказать.

    Я провел немало времени, перепробовал множество способов, в том числе и ExtendedBorders, но так и не достиг желаемого результата.

    Дело в том, что мне нужна рамка толщиной в один пиксель (а лучше вообще просто тень)+без TitleBar у формы.

    Вот, что с использованием ExtendedBorders:

    1. На первом рисунке TitleHeight=1, и отступ от краев рамки в 1 пиксель.

    2. На втором рисунке TitleHeight=0 (рамка получилась), но появился TitleBar и тот же отступ в 1 пиксель.

    И то, во всех 2-х случаях использовался метод “Replace existing Borders”, потому как в других случаях неизбежно появляются черные квадраты и прочее…

    Даже с промежутком в 1 пиксель можно подружиться как-нибудь, но TitleBar…

    P.S. Было бы отлично, если бы при TitleHeight=0 заголовок не рисовался бы. Раз уж при TitleHeight=1 его по сути и не видно.

    in reply to: Оптимизация под Win7 #51847
    TCount
    Participant
    'Atonarh' wrote:

    Доброго времени суток!

    Уже 2 года eсть программулина, написанная D2009 с alphaskins v8.53. Пишу и тестю в win xp sp3 (x32) все прекрасно, но на Win7,8 начинают медленнее отрисовываться элементы sframebar (иногда мелькают), переключение spagecontrol, в общем, элементы себя иногда ведут по-другому.

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

    Доброй ночи! Было бы понятнее, конечно, если бы был исходный код программули))

    Но все же для начала смените версию AC на 9.01.

    И можете почитать этот топик:

    http://www.alphaskins.com/forum/index.php?showtopic=7924

    TCount
    Participant
    'Ruslan_blr' wrote:

    V_f0DQF6FWo.jpg

    😆 Предлагаю заканчивать дискуссию) надоело, правда) каждый решает сам, как ему программы писать.

    TCount
    Participant
    'Ruslan_blr' wrote:

    в статье про циклы написан БРЕД.

    count – это НЕ функция кот. возвращает кол-во , это СВОЙСТВО.

    вот кусок кода из System.Classes:

    Code:
    TStrings = class(TPersistent)
    protected

    function GetCount: Integer; virtual; abstract; // виртуальная, абстрактная – реализация в наследнике, т.е. в TStringList, т.к. my_TStrings:= TStringList.Create

    public

    property Count: Integer read GetCount;

    TStringList = class(TStrings)

    protected

    function GetCount: Integer; override;

    смотрим ее реализацию

    Code:
    function TStringList.GetCount: Integer;
    begin
    Result := FCount; // возвращает значение приватного поля, а не подсчитывает кол-во.
    end;

    FCount меняется в функциях типа Add, Delete и т.д.

    но это в принципе не очень важно, факт в том, что

    полный бред. ну проведите же вы эксперименты

    В статье не написано, что это функция. Написано, что вызывается МЕТОД, возвращающий Count. Но Вы не поняли, о чем я говорил, дело не в методах и не в свойствах, а факт того, что лишние вычисления процессор проводит. На Вашем компе это не ощутимо, потому что в его проце как минимум 2 ядра, у меня одноядерный и результаты я Вам показал.

    Более того, эксперимент был проведен всего лишь на “b-1”, а не на сложной функции.

    Глупо полагать, что в цикле вроде “For a:=0 to b-1 do…” конечный итог вычисляется сразу. Цикл каждый раз вычисляет выражение “b-1”, потому как нигде не хранит в памяти результат выражения “заранее”.

    TCount
    Participant
    'Ruslan_blr' wrote:

    Все правильно написано! Для простых выражений границы цикла вычисляются сразу. Так и написано, но в Вашем случае были неявные границы в цикле, поэтому ничего заранее не вычислялось.

    Вы сами-то задумывались, как может вот такое выражение вычислиться заранее и один раз?

    B:=1;

    FOR a:=0 TO B*2-1 DO BEGIN

    B:=a+5;

    if A>=1000 then BREAK;

    END;


    Вынесение инвариантного кода за пределы цикла – не выносится. Наиболее распространенный недочет – условие цикла записывается как:

    for i:=0 to memo1.lines.count – 1 do…

    Delphi будет при каждой итерации вызывать метод count, вычитать из результата 1 и потом уже сверять. Настоятельно рекомендуется переписывать подобный код как

    lin := .lines.count – 1;

    for i:=0 to lin do…

    Весь код VCL написан с нарушением этого правила. Очевидно, что проще подобного рода оптимизацию встроить в компилятор, нежели переписывать VCL 🙂


    Про остальное можно почитать здесь:

    http://delphist.ru/napisanie-optimalnogo-koda-pod-delphi/

    TCount
    Participant
    'Ruslan_blr' wrote:

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

    Code:
    var
    i, j: Cardinal;
    a, b : Integer;
    begin
    i:= GetTickCount;
    b:= 1000000000;
    for a := 0 to b do
    begin

    end;

    j:= GetTickCount – i;
    ShowMessage( IntToStr( j ) );

    i:= GetTickCount;
    b:= 1000000001;
    for a := 0 to b-1 do
    begin

    end;

    j:= GetTickCount – i;

    ShowMessage( IntToStr( j ) );

    end;

    результаты будут одинаковыми. у меня например 1688 И 1688. Это ж блин основы программирования.

    А у меня результаты:

    1139

    1658

    TCount
    Participant
    'Ruslan_blr' wrote:

    подтвержу документально. вот выдержка из офф. доки ембаркадеро ( http://docwiki.embarcadero.com/RADStudio/XE5/en/Declarations_and_Statements)

    For purposes of controlling the execution of the loop, the expressions initialValue and finalValue are evaluated only

    once, before the loop begins.

    The difference between this construction and the for… to statement is that the while loop reevaluates finalValue before

    each iteration. This can result in noticeably slower performance if finalValue is a complex expression, and it also means

    that changes to the value of finalValue within statement can affect the execution of the loop.

    А Вы переводили это?

    “…в заявлении является то, что в то время как цикл переоценивает finalValue до

    каждая итерация. Это может привести к снижению производительности заметно, если finalValue является сложным выражение, и это также означает

    что изменения в стоимости finalValue в заявлении может повлиять на выполнение цикла.”


    конечно, мы не говорим о сложных конструкциях, но нужно понимать, что финальное значение вычисляется во время цикла постоянно. Возникает вопрос “а нафиг мне нужно это лишние вычисление?”.

    TCount
    Participant
    'Ruslan_blr' wrote:

    Вы не правы ! в моей процедуре закомменте Break и после if then begin … end поставьте например if i=2 then TitleBar_Main.Items.Delete(i); count естестно уменьшится на -1 а цикл пойдет до конца и на последней итерации будет Argument out of range. считайте,что конечное зн-е счетчика цикла это константа и оно высчитывается только ОДИН РАЗ перед первой итерацией. это ж азы ёмаё )).

    а по поводу вылета… если это вопрос к разработчику, то кто тогда Вы ? смотрящий что-ли ?))

    Как раз я и прав)

    1. b:=10000;For a:=0 to b-1 do…

    2. b:=9999;For a:=0 to b do…

    Как думаете, что быстрее? Смысл не в том, когда цикл прерывается, а вообще в логике построения.

    Этот форум для абсолютно всех и все могут отвечать на те или иные вопросы. Просмотрите форум, не думаете же Вы, что на все вопросы отвечает поддержка?)

    Когда отвечает поддержка, то и ник у нее соответствующий)

    TCount
    Participant
    'Ruslan_blr' wrote:

    а как переменная ускоряет цикл ? конечное значение счетчика цикла вычисляется по-моему на первом шаге. тоесть если в теле цикла например удалить один из айтемов, то на последнем шаге будет что-то типа Index out of bounds. конечное значение счетчика цикла не пересчитывается каждый раз. ну и const..:) вы все по ГОСТу делаете ?)

    а по проблеме что скажете ? если компилить под win 8.1 x64 то вылетает.

    В конструкции типа “for I := 0 to TitleBar_Main.Items.Count-1 do” каждый шаг переменной I вычисляется значение “TitleBar_Main.Items.Count-1”, а это лишняя операция, особенно если итемов много.

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

    Насчет винды 8 даже не знаю, в чем проблема. Это уже к разработчику)

    TCount
    Participant
    'Ruslan_blr' wrote:

    и еще – какой смысл в предложенной оптимизации ? зачем заводить лишнюю переменную ?

    У меня привычка оптимизировать)) В данном случае эта оптимизация не сильно влияет на общий результат, но если использовать ее повсеместно, то результат будет очевиден.

    Переменная введена для ускорения работы цикла, но с циклом Repeat..Until было бы еще быстрее (правда, это незаметно). Ну еще в процедуре испольщовано CONST.

    TCount
    Participant
    'Ruslan_blr' wrote:

    вылетает Out of System resources при попытке изменения св-ва Visible у TacTitleBarItem

    есть ф-ция, кот. в рантайме меняет видимость некоторых кнопок в Titlebar'е

    procedure Set_TBI_Visible( Item_Name: string; Value: Boolean );

    var

    i: Integer;

    begin

    for I := 0 to TitleBar_Main.Items.Count-1 do

    begin

    if TitleBar_Main.Items.Items.Name = Item_Name then

    begin

    TitleBar_Main.Items.Items.Visible:= Value; // здесь вылетает

    Break;

    end;

    end;

    end;

    вызывается так:

    Set_TBI_Visible( 'tbi_OI', True );

    в версии 8.53 все было нормально

    Судя по процедуре, TitleBar создается динамически, потому как процелура не принадлежит форме.

    Дело в том, что у меня ошибки не происходит.

    Еще предлагаю оптимизировать процедуру так:

    procedure Set_TBI_Visible(const Item_Name: string; Value: Boolean);

    var i,b: Integer;

    begin

    b:=TitleBar_Main.Items.Count-1;

    for I:=0 to b do if TitleBar_Main.Items.Name=Item_Name then begin

    TitleBar_Main.Items.Visible:=Value;

    Break;

    end;

    end;

    in reply to: Не вовремя оскинивается popupmenu #51814
    TCount
    Participant
    'VahaC' wrote:

    Попробуй сделать

    Code:
    sSkinManager1.SkinableMenus.HookPopupMenu(Menu,true);

    при помещении иконки в трей

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

    in reply to: Не вовремя оскинивается popupmenu #51810
    TCount
    Participant
    'Stertor' wrote:

    Здравствуйте, товарищи! Был немного удивлен поведением popupmenu.

    В моей программе форма не показывается при старте, но приложение помещает в трей значок(используется компонент JvTrayIcon). При клике по значку, приложение выводит popup-menu.

    Я заметил, что popup не оскинивается до первого показа формы. После того, как форма показалась, оскинивание идет нормально.

    SkinProvider присутствует?

    in reply to: SpeedButton.Flat (Прозрачная кнопка) #51806
    TCount
    Participant
    'skvoshiz' wrote:

    Здравствуйте, в обычном SpeedButton при значении True свойства Flat, кнопка становиться прозрачно. А у sSpeedButton нет.

    Это возможно сделать с элементами AlphaStandard, прозрачную кнопку.

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

    В Вашем случае нужно создать свой скин или доработать существующий.

    Для этого скачиваете редактор скинов:

    http://www.alphaskins.com/sfiles/askineditor.zip

    Внимательно читаете мануал по созданию скинов:

    http://www.alphaskins.com/showdoc.php?l=ru&n=101

    Ну а дальше только Ваша фантазия и талант дизайнера))

    Будут вопросы – пишите в ЛС.

    P.S. Стандартная кнопка не становится прозрачной) Она просто приобретает цвет фона формы. Подставьте вместо фона картинку и будете удивлены результатом)

    P.P.S. Если нужна кнопка без рамок (вообще прозрачная) – нужно просто сменить секцию скина (SkinSection) у кнопки на “Transparent”.

    in reply to: Шрифт в заголовке формы #51800
    TCount
    Participant
    'skvoshiz' wrote:

    Спасибо большое ! Помогло!

    Могли б еще помочь с http://www.alphaskins.com/forum/index.php?showtopic=8022

    Не за что. А со вторым вопросом я ответил в том топике.

    TCount
    Participant
    'skvoshiz' wrote:

    Здравствуйте, нужно чтоб у одного из sTabSheet шрифт был Bold, а у всех остальных обычный.

    [attachment=6719:12412.png]

    Как это возможно сделать?

    Все довольно просто. Нужно смотреть в сторону собственной прорисовки заголовков вкладок.

    1. У PageControl есть свойство OwnerDraw. Его нужно установить в True.

    2. Создать событие PageControl – OnDrawTab.

    Ну и в самом событии прорисовать все элементы. Например, вот так (PC – это PageControl):

    Procedure TForm1.PCDrawTab(Control: TCustomTabControl;TabIndex: Integer; const Rect: TRect; Active: Boolean);

    var str: string;h,y: smallint;rc: trect;

    begin

    with Control.Canvas do begin

    brush.Style:=bsClear;

    if Active then begin Font.Style:=[fsbold,fsUnderline];Font.Color:=$FFFFFF;end else begin Font.Style:=[];Font.Color:=$00BFDFFF;end;

    STR:=PC.Pages[TabIndex].Caption;

    h:=TextHeight(str);

    y:=(rect.Bottom-h)div 2;

    SetRect(rc,rect.Left,y,rect.Right,y+h);

    DrawText(Handle,STR,Length(STR),RC,DT_CENTER or DT_NOPREFIX);

    end;

    end;

    in reply to: Шрифт в заголовке формы #51796
    TCount
    Participant
    'skvoshiz' wrote:

    Здравствуйте, не могу поменять шрифт в названии формы.

    Т.е. меняя в Свойствах в Font на другой шрифт и размер, ничего не происходит.

    Здравствуйте! Предлагаю два варианта:

    1. Добавить на форму SkinProvider и с помощью него создать свой заголовок (рис 2)

    2. Использовать TitileBar.

    TCount
    Participant
    'Support' wrote:

    Здравствуйте.

    Постараюсь разобраться с Frame скоро.

    В версии 9.01 пока не исправлено.

    TCount
    Participant
    'LeFacto' wrote:

    Извените если такой вопрос был я его не нашел. Создаю динамически компоненты TPopMenu и в некоторых итемы добавляю. Но они не всегда сразу отрисовываются по скину. Как указать SkinProvader'у что надо итемы рисовать по скину?

    После добавления новых итемов делаешь так:

    SM.SkinableMenus.HookPopupMenu(PM,true);


    где:

    SM – твой SkinManager

    PM – нужный PopupMenu

    например:

    sSkinManager1.SkinableMenus.HookPopupMenu(PopupMenu1,true);

Viewing 20 posts - 401 through 420 (of 560 total)