小编Rol*_*son的帖子

想要将文件读取到TStringList

是的我想在TStringList中读取一个简单的日志文件,使用LoadFromFile可以轻松完成.但问题是该文件可能已被其他程序同时打开,因此可能会出现异常.我试过用:

FileMode := fmShareCompat;
Run Code Online (Sandbox Code Playgroud)

但它不会起作用.

我也试过用:

fFilePath := fPathList[PathIndex] + '\' + FileData.Name;
AssignFile(vFile, fFilePath);
Reset(vFile, 1);  // Recordsize = 1

SetLength(vFileString, FileData.Size);
BlockRead(vFile, vFileString, FileData.Size);   
vCurrentFile.Text := vFileString;
Run Code Online (Sandbox Code Playgroud)

它引发了一个带有消息I/O错误998的EInOutError.

有什么建议吗?

delphi file-io tstringlist

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

带有分隔符的Stringlist作为字符串?

我在一个存储为字符串的对象中有一个名为HistoryText的属性.我想显示网格中的所有行.我应该能够删除和编辑网格中的行.格式为:

16.5.2003-$-12:09-$-anna-$-Organization created
2.6.2005-$-13:03-$-jimmy-$-Organization edited
19.12.2005-$-13:33-$-madeleine-$-Organization edited
Run Code Online (Sandbox Code Playgroud)

因此每行有4个字段,日期,时间,用户和消息,分隔符字符串为' - $ - '.由于分隔符是字符串而不是char,因此无法将其分配给stringlists定界符属性.

我有一个例程将字符串提取到Stringlist:

procedure ParseDelimited(const aStringList: TStringList; const aOrgList, aDelimiter: string);
var
   vDelimiterPos : integer;
   vPartialStr : string;
   vRemaingTxt : string;
   vDelimiterLength : integer;
begin
   vDelimiterLength := Length(aDelimiter);

   if (AnsiRightStr(aOrgList, Length(aDelimiter)) = aDelimiter) then
     vRemaingTxt := aOrgList
   else
     vRemaingTxt := aOrgList + aDelimiter;

   aStringList.BeginUpdate;
   aStringList.Clear;
   try
     while Length(vRemaingTxt) > 0 do
     begin
       vDelimiterPos := Pos(aDelimiter, vRemaingTxt);
       vPartialStr := Copy(vRemaingTxt,0,vDelimiterPos-1);
       aStringList.Add(vPartialStr);
       vRemaingTxt := Copy(vRemaingTxt,vDelimiterPos+vDelimiterLength,MaxInt);
     end;
   finally
     aStringList.EndUpdate;
   end;
end;
Run Code Online (Sandbox Code Playgroud)

它似乎工作正常.我的问题是将StringList中的更改同步回原始的String属性?这个分隔符有很多历史数据,所以我认为将它改为TChar是一个现实的选择.

更新: …

delphi tstringlist delphi-2007

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

在几秒钟内显示飞溅图像是空白的

在我的应用程序中,我在连接数据库和其他初始化期间有一个启动图像.它可以很好地显示启动图像,但它是一段时间的空白.所以,

  1. 加载启动图像并显示几分之一秒.
  2. 飞溅图像空白2-3秒.
  3. 飞溅图像会再次显示几秒钟.
  4. 飞溅已关闭.

是否有一个聪明的事情是尽可能快地显示图像并删除空白图像?

DPR文件中的代码:

Application.Initialize;

SplashForm := TSplashForm.Create(Application);
SplashForm.Show;
// Tried Splash.Update here but no difference.

SplashForm.SetPos(15);
// Init code
SplashForm.SetPos(30);

// More Init code
SplashForm.SetPos(100);

SplashForm.Close;

Application.Run;
Run Code Online (Sandbox Code Playgroud)

和飞溅单位:

procedure TSplashForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;

procedure TSplashForm.FormCreate(Sender: TObject);
begin
  pbLoading.Properties.Text := 'Loading ' + TClientConfig.Instance.AppTitle + '...';
end;

procedure TSplashForm.SetPos(aPos: Integer);
begin
  pbLoading.Position := aPos;
  UpDate;
end;
Run Code Online (Sandbox Code Playgroud)

关心罗兰

delphi performance splash-screen

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

缺少TChromium中的默认接口

我们正在尝试将内置浏览器组件从TWebBrowser更改为TChromium.它主要用于显示Google和Bing的地图.从javascript到Delphi的通信是用COM完成的.

尝试将浏览器更改为TChromium时,无法编译此代码.

if supports(fBrowser.defaultInterface, IOleObject, fOLE) then
Run Code Online (Sandbox Code Playgroud)

因为TChromium缺少defaultInterface.

编辑: 是否有可能仍然使用Chromium从javascript与Delphi进行通信?我知道它们不兼容,我必须重写代码.我只是想知道如何从javascript到delphi获得结果.注意我使用的是Delphi 2007,因此无法使用扩展的RTTI.

关心Roland Bengtsson

delphi com delphi-2007 twebbrowser

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

从StringList中的值获取id

我有一个2行的StringList

aOldPriceTerms[0] = 'FuelAddition=336643160'
aOldPriceTerms[1] = 'Freight=336643155'
Run Code Online (Sandbox Code Playgroud)

所以它可以正常使用

aOldPriceTerms.Values ['Freight'] - >'336643155'

我想从列表中获得ID列表.

这么简单

'FuelAddition','Freight'
Run Code Online (Sandbox Code Playgroud)

目前我使用此代码,其中aOldPriceTerms是实际的StringList.

function GetList(aOldPriceTerms: TStringList): String;
var
  vOldTerm : string;
  vOldTermsList : TStringList;
begin
  vOldTermsList := TStringList.Create;
  try
    for i := aOldPriceTerms.Count - 1 downto 0 do
    begin
      vOldTerm := Copy(aOldPriceTerms[i], 1, (Pos('=', aOldPriceTerms[i])-1));
      vOldTermsList.Add(vOldTerm);
    end;

    Result := vOldTermsList.CommaText;
  finally
    FreeAndNil(vOldTermsList);
  end;
end;
Run Code Online (Sandbox Code Playgroud)

我的问题是有一个更清洁的方式来获取ID?

delphi

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

如何避免使用TWebBrowser刷新

我有一个显示谷歌地图页面的TWebBrowser组件.问题是,当用户按F5页面刷新和页面重新加载.这会导致javascript变量重新初始化并与Delphi不同步,并出现脚本错误对话框, 'undefined'为null或不是对象.

我想停止用户刷新.

我为OnBeforeNavigate2尝试了这个事件:

procedure TNewOrganizationForm.mapAddressBeforeNavigate2(ASender: TObject;
  const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
  Headers: OleVariant; var Cancel: WordBool);
begin
  inherited;
  Cancel := Assigned(fMapEngine) and not fMapEngine.Loading;
end;
Run Code Online (Sandbox Code Playgroud)

但是当我设置一个断点时,它甚至都没有被调用.还有另外一种方法吗?

delphi refresh delphi-2007 twebbrowser

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

如何使用TEdits selStart和SelLength选择Text?

我尝试使一个新项目添加一个TEdit和一个TButton.将Edit1.Text设置为'This is a test message'.并在按钮上添加一个事件:

procedure TForm7.Button1Click(Sender: TObject);
begin
  Edit1.SelStart := 5;
  Edit1.SelLength := 5;
end;
Run Code Online (Sandbox Code Playgroud)

单击按钮时未选择任何内容.有人可以解释为什么以及如何选择文本的某些部分?

关心罗兰

delphi delphi-2007

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

TIBQuery.Unidirectional = True.我该如何重写代码?

我在遗留代码中有许多使用带有单向属性= False的TIBQuery(Interbase)的方法.问题是用户有时会出现内存异常.我怀疑它可以通过将此属性设置为True来修复,因为不需要缓存记录.

当然我不想打破旧代码,但我也想解决这个问题.

这是一个代码示例(由于大小不完整):

procedure TAnalyzeForm.CostByInvoice;
begin
  try
    qryReport.Close;
    qryReport.Open;
    qryReport.Last;
    qryReport.First;
    if qryReport.RecordCount > 0 then
    begin
      for i := 0 to qryReport.RecordCount - 1 do
      begin
        vInvoiceNo := Format('%-8s', [qryReport.FieldValues['InvoiceNo']]);
        vDeptId := Format('%8s', [qryReport.FieldValues['DepartmentId']]);
        vOrgName := Format('%-22s', [qryReport.FieldValues['OrgName']]);
        vInvDate := qryReport.FieldValues['InvoiceDate'];
        vInvNetCur := qryReport.FieldValues['InvNetCur'];
        vInvVatCur := qryReport.FieldValues['InvVatCur'];
        vInvTotCur := qryReport.FieldValues['InvTotCur'];
        vInvCur := qryReport.FieldValues['UnitId'];
        vTotNet := vTotNet + qryReport.FieldValues['InvNetValue'];
        vTotVat := vTotVat + qryReport.FieldValues['InvVatValue'];
        vTotTot := vTotTot + (qryReport.FieldValues['InvNetValue'] + qryReport.FieldValues['InvVatValue']);
        grdCost.Cells[1, i+1] := vInvoiceNo;
        grdCost.Cells[2, i+1] := vDeptId …
Run Code Online (Sandbox Code Playgroud)

delphi activerecord

0
推荐指数
1
解决办法
1349
查看次数

如何使用Include with Unicode?

我尝试将一些代码从D2007移植到DXE2.这个简化的代码在D2007中编译得很好.在DXE2中显示此错误:

[DCC Warning] Unit1.pas(10): W1050 WideChar reduced to byte char in set expressions.  Consider using 'CharInSet' function in 'SysUtils' unit.
[DCC Error] Unit1.pas(37): E2010 Incompatible types: 'AnsiChar' and 'Char'
Run Code Online (Sandbox Code Playgroud)

可能是一个unicode问题.有人能告诉我为什么会发生这种情况以及我该如何纠正它?

问候

代码:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TSetOfChar = Set of Char;  // Line 10

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    FCharacterSet: TSetOfChar;
  public
    property CharacterSet: TSetOfChar read FCharacterSet write FCharacterSet;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: …
Run Code Online (Sandbox Code Playgroud)

delphi delphi-2007 delphi-xe2

0
推荐指数
1
解决办法
1032
查看次数

如何搜索性能更佳的每个字符?

我有一个搜索字段,用户搜索每个输入的字符.所以没有搜索按钮.问题是搜索速度很慢.我的想法是在每个键输入一点后延迟搜索,所以如果用户快速输入搜索字符串,则允许不搜索.然后执行搜索.我的代码到目前为止.

procedure TAgreementModuleForm.SetIsSearching(const Value: Boolean);
begin
  fIsSearching := Value;
  tmrDelayKey.Enabled := Value;
end;

procedure TAgreementModuleForm.tmrDelayKeyTimer(Sender: TObject);
begin
  IsSearching := True;
end;

procedure TAgreementModuleForm.txtSearchAgreementCustomerExit(Sender: TObject);
begin
  IsSearching := False;
end;

procedure TAgreementModuleForm.txtSearchAgreementCustomerKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
var
  vSearchExpression: string;
begin
  if IsSearching then
  begin
    vSearchExpression := Trim(txtSearchAgreementCustomer.Text);
    IsSearching := False;
    if vSearchExpression <> '' then
      DoSearch(vSearchExpression);
  end
  else
    tmrDelayKey.Enabled := True;
end;
Run Code Online (Sandbox Code Playgroud)

tmrDelayKey是一个延迟为1000毫秒的TTimer.IsSearching是一个布尔属性.

这不是工作代码,因为用户停止编写搜索.如何改进?

delphi

-1
推荐指数
1
解决办法
169
查看次数

如何实现TDateTime作为SQL Server的参数

我承认我没有直接在Delphi中使用SQL的经验.但我现在尝试了一个小项目.它执行这个SQL

SELECT [Type], [Sum] = Count(*) 
FROM   exceptionrow 
WHERE LogDate >= :FromDate
AND LOGDATE <= :ToDate
GROUP  BY [type] 
ORDER  BY [sum] DESC
Run Code Online (Sandbox Code Playgroud)

其中FromDate和ToDate是TDateTime的参数.这是要执行的事件.

procedure TLogsStats.CollectTopExceptions(aFromDate, aToDate: TDateTime);
begin
  qryTopExceptions.ParamByName('FromDate').AsDate := aFromDate;
  qryTopExceptions.ParamByName('ToDate').AsDate   := aToDate;

  cdsTopExceptions.Close;
  cdsTopExceptions.Open;
end;
Run Code Online (Sandbox Code Playgroud)

我在DBGrid中获得结果,但与在具有静态日期的SQL Studio中直接运行时不一样.行太少了.我复制了这个项目的设置.我认为只需运行一个SQL查询就需要5个组件,这很奇怪.见图.

SQL查询

可以简化吗?这是我对组件的声明.

SQLConnection: TSQLConnection;
qryTopExceptions: TSQLDataSet;
dspTopExceptions: TDataSetProvider;
cdsTopExceptions: TClientDataSet;
dsTopExceptions: TDataSource;
Run Code Online (Sandbox Code Playgroud)

编辑: 最后我发现它不起作用的原因.我怀疑有错误的司机等但这是一个简单的愚蠢错误.我连接到一个小型测试数据库而不是更大的数据库.现在它可以正常使用3个组件和参数.抱歉你的时间:)

SQLConnection: TSQLConnection;
qryTopExceptions: TSQLDataSet;
dsTopExceptions: TDataSource;
Run Code Online (Sandbox Code Playgroud)

问候

sql sql-server delphi delphi-2007

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