小编ang*_*son的帖子

用于.NET的Dock Panel组件,允许在选项卡页面内对接?

我想构建一个用户界面,由于历史原因,它有很多"列"信息.其中许多在所有情况下都与所有用户无关,所以我想我会看到停靠面板,以允许用户根据他们的工作场景隐藏或重新排列列.

这是.NET 3.5中的Winforms.

因此,我想要以下内容:

  • 在主窗体中有标签页
  • 每个标签页都可以有停靠在其中的停靠面板
  • 坞站面板应该可以从一个标签页移动到另一个标签页

示例样机http://images.vkarlsen.no/so/2902953/dock-test.png

到目前为止,我已经尝试了以下组件包,没有运气:

Telerik的

允许我停靠在标签页内,但停靠面板无法从一个标签页移动到另一个标签页.当尝试将浮动面板拖放到与其来源不同的选项卡页面上时,它会显示停靠栏将成功,但是当它被丢弃时,它将停靠在其所有者容器上.

Divelements SandDoc

与Telerik相同的问题.

DevExpress XtraBars

与Telerik相同的问题.

http://sourceforge.net/projects/dockpanelsuite/

同样的问题,停靠站内容窗口只能属于一个停靠面板,这意味着它无法从一个选项卡迁移到另一个选项卡.


基本上,有没有人知道任何这样的组件(包)可以让我做我想要的?


编辑:好的,我试过让Sourceforge控件在上面工作,但我看不出如何使这个工作.

基本上,这就是我需要做的事情:

  1. 我需要有多个标签页(我不需要取消它们,它们可以是静态的)
  2. 我需要能够将内容停靠到标签页
  3. 我需要能够将内容从一个标签页移动到另一个标签页

如果我理解下面的答案提到这个控件,我应该使用DockPanel而不是TabControl,而DockPane而不是TabPage,但据我所知,这只能让我能够停靠和取消选项卡页面,而这不是我想要的是.

无论如何,这是一个程序文件,只需创建一个Winforms项目,从sourceforge项目添加对.dll的引用,并在Program.cs中粘贴此代码:

using System;
using System.Windows.Forms;
using WeifenLuo.WinFormsUI.Docking;

namespace DockTest
{
    public class DockWindow1 : DockContent
    {
        public DockWindow1()
        {
            TabText = "Dock-window #1";

            DockPanel panel = new DockPanel();
            panel.Dock = DockStyle.Fill;
            Controls.Add(panel);

            // tried this related to the exceptions
            // this.DockPanel = panel;
        }
    }

    public class DockWindow2 : DockContent
    {
        public DockWindow2() …
Run Code Online (Sandbox Code Playgroud)

.net components tabpage tabpanel dockpanel

11
推荐指数
1
解决办法
9573
查看次数

使用Reflection.Emit发出"using(x){...}"块?

我正在尝试在C#中使用Reflection.Emit来发出一个using (x) { ... }块.

在我处于代码中的时候,我需要获取堆栈的当前顶部,这是一个实现IDisposable的对象,将其存储在局部变量中,在该变量上实现一个使用块,然后在其中添加更多代码(我可以处理最后一部分.)

这是我尝试编译并在Reflector中查看的C#代码示例:

public void Test()
{
    TestDisposable disposable = new TestDisposable();
    using (disposable)
    {
        throw new Exception("Test");
    }
}
Run Code Online (Sandbox Code Playgroud)

这在Reflector中看起来像这样:

.method public hidebysig instance void Test() cil managed
{
    .maxstack 2
    .locals init (
        [0] class LVK.Reflection.Tests.UsingConstructTests/TestDisposable disposable,
        [1] class LVK.Reflection.Tests.UsingConstructTests/TestDisposable CS$3$0000,
        [2] bool CS$4$0001)
    L_0000: nop 
    L_0001: newobj instance void LVK.Reflection.Tests.UsingConstructTests/TestDisposable::.ctor()
    L_0006: stloc.0 
    L_0007: ldloc.0 
    L_0008: stloc.1 
    L_0009: nop 
    L_000a: ldstr "Test"
    L_000f: newobj instance void [mscorlib]System.Exception::.ctor(string)
    L_0014: throw 
    L_0015: ldloc.1 
    L_0016: …
Run Code Online (Sandbox Code Playgroud)

c# reflection.emit using-statement ilgenerator

11
推荐指数
1
解决办法
916
查看次数

当Windows能够找到它时,如何找到Mercurial可执行文件的完整路径?

澄清:问题是:我如何找到Mercurial命令行客户端.如果答案适用于任何可执行文件,那就更好了,但我真的对hg.exe可执行文件感兴趣.

如果我知道可执行文件的名称,比如hg.exeMercurial命令行客户端,并且Windows知道它的位置,因为我只能hg log从命令提示符执行它并执行,为了让我自己找到该可执行文件,涉及哪些步骤,以与命令提示符和Windows相同的方式执行此操作?

基本上,如果Windows能够找到它,我希望我的程序能够找到它.

是否有WinAPI功能或类似功能?代码将在.NET中运行,用C#编写,所以如果.NET中有任何内置的东西,那将是首选的解决方案,但除此之外,我不会对此使用P/Invoke不利.

我已经看到了这个问题的一个潜在重复:c#检查Windows路径中是否存在可执行文件,但是它是否存在?只是遍历PATH环境变量的内容并在每个目录中查找可执行文件?

我有一个模糊的概念,那只是所涉及的步骤之一,并且可能存在Windows可以使用的注册表覆盖,我应该知道,所以我将在这里发布问题.

另一方面,如果这里只有PATH变量,它可以安全地作为副本关闭.

.net windows executable path

11
推荐指数
2
解决办法
7297
查看次数

如何将Delphi项目正确划分为BPL?

我工作的公司在Delphi中开发了一个系统,它包含许多exe模块,如果涉及源代码,它们在某种程度上是相同的.遗憾的是,没有人关心使用库来共享代码.这意味着每次在代码中都有错误修复所有这些模块共享时,程序员必须分别对所有这些模块进行修正!它总是需要这么多时间......

我决定找到一种方法将共享代码放入库中.我考虑过DLL和BPL.在这种情况下,BPL似乎更方便程序员,更不麻烦,特别是代码仅在我们的软件中使用,并且仅在Delphi中使用.

我将所有exe模块共享的所有代码放入BPL中,一切看起来都很好,但有些事我不明白,如果你向我解释,我将不胜感激.

  1. 在将代码划分为BPL之后我的期望是,使用我创建的BPL部署exe文件就足够了.但事实证明他们也需要一个rtl100.bpl和vcl100.bpl.为什么会这样?我想只部署exes和我的BPL.我不想为最终用户提供由Borland和第三方公司提供的一大堆库:).我希望它们在exes中编译,就像之前编译的那样.有可能吗?

  2. 到目前为止我做的是:

    • 我把所有共享的pas单位都放到BPL上.每个BPL包含属于同一类别的单元,因此程序员可以清楚地了解给定BPL中的代码.
    • 每个BPL都是"运行时和设计时"库.
    • 每个BPL都是"明确重建".后两者是BPL的默认项目设置.
  3. 如果涉及到exe项目:

    • 我删除了我之前提交给BPL的所有单位.
    • 我在BDS 2006的Tools-> Install package菜单中安装了我的BPL.
    • 在我的exe项目设置中,我选中了"使用运行时包构建"选项,并在下面的编辑框中列出了我的所有BPL包(仅限我的包,因为我清除了那里出现的所有其他包).

这就是我所做的一切.exe项目编译正确,但我无法访问BPL的源代码(我无法从我的exe项目导航到该代码),即使所有BPL与其源代码文件一起存储.为什么?这对我来说似乎很奇怪.

我总是倾向于写冗长的描述 - 抱歉:).我将感谢你的帮助.我只需要对我提到的要点进行一些解释:仅使用我的BPL部署exe,我作为一个整体做的正确性,以及无法导航到BPL源代码.非常感谢你提前!


谢谢大家的讨论.有人说我选择的方法并不是一个好主意.我们的软件包含100多个模块(大多数模块类似于不同设备的驱动程序).他们中的大多数共享相同的代码 - 在大多数情况下是类.问题是这些类并不总是放在单独的独立的pas单元中.我的意思是共享代码通常放在包含特定于模块的代码的单元中.这意味着当您修复共享类中的错误时,仅将定义的pas单元复制到所有软件模块并重新编译它们是不够的.不幸的是,您必须将固定的代码片段逐个复制并粘贴到每个模块中,并将其粘贴到适当的单元和类中.这需要花费很多时间,这是我想要消除的,选择正确的方法 - 请帮助我.

我认为使用BPL是一个很好的解决方案,但它有一些缺点,正如你们有些人提到的那样.最糟糕的问题是,如果每个EXE需要几个BPL,我们的技术支持人员将不得不知道哪个EXE需要哪个BPL,然后为最终用户提供适当的文件.只要我们没有软件更新程序,这对我们的技术人员和最终用户来说都是一个很大的优势.他们肯定会迷茫和愤怒: - /.

兼容性问题也可能发生 - 如果一个BPL由许多EXE共享,一个BPL的修改对于一个EXE是好的而对另一个也是坏的 - @Warren P.

那么我应该怎么做才能在这么多项目中更快地修复错误?我想到了以下方法之一.如果您有更好的想法,请告诉我.

  • 将共享代码放入单独的独立的pas单元中,因此当其中一个错误修复时,将其复制到所有项目(覆盖旧文件)并重新编译所有项目就足够了.

只要修改了后面修改的代码,这个解决方案似乎就可以了.但是我们也有具有一般使用功能和程序的通行单元,这通常是不可修改的 - 我们在必要时在那里添加新功能,但是在单个项目中.因此,假设您在100个模块中的一个模块中编写了一个新函数,并将其放入其通用单元中.一两个月之后,您修改了一个不同的模块,您认为您需要在2个月前编写的相同功能.您必须找到该模块(如果您不记得它是哪个模块很困难)并将该功能复制到您的代码中.显然 - 只要每个模块中的一般使用单元分别存储在每个模块中,它们就会完全不同.然后,如果有一个错误修复要做...整个故事重复.

  • 为所有共享代码创建BPL,但将它们链接到EXE,以便EXE是独立的.

对我来说,这似乎是现在最好的解决方案,但有几个缺点.如果我在BPL中修复错误,每个程序员都必须更新他们计算机上的BPL.如果他们忘了怎么办?但是,我认为这是一个小问题.如果我们负责通知对方有关变化,一切都应该没问题.

  • @CodeInChaos:我不知道我是否理解你.你的意思是在项目之间共享pas文件?怎么做?我们在SVN中存储源代码.这意味着我们必须将共享代码存储在单独的文件夹中,并使所有项目在那里搜索该代码,对吧?并从SVN下载一个项目及其依赖的所有文件夹......

请帮我选择一个好的解决方案.我只是因为一种愚蠢的软件开发方法,我不希望公司因错误修正而损失更多的时间和金钱.

非常感谢你.

delphi bpl

11
推荐指数
2
解决办法
3293
查看次数

调试期间算术下溢或溢出异常

这是奇怪行为的一天.

我们有一个用Delphi 2007创建的Win32项目,它承载.NET运行时并调用.NET来显示新表单,作为过渡期的一部分.

最近我们开始在看似随机的位置和代码点处遇到异常:算术溢出或下溢.

其中一个的堆栈跟踪如下所示:

at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.RunDialog(Form form)
at System.Windows.Forms.Form.ShowDialog(IWin32Window owner)
at System.Windows.Forms.Form.ShowDialog()
at Gatsoft.Gat.UI.Windows.Forms.Remanaging.RemanageForm.DelphiOpenInNewMode(String employeeCode, String departmentCode, DateTime date) in C:\Dev\VS.NET\Gatsoft\Gatsoft.Gat.UI.Windows\Forms\Remanaging\RemanageForm.Delphi.cs:line 67
Run Code Online (Sandbox Code Playgroud)

在Visual Studio解决方案中,最外面的类库之一(即拉入它可以引用的所有引用)已经设置了一个特定的调试程序,目标是Delphi项目输出.这允许我们从Visual Studio调试.NET代码,即使程序的主要部分是用Delphi编写的.

问题只发生在从调试器运行时,而不是直接运行exe文件(通过浏览器,快捷方式,甚至是Visual Studio内部Ctrl+ F5).

有明显的机器上没有间谍软件(以As暗示).

我们可以查看其他任何东西吗?


编辑:看起来.NET调试器正在启用此SNaN标志,而Delphi调试器则没有.我们将不得不进一步调查,但现在我会接受@Lorenzo Boccaccia的回答.

显然解决了

好吧,看起来我们终于解决了这个问题.在没有连接调试器的情况下,问题就开始发生了,对于我们的测试人员来说,所以我们不得不优先考虑问题.

最后,我们发现了有问题的机器的一个常见问题,它们是带有NVIDIA Quadro NVS 110M的Dell Lattitude D620笔记本电脑,以及用于配置笔记本电脑的系统映像的旧驱动程序,从2006年开始.

我在网上发现了一个帖子,但是当我重新启动以更新显示驱动程序时,我丢失了网址,因为.NET服务崩溃,主要是当机器忙于在屏幕上做某事时.重现他的问题的一种方法是打开命令提示符C:\并执行一个DIR /S只是强制大量的屏幕更新,这将触发崩溃.

他也有一张NVIDIA显卡.

我的机器上的问题大致发生在我们程序的每2-4个初创公司,但在更新视频驱动程序后,我有123个成功的初创公司没有任何问题.(顺便说一句,我可以为这些东西推荐AutoHotKey).

所以看起来我们已经找到了罪魁祸首,一个老/错误的NVIDIA驱动程序.

更新了这个问题,以便将来有人可以节省一些时间.

现在,如果你原谅我,我会在角落里哭泣. …

random debugging exception visual-studio

10
推荐指数
1
解决办法
2345
查看次数

DLL,内存映射,基地址,内存使用和.NET?

在我开始讨论真正的问题之前,我只想说我可能会在这里得到一些错误的细节.如果是这样,请逮捕我,甚至不要回答我的问题.

我的问题基本上是关于DLL和.NET的.我们有一个使用相当多内存的应用程序,我们正试图弄清楚如何正确地测量它,特别是当问题主要发生在客户端的计算机上时.

让我感到震惊的是,我们有一些相当大的.NET程序集和生成的ORM代码.

如果我使用的是具有唯一基址的非托管(Win32)DLL,则同一台计算机上的多个并发进程会将DLL加载到物理内存中,并将其映射到所有应用程序的虚拟内存中.因此,物理内存将用于此DLL一次.

问题是.NET程序集会发生什么.这个DLL包含IL,虽然它的这一部分可能在应用程序之间共享,但是这个IL产生的JITted代码呢?这是共享的吗?如果没有,我如何衡量以解决这个问题实际上是否导致问题?(是的,我知道,它会有所贡献,但我不会花太多时间在这上面,直到这是最大的问题).

另外,我知道我们没有查看解决方案中所有.NET程序集的基址,.NET程序集是否有必要这样做?如果是这样,是否有一些关于如何确定这些地址的指南?

任何对这一领域的见解都是最受欢迎的,即使事实证明这不是一个大问题,甚至根本不是问题.


编辑:刚刚发现这个问题:.NET程序集和DLL rebasing部分回答了我的问题,但我仍然想知道JITted代码如何影响所有这些.

从该问题及其接受的答案看来,JITted代码放在堆上,这意味着每个进程将加载共享二进制程序集映像,并在其自己的内存空间内生成代码的私有JITted副本.

我们有什么方法可以衡量这一点吗?如果这会产生大量代码,我们必须更多地查看生成的代码,以确定是否需要调整它.


编辑:在此处添加了一个较短的问题列表:

  1. 是否有任何意义确保.NET程序集的基址是唯一且不重叠的,以避免重新定义一个主要用于从JIT中获取IL代码的dll?
  2. 我如何测量JITted代码使用多少内存来确定这是否真的是一个问题?

@Brian Rasmussen 在这里的答案表明JITting将按照我的预期生成JITted代码的每个进程副本,但是重新组装程序集实际上会减少内存使用量.我将不得不深入研究他提到的WinDbg + SoS工具,我已经在我的列表上停留了一段时间,但现在我怀疑我不能再把它关掉了:)


编辑:我在这个主题上找到的一些链接:

.net memory dll base-address

10
推荐指数
1
解决办法
4285
查看次数

在IIS7上托管Mercurial

请注意,这可能最适合serverfault.com,但由于它是关于托管程序员源代码存储库,我不完全确定.我先在这里发帖,相信它会在必要时进行迁移.

我正在尝试在我自己的服务器上托管我的Mercurial存储库的克隆(我在其他地方有主要的repo),并且我正在尝试在IIS下设置Mercurial.

我在这里按照指南,但我收到一条错误消息.

解决:有关详细信息,请参阅此问题的底部.

错误消息是:

mercurial.error.RepoError:找不到存储库/路径/到/ repo /或/ config

这就是我做的.

  1. 我安装了Mercurial 1.5.2
  2. 我创建了c:\ inetpub\hg
  3. 我按照网页的说明下载了hg源代码,并将hgweb.cgi文件复制到了c:\ inetpub\hg(注意,网页说hgwebdir.cgi,但是这个特定的文件不存在hgweb.cgi,但是,这可能是问题的根源?)
  4. 我添加了一个hgweb.config,其中包含以下内容:

    [paths]
    repo1 = C:/hg/**
    [web]
    style = monoblue
    
    Run Code Online (Sandbox Code Playgroud)
  5. 我创建了c:\ hg,创建了一个子目录测试,并在其中创建了一个存储库

  6. 我从网站上安装了python 2.6.5,最新的2.6版本(网页提到我需要安装正确的版本,否则我会收到一条特定的错误信息,因为我没有收到类似于上面提到的错误消息,我认为2.6.5不是问题)
  7. 我添加了一个新的虚拟主机hg.vkarlsen.no,将其指向c:\ inetpub\hg
  8. 对于这个主机,我在Handler Mappings部分下添加了一个脚本映射,根据c:\python26\python.exe -u %s %s网站上的说明将*.cgi映射到.

然后我通过导航到http://hg.vkarlsen.no/hgweb.cgi测试它,但是我收到一条错误消息.

为了更容易测试,我下载到命令提示符,导航到c:\ inetpub\hg,并执行以下命令(错误消息是下面文本的一部分):

C:\inetpub\hg>c:\python26\python.exe -u hgweb.cgi
Traceback (most recent call last):
  File "hgweb.cgi", line 16, in <module>
    application = hgweb(config)
  File "mercurial\hgweb\__init__.pyc", line 12, in hgweb

  File "mercurial\hgweb\hgweb_mod.pyc", line …
Run Code Online (Sandbox Code Playgroud)

mercurial iis-7 windows-server-2008

10
推荐指数
1
解决办法
2973
查看次数

将元信息附加到.NET中的对象

我很确定这是一个重复的问题,但我找不到原文.

我得到一些我需要"附加"一些信息的对象.基本上,如果该对象回到同一段代码,我需要看到我以前见过它.

即.这样的事情:

Dictionary<WeakReference<ObjectType>, string> _Cache;
Run Code Online (Sandbox Code Playgroud)

注意那里的弱引用(我知道WeakReference不是通用的btw),我需要使缓存的键成为弱引用,以处理对象被GC控制掉的事实.

现在,我可以使缓存充满弱引用,但我似乎回想起.NET中已经存在的类似类型的系统,它与对象一起自动GC.

请注意,我不记得这样的开销,所以在确定这是一个比我自己的缓存更好/更好的解决方案之前,我将确保阅读有关主题.不幸的是我无法更改有问题的对象,所以我需要在其他地方跟踪这个元信息.

我的局限:

  • 对象不是我的,所以我不能以任何可能的方式改变它
  • 我不能从对象继承,因为它是密封的,此外,我了对象,我没有构造它们,所以我必须能够用一个后代类型的新对象替换一个实例有用
  • 对象是GC控制的,所以我不能只使用一个字典,它将慢慢填满,或者通过"引用"到非对象的对象,或者将保持对象,我需要一个弱的字典引用键(因此:自定义词典)
  • 这些对象,虽然我可以将它们封装在我自己的代码中并因此随身携带所需的信息,然后传递回我自己控制的框架,并从同一个回馈给我,因此我需要能够检索/仅使用相关对象查找旧信息

基本上,像:

PropertyAttacher.Attach(instance, "Name", name);
Run Code Online (Sandbox Code Playgroud)

我记得没错吗?涉及的课程是什么?

.net

10
推荐指数
1
解决办法
159
查看次数

UIWebView和keep-alive?

我正在设置一个UIWebView通过检索MPJEG流的URL显示网络摄像头的内容.

我发现如果我想切换到不同的相机,如果我没有重置整个内容,它看起来更平滑UIWebView,而是在我加载到它的页面中设置一个javascript函数,来替换图像的内容, 像这样:

<img id='iImage' src='about:blank'>
<script type='text/javascript'>
function show(url)
{
    iImage.src = url;
}
</script>
Run Code Online (Sandbox Code Playgroud)

如果我没有这样做,每次我切换到一个新的URL,UIWebView白色一两秒,直到新内容准备好显示,上面的代码它只是直接替换内容,没有白化.

但是,如果我在两个视频流之间来回切换,在某些时候我会收到错误UIWebView,并且通过反复试验我发现第4次在视图中显示相同的视频流时会发生这种情况.如果我尝试在浏览器选项卡中打开4个视频流,那么第4个就会陷入加载周期,直到我关闭前三个中的一个.

这让我相信:

  1. 有问题的摄像机只能同时为3个流提供服务
  2. 更改标记上的src属性<img...>不会关闭上一个流

这可以与keepalive联系起来吗?即使我已经停止在<img...>标记中显示它们,webkit浏览器系统是否可以使之前的流保持活动状态?

基本上,重现我可以这样做:

  1. 在a中设置上述内容 UIWebView
  2. 这叫4次: wv.EvaluateJavascript("show(url)")

在第4个电话,我在中间得到一个蓝色问号.

可以保持活着是罪魁祸首吗?如果是这样,我能控制它吗?

keep-alive uiwebview ios

10
推荐指数
1
解决办法
1223
查看次数

如何让Visual Studio 2012正确呈现等宽字体?

在我的Visual Studio 2012中,等宽字体无法正确呈现,特别是它们无法正确呈现"等宽",即.字符的宽度不均匀.

这是一个例子,这个:

// 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
// -|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|
Run Code Online (Sandbox Code Playgroud)

使用Consolas 10点,100%缩放渲染:

consolas 10点100%变焦

这是101%缩放:

consolas 10点101%变焦

101%变焦时还有其他小问题,因此两者都不好.有没有办法让我配置Visual Studio以正确呈现等宽字体?

我试过以下字体:

索拉
consolas 10点100%变焦

信使
快递10点100%变焦

快递新
快递新10点100%变焦

终奌站
终端10点100%变焦

显然,我尝试在Visual Studio中无法正确呈现等宽字体.

如果我在Notepad2中使用完全相同的字体和字体大小,如Consolas: notepad2 consolas 10点

将notepad2和Visual Studio与Consolas进行比较

notepad2 consolas 10点
consolas 10点100%变焦

有什么我能做的吗?

细节:

  • Windows 7的
  • Cleartype已启用
  • Windows中的字体大小设置为100%

Visual Studio 2012字体对话框:

Visual Studio 2012字体对话框

fonts monospace visual-studio-2012

10
推荐指数
1
解决办法
3836
查看次数