返回首页

{A} {S0}最新
原有的控制并没有写入到包括线程安全的遵守。这已得到纠正,是在新的下载(S)。
感谢大家所有的客气话!简介
作为应用程序开发,它是并不少见到一个特定的用户界面要求运行,你可以不履行使用购买控制。很多时候,你会发现第三方控制接近但不太让你向你的目标。你的选择是改变这个特殊要求的用户界面设计,或写自己的控制。背景
这是这种控制的起源。我的应用程序执行一个相当长的数据库更新,涉及的父对象的大型集团和每一个父对象,以儿童为对象的大量需要,以及更新。整个过程将需要30秒到几分钟,我不希望我的用户在盯着那段时间不知道,如果他们想锁定一个沙漏。
我开始用一个标准进度条,这是很好,直到我注意到几个"滴答"如此漫长,再次回到我所关注的用户和不想迫使他们坐下盯着一个屏幕,已经死了一个超过几秒钟。
为了解决这个问题,我刚才已经堆积在彼此顶部两个进度条,并更新他们的个人??,但作为一个程序员,我可以寻找到一个单一的没有正当理由不过工程师这个任务,自成体系的控制!在您的项目中使用的控制
虽然在Visual Studio中,右键单击工具箱选项卡中,您要添加控制。点击"选择项... ..."并导航到你保存SplitProgressBar.dll。选择DLL和点击'OK'。
这将控件添加到您的工具箱,你现在准备拖到您使用的形式。属性BarBackColor是背后的ProgressBar细胞面板的背景颜色。周围的ProgressBar的行中使用的是彩色的BorderColor。TextBackColor标签后面的面板的背景颜色。TextColor是标签的前景色。BarBottomColor和BarTopColor的颜色使用ProgressBar的细胞。BarBottom.BarMax是可以达到的上限。BarValue。BarBottom.BarMin是下限。BarValue可以达到。BarBottom.BarStep告诉进度条如何递增。BarValue每次。PerformBottomStep推。BarBottom.BarValue是我们的ProgressBar的实际价值。BarTop是相同BarBottom。如果为true GradientBars,控制将试图填补在使用渐变图案的细胞。SyncTopAndBottom如果情况属实,控制将忽略BarBottom值,并绘制之一,大型固体细胞,使用的BarTop值。PanelText.TextLabel是"标签"面板中显示的文本。PanelText.TextPanelAlignment左,居中或右对齐标签水平。PanelText.TextPanelAutosize如果情况属实,标签面板的宽度将被计算基础上的文字。PanelText.TextPanelWidth使用此调整标签的大小。
*仅适用于TextPanelAutosize = FALSE *.用法示例

Private Sub ProcessSomething()

    ' Setup our progress bar to use ONE large cell and to paint the cells as



        gradients

    With ProgBar

        .SyncTopAndBottom = True

        .GradientBars = True

        .BarTop.BarMax = ElementsToProcess.Count

        .BarTop.BarStep = 50

        .BarTop.BarValue = 0

    End With

    Dim CurrentElement As Integer

    For Each Element As SomeElement In ElementsToProcess

        '



        ' Your code here



        '



        ' Increment our counter



        CurrentElement += 1

        ' If we're ready to update the progress bar - go do it.



        If CurrentElement Mod ProgBar.BarTop.BarStep = 0 Then

            ProgBar.PerformTopStep()

        End If

    Next

End Sub

在同一时间使用的顶部和底部的酒吧很简单:刚刚成立SyncTopAndBottom = FALSE和设置您的BarBottom属性相同的方式来设置BarTop属性。。。
*注*:如果您的控制细胞,小于6个像素的高度,将使用纯色填补无论在细胞GradientBars价值。。酷ComponentModel属性
你有没有过一个属性在设计时改变他人财产的价值?要得到控制刷新的值的属性窗口,使用的RefreshProperties力这样的更新:{C}
想要quot; hidequot,未使用的属性?并非所有的人都quot; hidablequot;但对于那些,试试这个:
<Browsable(False)> _

Public Overrides Property Autosize() As Boolean

    Get

        Return MyBase.AutoSize

    End Get

    Set(ByVal value As Boolean)

        MyBase.AutoSize = value

    End Set

End Property
兴趣点
这是我写的第一个控制使用扩展的属性(如大小,填充,位置等),虽然很漂亮,搞清楚如何设置这样的属性,给我造成了一些心痛不是最这是几乎没有关于如何创建的文档,配置或使用扩展的属性(我是能够找到的!)
一个怪事屡有发生,我还没有找出原因:当控制置于窗体,请单击"关于控制和滚动属性窗口BarBottom,并期待在所显示的值:"0 0,0,0 quot;这是默认的启动设置。?
如果修改转换和重建SplitProgressBar类,而不是看到子属性值,你会看到,"这样的类的名称; SplitProgressBar.BarClassquot;
在这一点上,你必须从主要项目的参考清单中删除SplitProgressBar??并重新添加。重新启动Visual Studio将解决这个问题很好,但因为我从来没有打算改变填写在父属性的子属性作为一个逗号分隔的文本单行的开发,实际上,我确定当发生这种情况。
事实上,这是一个改进,我想控制:我想没有文字显示parent属性时倒塌。如果有谁知道如何把这一关,请让我知道!"

回答

评论会员:kaszur 时间:2011/12/14
真棒进度..感谢
评论会员:会员2412955 时间:2011/12/14
感谢张贴此脚本。它看起来真的很不错,在我的闪屏!

这是网站,我希望当我难倒了,找不到什么其他地方。

非常感谢
评论会员:!保罗康拉德 时间:2011/12/14
很好的控制,并做好。

"线索列车通过不停止他的站。"约翰 - 西蒙斯/取缔程序员

"真正的程序员只是扔在电脑一串1和0来看看什么枝" - 皮特奥汉隆
评论会员:Elkay 时间:2011/12/14
谢谢你保。很亲切你这么说!
我有一个很大的乐趣,写这一个 - 了解到最新的项目(])我为我的大部分来自这个进度条建设

无论如何 - 感谢很多

- LK
评论会员:保罗康拉德 时间:2011/12/14
Elkay写道:感谢多

别客气。你有没有得到一个机会,看看它是线程安全吗?

"线索列车通过不停止他的站。"约翰 - 西蒙斯/取缔程序员

"真正的程序员只是扔在电脑一串1和0来看看什么枝" - 皮特奥汉隆
评论会员:Elkay 时间:2011/12/14
我最肯定 - 我有一个新的代码设置为我准备好进行测试,然后提交更新这里... ...不幸的是,我在我的(实际)工作的三个非常若隐若现项目
几乎肯定会阻止我完成之前经过几天我在CodeProject更新。
我将尽快确定更新后一个新的头。

- LK
评论会员:保罗康拉德 时间:2011/12/14
酷。昨晚我看了你的源代码,并没有看到它,你还没有机会。

"线索列车通过不停止他的站。"约翰 - 西蒙斯/取缔程序员

"真正的程序员只是扔在电脑一串1和0来看看什么枝" - 皮特奥汉隆
评论会员:supercat9 时间:2011/12/14
您的代码很好地奠定了。我看不出在那里处理线程安全的东西,但我俯瞰它,还是没有在这个版本中包含

进度条一样的读数时,他们最有用的无阻塞和线程安全的;改变的属性,应该引起当UI线程得到周围没有调用程序不必等待它显示要更新。我用的是"配方",有所谓"updateQueued"一个整数有任何常规的变化值,因此需要更新呼叫invokeUpdate,应该看起来像:
    Dim myUpdateDeleg As New MethodInvoker(AddressOf doUpdate)

 

    Sub invokeUpdate()

        Try

            If Not MyBase.IsDisposed Then

                If MyBase.InvokeRequired Then

                    If updateQueued = 0 AndAlso Threading.Interlocked.Exchange(updateQueued, 1) = 0 Then

                        MyBase.BeginInvoke(myUpdateDeleg)

                    End If

                Else

                    doUpdate()

                End If

            End If

        Catch ex As ObjectDisposedException  'Can any other badness happen between InvokeRequired and BeginInvoke?

        End Try

    End Sub
实际的doUpdate过程应该开始清算updateQueued。这种做法的净效应是控制的任何更新将尽快UI线程得到它周围发生,但没有做更新的线程等待。一次只有一个更新请求将被放置在消息队列中没有多少次invokeUpdate被称为

这是必要的,以确保如果一个控件重绘一些,但不是所有的属性已经改变,没有什么不好的事情发生。它使用一对夫妇的单一领域的两间酒吧举行的大小(我不知道如果双总是更新原子)可能会有所帮助。不过,一般来说,我发现,有控制允许线程安全的更新是非常有用的功能
评论会员:。Elkay 时间:2011/12/14
多数民众赞成一个优秀的建议,超级
当我第一次写这个进度条,我是相当新手 - 但线程安全是我的整个团队,使某些到每一个控制或我们的应用程序的业务对象类
去。
如果你允许,我想使用您的公式,将此代码添加到我这里列出的控制。鉴于您的许可,我会确保信贷给予信贷是由于

- LK
评论会员:supercat9 时间:2011/12/14
继续使用它。这就是为什么我张贴。
我忘了粘贴在updateQueued定义,但它仅仅是一个整数。
这将是很好的,如果可以把周围所有控制领域的包装类的事情。不幸的是,当我试图使线程安全版本的内置控件,我一般认为有必要使用不同的名称从更新程序的内置属性;超载内置的属性使用BeginInvoke似乎引起奇怪的行为。

顺便说一句,而它增添了些许的复杂性,有时可能是有用的添加一个定时器控制限制的更新速度。当您第一次更新控制,启动定时器。如果另一个更新的要求是在UI线程接收定时器正在运行时,忽略它(但离开updateQueued设置)。当定时器到期时,如果updateQueued设置,清除它并更新控制;如果updateQueued没有设置,禁用定时器。这种方法只有真正的作品是由UI线程以外的线程更新进度条,但在这种情况下,它可以减少更新进度条的性能成本
评论会员:。Schatak 时间:2011/12/14
的是什么在VB.NET中使用的图形效果的方式?

shaveta C
评论会员:Elkay 时间:2011/12/14
我不知道我理解你的问题

有许多的图形效果 - 其中许多来自不同的方式实现。关于常见的连接将在GDI
双向进度条填充背景颜色(或渐变)以及绘画的文本使用的GDI只规模最小的

我希望这有助于

- LK
评论会员:The_Mega_ZZTer 时间:2011/12/14
您好,工作画上一个Windows窗体或控制的最佳途径是处理控件或窗体的Paint事件。从那里,你必须在处理程序中,其中有一个图形方法的e参数。通过这种方法,您可以访问所有的绘画相关的功能。

所有的。NET绘画功能System.Drawing命名空间中,如果你想浏览的帮助文件或自动完成弹出,在VS。

举一个例子,Elkay的进度条... ...而事实上,大多数自定义控件...需要处理Paint事件以绘制在屏幕上看到的任何东西。在截图的所有东西都被涂成这样的功能。如果你下载的源代码和其他一些控制,它可以帮助你找出如何做控件上画
评论会员:。 时间:2011/12/14