我按顺序继承了一个控件,所以我可以添加一些我需要的字段,但现在当我在运行时创建它时,我得到一个Access Violation.不幸的是,这种访问冲突不会发生在我正在创建控件的地方,甚至那些我在启用所有调试选项的情况下构建的(包括"使用调试DCU构建")堆栈跟踪根本无法帮助我!
在我尝试重现错误时,我尝试创建一个控制台应用程序,但显然这个错误只出现在Forms应用程序中,并且只有当我的控件实际显示在表单上时!
以下是重现错误的步骤.创建一个新的VCL Forms应用程序,单击一个按钮,双击以创建OnClick处理程序并写入:
type TWinControl<T,K,W> = class(TWinControl);
procedure TForm3.Button1Click(Sender: TObject);
begin
with TWinControl<TWinControl, TWinControl, TWinControl>.Create(Self) do
begin
Parent := Self;
end;
end;
Run Code Online (Sandbox Code Playgroud)
每次我尝试时,这都会连续生成访问冲突.仅在Delphi 2010上测试过,因为这是我在这台计算机上唯一的版本.
问题是:
以下是质量控制报告的链接:http://qc.embarcadero.com/wc/qcmain.aspx?d = 112101
这是由如何比较TFunc/TProc包含对象的功能/过程?,特别是大卫对巴里问题的评论.由于我没有博客发布这个问题,我将在这里提出这个问题并回答.
问题:Delphi的匿名方法中何时以及如何引用变量?
例:
procedure ProcedureThatUsesAnonymousMethods;
var V: string;
F1: TFunc<string>;
F2: TFunc<string>;
begin
F1 := function: string
begin
Result := V; // references local variable
end
V := '1';
F2 := function: string
begin
Result := V;
end
V := '2';
ShowMessage(F1);
ShowMessage(F2);
end;
Run Code Online (Sandbox Code Playgroud)
两者ShowMessage都将展示2.为什么?如何V捕获以及何时捕获?
我可以滚动文本,TranslateTransform但是当动画接近结束时,我希望它再次开始.像蛇一样:)
这就是我所拥有的:
<StackPanel Orientation="Horizontal" Margin="0,0,0,0">
<StackPanel.RenderTransform>
<TranslateTransform x:Name="transferCurreny" X="-40"/>
</StackPanel.RenderTransform>
<StackPanel.Triggers>
<EventTrigger RoutedEvent="StackPanel.Loaded">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation From="0" To="-900" Duration="00:00:10"
Storyboard.TargetProperty="X"
Storyboard.TargetName="transferCurreny"
RepeatBehavior="Forever"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</StackPanel.Triggers>
<TextBlock FontSize="25" x:Name="txtKron" Margin="10,0,7,0"/>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)
这就是我想要的:

我经常使用以下代码:
function GetNumber(Handle : THandle) : Integer;
begin
FLock.BeginRead;
try
if FMap.TryGetValue(Handle, Object) then
raise EArgumentException.Create('Invalid handle');
Result := Object.Number;
finally
FLock.EndRead;
end;
end;
Run Code Online (Sandbox Code Playgroud)
不幸的是编译器给了我所有这些方法的警告:
[DCC Warning] Unit.pas(1012): W1035 Return value of function 'GetNumber' might be undefined
Run Code Online (Sandbox Code Playgroud)
我知道这个警告,但在这种情况下,我根本看不出任何理由.或者是否存在我遗漏的情况会导致未定义的结果值?在这种情况下,我理解警告,try..except但对try..finally我来说没有意义.
问题:
Result := Object.Number线移出锁定不是一个选项,我想避免Result := 0在每个函数的顶部写一个完全不必要的行)谢谢!
使用Delphi 2010,假设我有一个声明如下的类:
TMyList = TList<TMyObject>
Run Code Online (Sandbox Code Playgroud)
对于这个列表,Delphi为我们提供了一个枚举器,所以我们可以这样写:
var L:TMyList;
E:TMyObject;
begin
for E in L do ;
end;
Run Code Online (Sandbox Code Playgroud)
麻烦的是,我想写这个:
var L:TMyList;
E:TMyObject;
begin
for E in L.GetEnumerator('123') do ;
end;
Run Code Online (Sandbox Code Playgroud)
也就是说,我希望能够使用某些标准为同一列表提供多个枚举器.不幸的是,实现for X in Z需要存在一个函数Z.GetEnumerator,没有参数,返回给定的枚举器!为了解决这个问题,我正在定义一个实现"GetEnumerator"函数的接口,然后我实现了一个实现接口的类,最后我在TMyList上编写了一个返回接口的函数!而且我正在返回一个界面,因为我不想被手动释放非常简单的类所困扰......任何方式,这需要很多打字.这是这样的:
TMyList = class(TList<TMyObject>)
protected
// Simple enumerator; Gets access to the "root" list
TSimpleEnumerator = class
protected
public
constructor Create(aList:TList<TMyObject>; FilterValue:Integer);
function MoveNext:Boolean; // This is where filtering happens
property Current:TTipElement;
end;
// Interface that will create the TSimpleEnumerator. Want this
// to …Run Code Online (Sandbox Code Playgroud) 我有一个我需要在多个项目中继承的自定义框架.这个框架包含一些代码和一些组件,它位于磁盘上的某个位置,位于它自己的项目目录中.我不想将它复制到Object Repository文件夹,这对我来说似乎不对:我最终有两个表单副本,一个在我的Mercurial支持的存储库中,一个在Delphi的Object Repository中.绝对不是个好主意.
我想要的是让我的框架在一个包中,并让包执行使IDE知道框架所需的所有内容,并允许IDE创建给定框架的新兄弟,而无需实际将框架添加到每个项目.
到目前为止我做了什么,我遇到的问题,我试过的解决方案:
RegisterClass和RegisterNoIcon. 问题:当我进入一些其他的项目,并尝试打开得出的帧编辑它说,它无法找到我原来的框架.RegisterCustomModule(TMyFrameName, TCustomModule).问题:在"其他"项目中,我打开派生框架,IDE不会在原始框架上创建组件,并且IDE抱怨其中一个"继承"组件缺失.InitInheritedComponent(Self, TFrame).这有助于,当我尝试在"其他"项目中打开框架时,所有内容都重新创建,我能够按照我的预期看到框架.问题:当我保存框架时,它会忘记所有有关继承组件的内容,将每个组件视为添加到此特定框架的新组件.如果我查看保存的DFM,一切都以"对象"开头,没有任何东西以"继承"开头,正如我所料.不幸的是我遇到了问题"3".我尝试深入研究Classes.pas,ToolsAPI,DesignIntf和DesignEditors,但没有找到任何有用的东西.显然我希望在DFM中看到的"继承"属性是由TWriter在流式传输TComponent之前分配"TWriter.Ancestor"属性时生成的,但是我无法设置它,IDE需要设置它起来.我不能说服IDE为我做这件事.
以下是累积的相关代码部分:
TTestFrame = class(TFrame)
public
constructor Create(Owner:TComponent);override;
end;
constructor TTestFrame.Create(Owner: TComponent);
begin
inherited;
if csDesignInstance in ComponentState then InitInheritedComponent(Self, TFrame);
end;
procedure Register;
begin
RegisterClass(TTestFrame);
RegisterNoIcon([TTestFrame]);
RegisterCustomModule(TTestFrame, TCustomModule);
end;
Run Code Online (Sandbox Code Playgroud)
任何想法,除了"放弃并将你的东西放入对象存储库"?谢谢!
编辑
为什么我需要这样做以及为什么依赖于实际路径名称的解决方案被写入我的项目文件中的原因不起作用:我想支持分支:当一个分支时,合理地期望同一个项目的多个版本"活着"同一台机器上的不同目录.推论,我不能在同一个地方同时拥有同一个项目的多个版本.
为了确保这项工作,我决定让我的项目不依赖于生活的地方,为了实施这一点,我的团队克隆(Mercurial术语)或Check Out(SVN术语)的每个人都在不同的目录中.我系统上的硬编码路径在我的同事系统中不会很好:如果我们中的任何一个人犯了将任何路径硬编码到应用程序中的错误,那么它不久就会对我们中的一个进行制动,所以错误得到修复.
这当然是我们需要继承的某些库(因此它们不在我们项目的目录中)的一部分的表单和框架的问题!为了在处理这些文件时获得IDE支持,我们需要暂时将它们添加到项目中,我们不必忘记在完成后删除它们.如果我们忘记并推送/检查更改,更改将为我们的同事制造构建(因为他们在不同位置检查了库).
为了解决这个问题,我尝试将这些框架和表单添加到设计时包中(使用完整路径将包加载到IDE中,但路径不是项目文件的一部分,所以没关系).不幸的是,这失败了,我发布了这个问题.
我有一个应该使用缓存的用户控件VaryByControl.该.ascx文件如下所示:
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="TestControl.ascx.cs" Inherits="mynamespace.TestControl" %>
<%@ OutputCache Duration="10" Shared="true" VaryByControl="Test" %>
<p id="SomeText" runat="server">Nothing</p>
Run Code Online (Sandbox Code Playgroud)
该TestControl代码隐藏文件类有一个int Test {...}属性和Page_Load()填充事件处理SomeText同款:
SomeText.InnerText = string.Format(@"Test={0} at {1}", Test, DateTime.Now)
Run Code Online (Sandbox Code Playgroud)
我有一个.aspx看起来像这样的文件:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="TestPage.aspx.cs" Inherits="mynamespace.TestPage" %>
<%@ Register TagPrefix="xxx" TagName="TestControl" Src="Controls\TestControl.ascx" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<xxx:TestControl Test="6" runat="server" />
<xxx:TestControl Test="7" runat="server" />
<hr /> …Run Code Online (Sandbox Code Playgroud) 在Delphi prism中,我们可以声明仅在特殊场合需要的变量.
例如:在棱镜中
If acondition then
begin
var a :Integer;
end;
a := 3; //this line will produce error. because a will be created only when the condition is true
Run Code Online (Sandbox Code Playgroud)
这里'a'不能与3分配,因为它嵌套在分支内.我们如何声明一个只能在delphi win32中的分支内部使用的变量.所以我可以减少内存使用量,因为它只在某个条件成立时才会被创建;
如果减少内存使用不是问题我们有什么缺点(或者我们没有)
我不希望用户摆弄Share对话框.还欢迎更改共享名称,评论,用户限制等其他信息.
谢谢SoulBlade(使用Delphi 7)
我是唯一使用该产品的人,但我需要在4台不同的计算机上安装VS:我的办公桌面,一台虚拟机,我的家用台式机和笔记本电脑.
我已经使用MSDN操作系统订阅了很多年,所以我对我允许做什么有一个大概,但我不明白是否Visual Studio Professional with MSDN允许我安装VS Pro的多个副本.
为了让您了解我正在寻找的东西,我目前正在使用Delphi 2010 Named User:这允许我在多台计算机上安装Delphi,因为我是唯一使用这些Delphi安装的人.
delphi ×7
delphi-2010 ×4
animation ×1
asp.net ×1
caching ×1
delphi-7 ×1
delphi-xe ×1
enumerator ×1
filter ×1
foreach ×1
forms ×1
loadcontrol ×1
marquee ×1
msdn ×1
repository ×1
runtime ×1
share ×1
unc ×1
winapi ×1
wpf ×1