小编J..*_*...的帖子

Delphi 2010 - 源文件在编辑器中随机变为只读?

有没有其他人有这个问题,或者我的德尔福不知何故被诅咒?

我将在编辑器的选项卡中打开一堆表单和文件,然后我会输入,然后突然一切都停止了 - 我的.pas文件似乎随机变为只读.

有时我可以右键单击顶部的选项卡并取消选中"只读"并继续,但有时会选中此选项并显示为灰色(禁用),这意味着我无法取消选中它并且我无法进行任何操作进一步编辑该文件.这似乎也是随机的.

在后一种情况下,唯一的解决方案是保存有问题的文件,尽管Delphi断言该文件是只读的,在编辑器中关闭其选项卡,然后重新打开它.真的不是灾难性的,但它开始变得烦人.

可能是因为我不小心碰到键盘命令组合这么做或者这是Delphi中的一个错误?

我在Delphi 2010,Windows 7.怀疑它与已安装的软件包有什么关系,但如果有人想要列表,我将生成它并将其附加到此处.

delphi editor delphi-2010

6
推荐指数
1
解决办法
4387
查看次数

有没有一种方法可以将默认堆栈大小增加到超过16777216字节?

问题说明了一切。尝试增加链接器选项中的堆栈大小会产生错误:

最大堆栈大小必须是65536和16777216之间的整数。

这16MB的限制是Delphi编译器的基本限制,还是IDE施加的任意限制?还有其他增加此值的方法吗?

注意(期待评论...):

  • 之所以需要更大的堆栈,是因为大量的静态数组类型用作局部变量
  • 我了解需要这样做是糟糕设计的征兆
  • 这是一个大型的遗留应用程序,我不负责其设计和维护。
  • 重构为动态数组是可行的,但是会导致50%的性能损失。
  • 其他重构也是可能的-可能需要数周的时间。这很可能会作为一个附带项目结束。
  • 同时,现在需要功能,并且较大的堆栈将很容易解决。
  • 是的,我真的非常知道这是一件坏事,一件坏事。

delphi stack-size delphi-xe2

5
推荐指数
1
解决办法
4311
查看次数

带有TStringList的OutOfMemoryError

我尝试使用streamreader填充字符串列表.但是在填充它时我有一个OutOfMemoryError.我在网上搜索,但找到任何解决方案.我也尝试增加我的字符​​串列表的容量,但它没有任何改变.谢谢你的帮助.

这是我的代码:

list := TStringList.create;
//list.Capacity := 100000000; Doesn't work
Reader := TStreamReader.Create(filename, true);
try
  list.BeginUpdate;
  try
    list.Clear;
    while not Reader.EndOfStream do
    list.Add(Reader.ReadLine); // OutOfMemoryError
  finally
    list.EndUpdate;
  end;
finally
  Reader.Free;
end;
Run Code Online (Sandbox Code Playgroud)

我忘了我的xml文件大小是250个月.

delphi out-of-memory

5
推荐指数
0
解决办法
586
查看次数

为什么保存时会更新源文件创建时间戳?

保存表单或单元时,表单或单元的创建日期将更新为修改时。修改的日期按预期更改,但是创建的日期也更改。为什么修改时间没有专门更新?

delphi delphi-10.2-tokyo

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

Visual Basic.NET:如何创建线程来更新 UI

处理计算量大的任务的常用 VB 方法是将其放入后台工作线程,而主线程继续处理 UI。

不管出于什么原因,我需要以相反的方式执行此操作:主线程执行繁重的工作,后台线程更新 UI。

这是我到目前为止所拥有的。唯一的问题是,虽然 UI 窗口 (Form1) 确实被重绘,但您无法与其交互,甚至无法移动它或调整其大小(鼠标光标变成沙漏状并且无法单击)。

Public Class ProgressDisplay

Private trd As Thread

    Public Sub New()
        trd = New Thread(AddressOf threadtask)
        trd.Start()
    End Sub

    Private Sub threadtask()
        Dim f1 As Form1
        f1 = New Form1
        f1.Show()
        Do
            f1.Update()
            Thread.Sleep(100)
        Loop
    End Sub

End Class
Run Code Online (Sandbox Code Playgroud)

编辑:理想情况下,我需要向客户端呈现这样的界面

Public Class ProgressDisplay
    Public Sub New()
    Public Sub Update(byval progress as int)
End Class
Run Code Online (Sandbox Code Playgroud)

客户端将像这样调用它(实际上是在 COM 上的非托管 c++ 中,但你明白了):

Dim prog = new ProgressDisplay()
DoLotsOfWork(addressof prog.update) ' DoLotsOfWork method takes …
Run Code Online (Sandbox Code Playgroud)

vb.net multithreading message-pump ui-thread applicationcontext

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

使用 TIdTCPClient 异步读取

我\xc2\xb4m是Delphi的新手,我\xc2\xb4m尝试进行一些网络操作。在本例中,我想连接到(让\xc2\xb4s 称之为)通知服务器,该服务器将在发生某些事件时发送字符串。

\n\n

我的第一种方法是这样的:\n我在自己的线程上运行 TIdTCPClient 并设置 ReadTimeout,这样我\xc2\xb4m 就不会总是被阻塞。这样我可以检查线程的终止状态。

\n\n
ConnectionToServer.ReadTimeout := MyTimeOut;\nwhile( Continue ) do\nbegin\n    //\n    try\n        Command := ConnectionToServer.ReadLn( );\n    except\n    on E: EIdReadTimeout do\n        begin\n                //AnotarMensaje(odDepurar, 'Timeout ' + E.Message );\n        end;\n    on E: EIdConnClosedGracefully do\n        begin\n                AnotarMensaje(odDepurar, 'Conexi\xc3\xb3n cerrada ' + E.Message );\n                Continue := false;\n        end;\n    on E: Exception do\n        begin\n                AnotarMensaje(odDepurar, 'Error en lectura ' + E.Message );\n                Continue := false;\n        end;\n    end;\n    // treat the command\n    ExecuteRemoteCommand( Command );    \n    if( self.Terminated ) then\n …
Run Code Online (Sandbox Code Playgroud)

delphi asynchronous indy

4
推荐指数
1
解决办法
3674
查看次数

在Delphi中有效地填充组合框

需要在TComboBox中添加许多项目(超过10k)(我知道TComboBox不应该包含很多项目,但不能由我来改变它)而不添加重复项.所以我需要在添加之前搜索完整列表.我想避免使用TComboBox.items.indexof,因为我需要二进制搜索,但二进制查找在TStrings中不可用.

所以我创建了一个临时的Tstringlist,设置排序为true并使用find.但现在将临时Tstringlist分配回TComboBox.Items

(myCB.Items.AddStrings(myList)) 
Run Code Online (Sandbox Code Playgroud)

复制整个列表真的很慢.有没有办法移动列表而不是复制它?或者以其他方式高效填充我的TComboBox?

delphi combobox delphi-xe3

4
推荐指数
2
解决办法
1509
查看次数

方括号在x86汇编中的含义是什么?

我对装配很新,并且有一些非常基本的问题.

这四个命令有什么区别?

mov ebx, eax
mov [ebx], eax
mov ebx, [eax]
mov [ebx], [eax]
Run Code Online (Sandbox Code Playgroud)

他们说括号的意思是"得到地址的价值".但那么,第一线真正做到了什么呢?它不会将eax的价值转移到ebx吗?如果是这样,那么括号的重点是什么?

memory x86 assembly intel-syntax

4
推荐指数
2
解决办法
3232
查看次数

为什么编译器找不到我的函数的重载版本?

没有Get被重载(仅使用第一个定义Get),否则编译好了:

program Project1;
{$APPTYPE CONSOLE}

uses SysUtils, Classes;

type
  TxALNameValuePair = record
    Name: ansistring;
    Value: ansistring;
    constructor Create(const AName, AValue: ansistring);
  end;
  TxALNameValueArray = TArray<TxALNameValuePair>;

  TxALHTTPClient = class(TObject)
    private
    protected
    public
      Function  Get(const aUrl:AnsiString;
                    const ARequestHeaderValues: TxALNameValueArray = nil): AnsiString; overload;  
      Function  Get(const aUrl:AnsiString;
                    const aRequestFields: TStrings;
                    const aEncodeRequestFields: Boolean=True;
                    const ARequestHeaderValues: TArray<TxALNameValuePair> = nil): AnsiString; overload;      
  end;

constructor TxALNameValuePair.Create(const AName, AValue: ansiString);
begin
  Name := AName;
  Value := AValue;
end;       

function TxALHTTPClient.Get(const aUrl: AnsiString;
  const …
Run Code Online (Sandbox Code Playgroud)

delphi delphi-10.2-tokyo

4
推荐指数
1
解决办法
252
查看次数

WaitForMultipleObjects工作,MsgWaitForMultipleObjects失败 - 为什么?

以下代码最低限度地演示了该问题.在后台线程中,我创建一个有效的句柄数组并将其传递给,WaitForMultipleObjects并成功等待对象.

MsgWaitForMultipleObjects但是,当传递完全相同的数组时,函数调用failed(WAIT_FAILED)with ERROR_INVALID_HANDLE.

我究竟做错了什么?

program Project1;
{$APPTYPE CONSOLE}
uses
  SysUtils, Windows, SyncObjs, Classes;

type
  TMyThread = class(TThread)
    protected
      procedure Execute; override;
  end;

procedure TMyThread.Execute;
var
  LEvent : TEvent;
  LWaitHandles : TWOHandleArray;
  LPWaitHandles : PWOHandleArray;
  LWaitResult : Cardinal;
begin
  LEvent := TEvent.Create;
  LWaitHandles[0] := LEvent.Handle;
  LPWaitHandles := @LWaitHandles;
  while not Terminated do begin
    {Works -> LWaitResult := WaitForMultipleObjects(1, LPWaitHandles, false, INFINITE);}
    {Fails ->} LWaitResult := MsgWaitForMultipleObjects(1, LPWaitHandles, false, INFINITE, QS_ALLINPUT);
    case LWaitResult of
      WAIT_OBJECT_0:      WriteLn('Event …
Run Code Online (Sandbox Code Playgroud)

delphi winapi multithreading delphi-10-seattle

3
推荐指数
1
解决办法
518
查看次数