我已经看了很久了,最后决定把问题放在这里.我有一些我需要维护的应用程序是用Delphi 2007 for .NET(ASP.NET 2.0)编写的.通常,我第一次运行应用程序(使用IIS)时,我得到了经典的"无法在Web服务器上启动调试.无法附加到ASP.NET工作进程"消息.我只需按F9(运行)再次运行.有时我必须尝试运行几次才能实际运行.
我正在运行Windows 7 64位(并且在Vista 64位上看到了相同的效果).我确实为ASP.NET配置了IIS,并且我的Web.config文件中有以下代码.
<system.webServer>
<modules>
<add name="DbgConnect" type="Borland.DbkAsp.DbkConnModule,Borland.dbkasp,Version=10.5.0.0,
Culture=neutral, PublicKeyToken=b0524c541232aae7" preCondition="managedHandler" />
</modules>
<validation validateIntegratedModeConfiguration="false" />
</system.webServer>
Run Code Online (Sandbox Code Playgroud)
关键是我最终可以在调试器中运行应用程序,有时甚至是第一次尝试.很多时候,当我遇到故障时,它会在我按下Run后大约15秒左右发生,有时甚至在我点击一两页(或三个)Web应用程序之后.并且,是的,当Delphi进入这种模式时,我可以简单地运行而无需调试,一切都很好(除非我真的想调试).并且,我可以继续尝试在调试器中运行,最终它将正常工作.
似乎Delphi的.NET调试器在某种程度上得到了应用程序无法运行的想法,然后放弃并停止进程(正如我所提到的那样,有时候显然正在运行).
我知道其他开发者也看到了这种行为.我的问题是,有谁知道如何阻止这种烦人的行为?
我有一个LOGFONT结构.现在我要做的就是从LOGFONT高度获得相关的字体大小.
使用Delphi我想在边框图标按钮上添加另一个按钮; 关闭,最大化,最小化.关于如何做到这一点的任何想法?
我正在尝试创建一个包含长参数字符串(> MAX_PATH)的快捷方式(在桌面上).
在MSDN文档中明确指出,对Unicode字符串的字符串可以超过MAX_PATH.
生成的快捷方式在MAX_PATH字符(即Path+ Arguments)后完全切断.
我的实现是否有问题,或者这是一些Windows限制?
procedure CreateShortcut(APath: WideString;
AWorkingDirectory: WideString; AArguments: WideString; ADescription: WideString;
ALinkFileName: WideString);
var
IObject : IUnknown;
ISLink : IShellLinkW;
IPFile : IPersistFile;
begin
IObject := CreateComObject(CLSID_ShellLink);
ISLink := IObject as IShellLinkW;
ISLink.SetPath( PWideChar(APath));
ISLink.SetWorkingDirectory(PWideChar(AWorkingDirectory));
ISLink.SetArguments( PWideChar(AArguments));
ISLink.SetDescription( PWideChar(ADescription));
IPFile := IObject as IPersistFile;
IPFile.Save(PWideChar(ALinkFileName), False);
end;
Run Code Online (Sandbox Code Playgroud)
PS:操作系统是Windows XP(及以上版本).
根据Delphi文档,我可以TInterfacedObject使用as运算符转换为接口.
但它对我不起作用.强制转换产生编译错误:"运算符不适用于此操作数类型".
我正在使用Delphi 2007.
这是一些代码(控制台应用程序).标记包含错误的行.
program Project6;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
IMyInterface = interface
procedure Foo;
end;
TMyInterfacedObject = class(TInterfacedObject, IMyInterface)
public
procedure Foo;
end;
procedure TMyInterfacedObject.Foo;
begin
;
end;
var
o: TInterfacedObject;
i: IMyInterface;
begin
try
o := TMyInterfacedObject.Create;
i := o as IMyInterface; // <--- [DCC Error] Project6.dpr(30): E2015 Operator not applicable to this operand type
except
on E:Exception do
Writeln(E.Classname, ': ', E.Message);
end;
end.
Run Code Online (Sandbox Code Playgroud) 我有一个Delphi 2007 DBGrid,我想让用户以更新的Excel格式(OOXML)保存,但我的标准是用户不需要安装Excel.有人知道任何组件已经这样做了吗?是的,我已经搜索过了,但我还没有找到任何东西.
我想要优化一段具有这种结构的代码:
while (i > 0) do begin
Dec(i);
Run Code Online (Sandbox Code Playgroud)
这看起来效率低下,所以我尝试这样做:
while (Dec(i) >= 0) do begin
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为Dec是一个过程而不是一个函数.
所以我把它重写为:
procedure Withloop;
var
....
function Decr(var a: integer): integer; inline;
begin
Dec(a);
Result:= a;
end;
...
while (Decr(i) >= 0) do begin
Run Code Online (Sandbox Code Playgroud)
但这会编译成:
SDIMAIN.pas.448: while (Decr(i) >= 0) do begin
00468EE5 8BC4 mov eax,esp
00468EE7 E8D0FEFFFF call Decr <<--- A call??
00468EEC 85C0 test eax,eax
00468EEE 0F8D12FFFFFF jnl $00468e06
00468EF4 EB01 jmp $00468ef7
Run Code Online (Sandbox Code Playgroud)
然而,在程序的另一部分,它内联函数就好了.
我可以使用哪些经验法则(或硬规则)来了解Delphi将遵守该inline指令?
我正在使用ZEOS组件连接到(古老的)MDB数据库.
我正在进行查询,读取大量数据以桥接到不同的数据库.
有没有办法以百分比表示进度?
procedure TForm13.ActionReadInMemoryExecute(Sender: TObject);
var
QueryLine: string;
FullQuery: string;
Tablename: string;
i: integer;
begin
i:= 0;
TableMeter.DisableControls;
try
TableMeter.First;
FullQuery:= '';
while not TableMeter.eof do begin
Tablename:= TableMeter.FieldByName('tabelnaam').AsString;
QueryLine:= ReplaceStr(ImportQuerySjabloon, cTabelname, Tablename);
FullQuery:= FullQuery + QueryLine;
if (TableMeter.RecNo < (TableMeter.RecordCount -1)) then begin
FullQuery:= FullQuery + ' UNION ALL ';
end;
TableMeter.Next;
end; {while}
QueryImportMeterreadings.Close;
QueryImportMeterreadings.SQL.Text:= FullQuery;
QueryImportMeterreadings.Open; <<-- takes a long time
finally
TableMeter.EnableControls;
end;
end;
Run Code Online (Sandbox Code Playgroud)
有没有办法表明查询的进度,或者只有在我拆分各个查询并消除查询时才能这样做UNION.
运行大约需要1分钟,涉及8个工会.
我没有看到任何可以用于此目的的事件:
或者我应该在查询中的字段上伪造一个OnCalcField来执行此操作(不确定原则上是否会起作用).
或者附上一个序列?nope,在Access DB上提供不受支持的操作
我可以使用TeeChart在Delphi中创建堆叠条形图.这是使用循环中添加的值和系列.我更喜欢通过使用查询作为数据源来创建此图表,而不必将每个条形图添加为循环内的单独系列.有没有更好的方法来做到这一点,或者我应该关注的其他类型的图表?该数据是来自井核样本的岩石类型的横截面.数据集包含每个深度和岩石类型测量的记录.它显示为岩石类型的单个垂直列,就像核心样本一样.
+----+
| | record 1 - depth1, rock type 1
| |
+----+
| |
| |
| | record 2 - depth2, rock type 2
| |
+----+
| | record 3 - depth3, rock type 3
+----+
procedure TForm128.GenerateLithologyChart;
var
LSeries: TBarSeries;
i : integer;
LastBot : double;
procedure AddRockSeries(depth : double; col : TColor);
begin
LSeries := TBarSeries.Create(LithologyChart);
LithologyChart.AddSeries(LSeries);
LSeries.AddBar(0, '', clBlue);
if col=clNone then
LSeries.AddNullXY(0,depth,'')
else
LSeries.AddXY(0,depth,'',col);
LSeries.Marks.Visible := False;
LSeries.MultiBar := mbStacked;
LSeries.CustomBarWidth := …Run Code Online (Sandbox Code Playgroud) 我有一个表单,其中包含某些具有事件处理程序的组件.现在我想将这些事件处理程序(那些方法)移动到一个单独的单元,仍然能够在设计时通过Object Inspector将它们分配给组件事件.
是否可以仅为事件方法创建一个单独的单元,以便Object Inspector允许我在设计时分配它们?
假设我是否会使用公共程序制作该单元:
unit Unit2;
interface
procedure ButtonClick(Sender: TObject);
implementation
procedure ButtonClick(Sender: TObject);
begin
// do something here
end;
end.
Run Code Online (Sandbox Code Playgroud)
或者使用已发布方法的类,如下所示:
unit Unit2;
interface
type
TMyClass = class
published
procedure ButtonClick(Sender: TObject);
end;
var
MyClass: TMyClass;
implementation
{ TMyClass }
procedure TMyClass.ButtonClick(Sender: TObject);
begin
// do something here
end;
end.
Run Code Online (Sandbox Code Playgroud)
如何为事件方法创建一个单独的单元,IDE允许我在设计时分配给组件事件?例如:
