我正在使用Delphi 2007,我正在尝试制作记录类型文件.在Delphi 7中,对我来说没有任何问题.
Type
Kompiuteris = record
...
end;
Failas = file of Kompiuteris;
Run Code Online (Sandbox Code Playgroud)
但是在Delphi 2007中,我遇到了问题.错误说:类型"Kompiuteris"需要最终确定.那么,有什么不对?
Delphi中的简单问题.我已经创建了一个控制台应用程序,我需要将控制台窗口的高度更改为80行,如果它小于80行.这需要从代码中完成,并且实际上是在代码中有条件的.(即发生错误时,它会增加控制台的大小,以便显示整个(巨大的)错误报告.)
请记住,这是一个控制台应用程序!当它启动时,它使用默认控制台,我需要改变它!
Delphi是一个很棒的IDE和编译器.但有时它也有一些小缺陷.就像我现在的问题一样......
我正在研究一个在Delphi 2007中创建的项目.但我喜欢使用Delphi XE,因为IDE有一些有趣的功能,而且它在我的计算机上更加稳定.所以我在Delphi XE中打开了这个项目并且一直在改变代码,并考虑到了向后兼容性.
当我再次保存项目以在D2007中打开它时,它在阅读项目时遇到了问题.XE的dproj文件与2007不兼容.要再次在D2007中打开项目,我需要删除dproj文件并打开dpr文件.(或者我需要保存2007年的旧项目文件,并在我想再次使用D2007时再次将其恢复.)
这很烦人.有没有人知道为每个版本保留正确的dproj文件的更好的解决方案?
我正在开发一个需要生成Excel工作表的应用程序.我们如何将行附加到现有的Excel工作表?我正在使用Delphi 2007.(我正在使用SM软件TXLS ......组件......但我对本机delphi excel组件的答案感到满意).普拉迪普,感谢大家
这是对前一个问题的跟进: C#与Delphi中的日期/时间计算之间的差异
我正在将用Delphi编写的企业应用程序移植到C#.该应用程序使用非常基本的加密形式来存储它生成的文本文件.此加密基于Delphi SecondsBetween命令,该命令返回两个日期之间的秒数.
对我来说问题是,在旧版本的Delphi(我正在移植的版本)中,SecondsBetween命令存在一个错误,导致它返回一个关闭的值 - 但只有大约50%的时间
这个bug是一个舍入错误.Delphi最初使用的是Trunc而不是Round.在此处查看更多详细信息 - http://qc.embarcadero.com/wc/qcmain.aspx?d=59310
以下是演示此问题的代码:
德尔福:
SecondsBetween(StrToDateTime('16/02/2009 11:25:34 p.m.'), StrToDateTime('1/01/2005 12:00:00 a.m.'));
130289133
Run Code Online (Sandbox Code Playgroud)
C#:
TimeSpan span = DateTime.Parse("16/02/2009 11:25:34 p.m.").Subtract(DateTime.Parse("1/01/2005 12:00:00 a.m."));
130289134
Run Code Online (Sandbox Code Playgroud)
我想要做的是弄清楚如何在C#中模拟这种错误的行为,以便我可以读/写Delphi应用程序编写的文本文件.
我正在使用TlistView组件中的OnDrawItem事件来使用自定义颜色绘制内容,但是当滚动listview时会出现一些工件.

这是使用的代码.
procedure TForm35.FormCreate(Sender: TObject);
var
i, j : integer;
Item : TListItem;
s : string;
begin
for i:= 0 to 99 do
begin
Item:=ListView1.Items.Add;
for j:= 0 to ListView1.Columns.Count-1 do
begin
s:= Format('Row %d Column %d',[i+1, j+1]);
if j=0 then
Item.Caption :=s
else
Item.SubItems.Add(s);
end;
end;
end;
procedure TForm35.ListView1DrawItem(Sender: TCustomListView; Item: TListItem;
Rect: TRect; State: TOwnerDrawState);
var
x, y, i: integer;
begin
if odSelected in State then
begin
TListView(Sender).Canvas.Brush.Color := clYellow;
TListView(Sender).Canvas.Font.Color := clBlack;
end
else
begin
TListView(Sender).Canvas.Brush.Color := …Run Code Online (Sandbox Code Playgroud) 我有字符串'AAA'+#$0d+#$0a+'BBB'+#$01d+'CCC'.我需要根据#$ 1d字符拆分:
'AAA'+#$0d+#$0a+'BBB'
'CCC'
Run Code Online (Sandbox Code Playgroud)
我正在使用功能:
procedure Split(Delimiter: Char; Str: string; ListOfStrings: TStrings) ;
begin
ListOfStrings.Clear;
ListOfStrings.Delimiter := Delimiter;
ListOfStrings.DelimitedText := Str;
ListOfStrings.StrictDelimiter:= true;
end;
...
split(#$1d,'AAA'+#$0d+#$0a+'BBB'+#$01d+'CCC',sl);
Run Code Online (Sandbox Code Playgroud)
不幸的是,它根据CRLF分裂,我不需要.
如何让字符串只被#$ 1d激活?
是否有一种简洁的方式来访问提示窗口的画布?我不想在画布上绘制任何东西 - 我将只分配给组件的Hint属性 - 但我确实想要找出Windows使用提示窗口文本使用的任何字体呈现的文本宽度.
*原因*
我正在尝试构建带有标签列的提示窗口,例如
SomeControl.Hint :=
'Item 1: ' + #9 + 'Tom' + #13 +
'Item 2: ' + #9 + 'Dick' + #13 +
'Another Item: ' + #9 + 'Harry' + #13 ;
Run Code Online (Sandbox Code Playgroud)
我希望所有标签的名称都在彼此之下.仅当提示字体为单倍间距时,上面显示的示例才会正确显示.我可以通过试验和错误通过填充具有正确数量的空格的行来使用给定的比例字体来实现它,但我希望它适用于任何字体.我看到的大多数示例似乎都是为了改变提示窗口的外观 - 我想做的就是能够调用Canvas.TextWidth所以我可以计算我需要添加什么填充来"推"下一个制表位上的线.
*更新*
我在误解中工作 - 我假设提示控件尊重制表符,但实际上它似乎忽略了它.另一方面,TLabel组件确实尊重制表符 - 它似乎移动到10个左右空间宽度的下一个倍数.
我有一个名为TTestThread的TThread对象.创建线程后,它们会创建全局配置变量的本地副本.允许用户随时更改全局配置变量,当他这样做时,所有线程都会通过其本地UpdateLocalCopyOfConfigVariables变量通知更改.线程不直接依赖全局配置变量,因为用户可以在任何时候修改它们,如果线程同时访问它们,则会产生竞争条件.
这是TTestThread:
type
TTestThread = class(TThread)
private
LocalConfigA : String;
LocalConfigB : Integer;
procedure UpdateLocalConfigIfNecessary;
protected
procedure Execute; override;
public
UpdateLocalCopyOfConfigVariables : Boolean;
constructor Create;
end;
implementation
constructor TTestThread.Create;
begin
inherited Create(false);
UpdateLocalCopyOfConfigVariables := true;
end;
procedure TTestThread.UpdateLocalConfigIfNecessary;
begin
WaitForSingleObject(ConfigurationLocker, INFINITE);
if (UpdateLocalCopyOfConfigVariables) then
begin
LocalConfigA := GlobalConfigA;
LocalConfigB := GlobalConfigB;
UpdateLocalCopyOfConfigVariables := false;
end;
ReleaseMutex(ConfigurationLocker);
end;
procedure TTestThread.Execute;
begin
while (not(Terminated)) do
begin
UpdateLocalConfigIfNecessary;
// Do stuff
end;
end;
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我有一个互斥锁,以避免前面描述的那种竞争条件.WaitForSingleObject(ConfigurationLocker,INFINITE); 在用户更改全局配置变量时调用:
procedure …Run Code Online (Sandbox Code Playgroud) 我有一个非常简单的代码片段,您可以在此处查看:
type
TMatrix = array of array of Byte;
PMatrix = ^TMatrix;
const
testarray:array [0..2,0..2] of Byte=(
(1,2,3), (4,5,6), (7,8,9));
function PickValue(input:PMatrix):Byte;
begin
Result:=input^[1,3];
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Showmessage(inttostr(PickValue(@testarray)));
end;
end.
Run Code Online (Sandbox Code Playgroud)
如何正确地投射testarray以将其传递给PickValue函数?上面的代码以当前形式崩溃.我正在使用delphi 2007.
提前致谢!