标签: delphi-2007

记录文件错误

我正在使用Delphi 2007,我正在尝试制作记录类型文件.在Delphi 7中,对我来说没有任何问题.

Type
Kompiuteris = record
...
end;
Failas = file of Kompiuteris;
Run Code Online (Sandbox Code Playgroud)

但是在Delphi 2007中,我遇到了问题.错误说:类型"Kompiuteris"需要最终确定.那么,有什么不对?

delphi record delphi-2007

2
推荐指数
1
解决办法
440
查看次数

更改控制台大小

Delphi中的简单问题.我已经创建了一个控制台应用程序,我需要将控制台窗口的高度更改为80行,如果它小于80行.这需要从代码中完成,并且实际上是在代码中有条件的.(即发生错误时,它会增加控制台的大小,以便显示整个(巨大的)错误报告.)
请记住,这是一个控制台应用程序!当它启动时,它使用默认控制台,我需要改变它!

delphi console-application delphi-2007

2
推荐指数
1
解决办法
1823
查看次数

在两个版本之间共享项目

Delphi是一个很棒的IDE和编译器.但有时它也有一些小缺陷.就像我现在的问题一样......
我正在研究一个在Delphi 2007中创建的项目.但我喜欢使用Delphi XE,因为IDE有一些有趣的功能,而且它在我的计算机上更加稳定.所以我在Delphi XE中打开了这个项目并且一直在改变代码,并考虑到了向后兼容性.
当我再次保存项目以在D2007中打开它时,它在阅读项目时遇到了问题.XE的dproj文件与2007不兼容.要再次在D2007中打开项目,我需要删除dproj文件并打开dpr文件.(或者我需要保存2007年的旧项目文件,并在我想再次使用D2007时再次将其恢复.)

这很烦人.有没有人知道为每个版本保留正确的dproj文件的更好的解决方案?

delphi delphi-2007 delphi-xe

2
推荐指数
1
解决办法
759
查看次数

如何将行附加到Excel工作表?

我正在开发一个需要生成Excel工作表的应用程序.我们如何将行附加到现有的Excel工作表?我正在使用Delphi 2007.(我正在使用SM软件TXLS ......组件......但我对本机delphi excel组件的答案感到满意).普拉迪普,感谢大家

delphi excel delphi-2007

2
推荐指数
1
解决办法
7488
查看次数

如何在C#中模拟Delphi 2007 SecondsBetween函数?

这是对前一个问题的跟进: 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应用程序编写的文本文件.

c# delphi datetime delphi-2007

2
推荐指数
1
解决办法
680
查看次数

使用OnDrawItem事件时,TListview未正确绘制

我正在使用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)

delphi delphi-2007 delphi-xe3

2
推荐指数
1
解决办法
2013
查看次数

使用TStrings拆分字符串,省略CRLF分隔符

我有字符串'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激活?

delphi delphi-2007

2
推荐指数
1
解决办法
753
查看次数

Delphi - 访问提示窗口的画布

是否有一种简洁的方式来访问提示窗口的画布?我不想在画布上绘制任何东西 - 我将只分配给组件的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个左右空间宽度的下一个倍数.

delphi canvas hint delphi-2007

2
推荐指数
1
解决办法
707
查看次数

竞争条件 - Mutexes可以更灵活吗?

我有一个名为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)

delphi multithreading mutex delphi-2007

2
推荐指数
1
解决办法
140
查看次数

如何在delphi中正确地转换和传递参数

我有一个非常简单的代码片段,您可以在此处查看:

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.

提前致谢!

arrays delphi pointers casting delphi-2007

2
推荐指数
1
解决办法
138
查看次数