小编Mar*_*ynA的帖子

XE6 ClientDataSet AV尝试从Firebird加载数据

我有一个带有FireDac FDConnection和FDSqlQuery,DataSetProvider和ClientDataSet的简约项目,试图访问我今天从SourceForge下载的Firebird 2.5软件包随附的示例Employee.FDB。

除了FDConnection的弹出信息选项卡中的数据库名称和FDQuery的Sql(已设置为)外,所有内容均已设置为默认值,因为它们离开了调色板select * from employee

FDQuery可以正常打开,但是一旦我尝试在IDE中运行CDS或运行我的应用程序,就会遇到访问冲突。

这是我的全部代码:

  FDQuery1.Open;
  Caption := IntToStr(FDQuery1.RecordCount);  // this shows 42 on the form's caption
  CDS1.Open;  // AV here
Run Code Online (Sandbox Code Playgroud)

因此,FDQuery可以打开,但CDS不能。

在运行时,异常发生在这里:

  function TCustomClientDataSet.CreateDSBase: IDSBase;
  begin
    CreateDbClientObject(CLSID_DSBase, IDSBase, Result);
    Check(Result.SetProp(dspropANSICODEPAGE, DefaultSystemCodePage)); <-- Exception here
    Check(Result.SetProp(dspropUTF8METADATA, NativeUInt(True)));
    Check(Result.SetProp(dspropUTF8ERRORMSG, NativeUInt(True)));
  end;
Run Code Online (Sandbox Code Playgroud)

例外味精是

项目FBTest1引发了异常类$ C0000005,消息为“在0x0075d05b发生访问冲突:读取地址0x00000000”。

在IDE中,如果尝试在CDS上设置Active = True,则会收到类似的异常,该消息表示发生在DSnap200.Bpl中。

它是在运行时第一次发生,我有某种“事件报告”弹出窗口可以将其报告给Embarcadero。第一次见到。

如果我用SqlConnection和SqlQuery代替FDac组件,则会收到相同的错误。

因此,我想我的问题是,是否可以通过使用像该项目一样简单的项目的默认属性设置来激发CDS的行为,即我错过了一步,还是EMBA QC?

delphi tclientdataset firebird2.5

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

将脚本元素添加到现有的TWebBrowser文档中

本周末由几个SO q提示,我决定看看我是否可以解决如何将Html元素中的一些javascript添加到TWebBrowser中加载的文档中.这样做,我遇到了一个奇怪的问题,也许有人可以解释.

这是我的Html文档

<html>
  <body>
  Something
  <br>
  <div id="forscript">some more text</div>
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)

和我要添加的javascript元素

<script type="text/javascript" defer="false">{alert('hello');}</script>
Run Code Online (Sandbox Code Playgroud)

我作为Script参数传递给下面的AddScript().

这是我的代码(doc2是从WebBrowser获得的IHtmlDocument2):

procedure TForm1.AddScript(const Script : String);
var
  Element : IHtmlElement;
  Doc3 : IHtmlDocument3;
begin
  Doc2.QueryInterface(IHtmlDocument3, Doc3);
  Element := Doc3.GetElementByID('forscript');
  Element.innerHTML := Element.innerHTML + Script;
end;
Run Code Online (Sandbox Code Playgroud)

这很好,但......

分配RHS上的Element.innerHTML的原因很简单,我发现如果RHS 包含脚本js,则js不会执行.我的问题是,为什么不,并且有一个更简单的替代方案,就像在某种程度上在代码中创建一个IHtmlScriptElement并将其插入DOM?显然,我简单易懂的解决方法只是在元素已经包含的文本前面添加,但我有点难以相信实际知道他们正在做什么的人会发现必要的.

FWIW#1:我尝试使用Element.insertAdjacentHtml来添加脚本但是得到了与我刚刚描述的相同的行为,就需要在脚本之外插入一些东西来获取脚本来执行时,所以我是想知道是否与在对其进行更改后如何处理DOM有关.

FWIW#2:我使用了Element.innerHtml路由,因为TWebBrowser/MSHTML.Pas拒绝了我在代码中创建IHtmlScriptElement的尝试; AFAICS,试图在MSHTML.Pas中使用任何CohtmlXXXElement例程引发"类未注册"例外,这似乎证实了我在这个教区的@kobik某处发现的评论.

(顺便说一句,在Win7 64位上使用D7 + IE11)

html javascript delphi twebbrowser

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

更改主记录时,为什么不发生TADOQuery AfterOpen事件?

考虑我们有两个标准的主从关系TADOQuery。在主数据集上进行导航时,AfterOpen明细数据集不会发生事件。

在其他数据访问包(例如BDE)中引发此事件。为什么dbGo的这种行为不同?

.dfm的一部分:

  object DataSource1: TDataSource
    DataSet = SDQuery1
    Left = 504
    Top = 72
  end
  object DataSource2: TDataSource
    DataSet = SDQuery2
    Left = 520
    Top = 360
  end
  object ADOConnection1: TADOConnection
    LoginPrompt = False
    Left = 336
    Top = 464
  end
  object ADOQuery1: TADOQuery
    Connection = ADOConnection1
    Parameters = <>
    Left = 504
    Top = 160
  end
  object ADOQuery2: TADOQuery
    Connection = ADOConnection1
    AfterOpen = ADOQuery2AfterOpen // <- rised when dataset was opened at first …
Run Code Online (Sandbox Code Playgroud)

delphi ado delphi-xe3

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

计算单词中的字符和子字符串

当输入"last"一词时,我必须阅读未知数量的单词并终止程序.我必须:

  • 显示以"S"开头的名称数.
  • 显示以"d"结尾的名称数量.
  • 显示以"anne"结尾的名称数.

问题:我遇到的唯一问题是显示以"anne"结尾的名称数量.它显示0,除非我只输入单词"anne",否则它显示1.

注意:

  • 我们还没有开始使用数组.
  • 这是我在编写测试之前正在练习的工作,这不是应该交给我的作业.

我的代码:

unit Ess_U;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    redOut: TRichEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
Var wrd : string;
    Scount, dcount, Namecount : integer;
begin
redOut.clear;
   Scount := 0;
   dcount := 0;
   Namecount := 0;


   repeat
    wrd := inputbox ('Input …
Run Code Online (Sandbox Code Playgroud)

delphi

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

Sql表达式中的不明确的列名称

我有两张桌子; 它们通过Delphi ado链接通过列名称上的关系详细信息加入

第一个表有一堆数据,一个fileref作为键1,第二个表有数据行,fileref有键2

第一个表有其他信息,但有一个fileref值,第二个表包含许多fileref值但不同的帐户

表1:id,fileref,1,2,3,4,5,accno,7,8,9等等......

表2:id,fileref,accno

  SELECT * FROM vtindex a
  JOIN vi_accno b
  ON b.fileref = a.FileRef
  WHERE (a.AccNo like '%123456789%') or (b.accno like '%123456789%')
Run Code Online (Sandbox Code Playgroud)

上面是我得到模糊错误的查询

我的想法是,如果我没有找到accno是表1,它必须尝试在表2中找到它

希望这是有道理的,如果我在MSSMS中运行查询,查询返回结果没有错误

sql sql-server delphi ado

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

How to correctly use IFileOperation in Delphi to delete the files in a folder

I'm trying to create a simple example of using IFileOperation to delete the files in a given directory, to include in the answer to another q for comparison with other methods.

Below is the code of my MRE. It successfully creates 1000 files in a subdirectory off C:\Temp and then attempts to delete them in the DeleteFiles method. This supposedly "easy" task fails but I'm not sure exactly where it comes off the rails. The comments in the code …

delphi winapi

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

使用Delphi自动化VideoLan的VLC

我已经从VideoLan的VLC播放器的v.2.2.1生成了一个类型库导入单元,并将生成的插件组件嵌入到一个简单的Delphi(D7和XE8)表单中.代码提取如下.

组件的基本功能很好 - 我可以播放(本地).MP4文件,停止它,上下加速等等,没有任何问题.但是,有一个基本功能不起作用,即音量控制.

插件显示v.简单(与作为应用程序运行的VLC中的插件相比)底部有两个轨道条,一个用于显示+更改视频中的播放位置,另一个用于控制音量.后者最初显示体积为100(%).

如果我尝试通过单击轨迹栏来更改它,我会收到"太多未处理的异常"错误(EInvalidOp).如果我安装Application.OnException处理程序并捕获异常,插件将无响应,我必须在IDE中重置应用程序.如果我在代码中读取音量设置然后将其设置为我刚读过的值,则会发生同样的情况.

在插件调用的内部事件中,Get8087CW返回相同的值4798,就像应用程序启动时保存的那样.

我的问题是:如何在尝试通过GUI轨道栏或代码更改音量时避免这些异常?我可能错过了一个步骤,或者在设置8087值或异常处理方面我能做些什么以防止应用程序锁定?(顺便说一下,可以在代码中打开插件工具栏的显示,所以如果其他所有方法都失败了,我可以用我自己的替换它,但我宁愿让VLC工作正常,如果可能的话).

码:

TForm1 = class(TForm)
  VLCPlugin1: TVLCPlugin;
  [...]
public
  { Public declarations }
  IPlugIn : IVlcControl;
  IPlugIn2 : IVlcControl2;
  Input : IVlcInput;
  PlayList : IVlcPlayList;
  IAudio : IVlcAudio;
  Speed : Integer;
  Volume : Integer;
  Saved8087CW : Integer;
  procedure PlayFile;
  property FileName : WideString read FFileName write SetFileName;
end;

// This routine, NoOp, is one I've used since D1 to facilitate single-stepping
// through code and checking values on the way.  It accesses the …
Run Code Online (Sandbox Code Playgroud)

delphi exception-handling vlc

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

从类助手访问私有字段

特定

type
  TMyClass = class
  private
    FPrivateInt : Integer;
  protected
    FProtectedInt : Integer;
  public
    FPublicInt : Integer;
  end;
Run Code Online (Sandbox Code Playgroud)

在一个单位和

type
  TMyHelper = class helper for TMyClass
    function Sum : Integer;
  end;
[...]
function TMyHelper.Sum: Integer;
begin
  Result := 0;
  Result := Result + FPublicInt;
  Result := Result + FProtectedInt;
  Result := Result + FPrivateInt;  // <- compiler error here
end;
Run Code Online (Sandbox Code Playgroud)

在另一个,XE8编译器报告错误"E2003未声明的标识符'FPrivateInt'.这是我直观地预期的,因为在声明类的单元外部的私有成员的可见性受限,如果我没有看到示例Marco Cantu的Delphi 2007手册p89/90,访问"帮助"类的私人领域,并在接受的答案的开头段落中明确声明

我可以用类助手调用静态私有类方法吗?

这似乎支持它:"众所周知,帮助者确实破解了私人可见性.因此,私人成员可以从班级助手那里看到......"

那么,为什么我会收到E2003 Undeclared Identifier错误?在我的理解或代码中,我显然在某处遗漏了某些东西.我使用XE4和XE6,btw和XE4在我引用的SO答案之前得到了相同的错误,这是从去年开始的.

delphi helper delphi-xe8

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

DFM文件中的属性顺序重要吗?

属性的非标准顺序会引起任何问题吗?

例如,IDE将TButton组件存储在DFM文件中,如下所示:

  object Button1: TButton
    Left = 288
    Top = 160
    Width = 75
    Height = 25
    Caption = 'Button1'
    TabOrder = 0
    OnClick = Button1Click
  end
Run Code Online (Sandbox Code Playgroud)

如果我手动更改属性的顺序,这会引起任何问题吗?

  object Button1: TButton     
    OnClick = Button1Click
    Left = 288
    Top = 160
    Width = 75
    Height = 25
    Caption = 'Button1'
    TabOrder = 0
  end
Run Code Online (Sandbox Code Playgroud)

delphi dfm

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

如何将指针值转换为字符串

如何将指针值转换为字符串?想象一下:

procedure TForm1.Button1Click(Sender: TObject);
var DummyPointer :Pointer;
begin
  DummyPointer := Addr(Sender);
  ShowMessage(IntToStr(DummyPointer)); //this is it, what I can not solve... it casts error
end;
Run Code Online (Sandbox Code Playgroud)

谢谢

delphi

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