小编who*_*ddy的帖子

处理具有不明确参数的重载函数

拿这个小示例类(不是我的真实代码,但它暴露了问题):

Convert = class(TObject)
  public
    class function ToString(value: Double): String; overload;
    class function ToString(value: TDateTime): String; overload;
  end;
Run Code Online (Sandbox Code Playgroud)

它会编译好,直到您尝试使用DoubleTDateTime函数As In:

var
  d: Double;
begin
  d := 99.99;
  ShowMessage(Convert.ToString(d));
Run Code Online (Sandbox Code Playgroud)

您将收到此编译错误:对'ToString'的不明确的重载调用.问题归结为这TDateTime是一种类型的事实Double

我的问题:你如何处理这类问题?

编辑 - 我不是在寻找给出的例子的解决方案

到目前为止我找到了3个解决方案:

  • 重命名2个功能之一
  • 将"Dummy"参数添加到2个函数之一
  • 将参数更改为Var类型,这样做的缺点是我不能再使用常量调用此函数

那里有其他解决方案吗?

delphi delphi-xe

11
推荐指数
2
解决办法
2556
查看次数

POST响应的TIdHTTP字符编码

采取以下情况:

procedure Test;

var
 Response : String;

begin
 Response := IdHttp.Post(MyUrL, AStream);
 DoSomethingWith(Response);
end;
Run Code Online (Sandbox Code Playgroud)

现在,web服务器以UTF-8返回数据.假设它返回一些包含字符é的 UTF-8 XML .如果我使用变量Response它不包含这个字符,但它是UTF-8变种(#C3#A9),所以Indy没有解码?

现在我知道如何解决这个问题:

procedure Test;

var
 Response : String;

begin
 Response := UTF8ToString(IdHttp.Post(MyUrL, AStream));
 DoSomethingWith(Response);
end;
Run Code Online (Sandbox Code Playgroud)

这个解决方案的一个警告:Delphi引发警告W1058(隐式字符串转换,潜在的数据丢失从'string'到'RawByteString')

我的问题:这是处理这个问题的正确方法,还是我可以指示TIdHTTP为我转换为UnicodeString?

delphi unicode utf-8 idhttp delphi-xe

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

添加语言时Delphi内存泄漏

Delphi XE,Windows 7 64位

当您向空应用程序添加语言支持时,您将收到内存泄漏(FastMM4).

如何重现:

  • 创建新的VCL表单应用程序
  • 修改.dpr并添加 ReportMemoryLeaksOnShutdown := True;
  • 构建/运行应用程序并关闭应用程序 - >未报告泄漏
  • 现在添加一种语言(项目 - >语言 - >添加)
  • 再次构建/运行并关闭应用程序 - >内存泄漏?

FastMM4完整调试模式报告:

--------------------------------2013/7/16 14:54:34--------------------------------
A memory block has been leaked. The size is: 12

This block was allocated by thread 0x17EC, and the stack trace (return addresses) at the time was:
40455E 
40952D 
4094C8 
409834 
409941 
450058 
74548D76 [Unknown function at FirstHookFunc]
7778FA1A [ZwOpenKey]
75924033 [OpenRegKey]
759240AE [OpenRegKey]
777FA71A [Unknown function at RtlUlonglongByteSwap]

The block is currently used for …
Run Code Online (Sandbox Code Playgroud)

delphi memory-leaks delphi-xe

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

在ADO(ODBC)中使用datetime参数会丢失时间部分

昨天,当我忙于使用SQLLite编写一些单元测试时,我偶然发现了这个问题.我的环境是Windows7/Delphi XE.

将TADOQuery与TDateTime参数结合使用会导致时间部分丢失.

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);

var DbConn : TADOConnection;
    Qry    : TADOQuery;
    DT     : TDateTime;

begin
 DBConn := TADOConnection.Create(nil);
 DBConn.ConnectionString := 'Provider=MSDASQL.1;Extended Properties="DRIVER=SQLite3 ODBC Driver;Database=:memory:;LongNames=0;Timeout=1000;NoTXN=0;SyncPragma=NORMAL;StepAPI=0;"';
//   DBConn.ConnectionString := 'Provider=MSDASQL.1;Persist Security Info=True;User ID=%0:s;Password=%1:s;Extended Properties="DRIVER={MySQL ODBC 5.1 Driver};SERVER=localhost;PORT=3306;DATABASE=test;USER=root;PASSWORD=rrr;OPTION=1048579"';
 Qry := TADOQuery.Create(nil); …
Run Code Online (Sandbox Code Playgroud)

delphi ado delphi-xe

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

如何从此查询中删除sql注入并使其运行良好?

我是一个新的ASP.NET开发人员,我正在开发一个基于Web的应用程序,其中有一个菜单栏,有很多选项.其中一些选项仅显示给管理员.系统背后有一个逻辑来检查用户是否是管理员.如果是,将显示选项.我写了这个方法,但我有一个sql injectiom,我想删除它.

为了您的信息,我有以下数据库设计:

  • 用户表:NetID, Name, Title
  • 管理员表:ID, NetID

这是C#方法:

private bool isAdmin(string username)
{
        string connString = "Data Source=appSever\\sqlexpress;Initial Catalog=TestDB;Integrated Security=True";
        string cmdText = "SELECT ID, NetID FROM dbo.Admins WHERE NetID = '" + NetID + "')";
        using (SqlConnection conn = new SqlConnection(connString))
        {
            conn.Open();
            // Open DB connection.
            using (SqlCommand cmd = new SqlCommand(cmdText, conn))
            {
                SqlDataReader reader = cmd.ExecuteReader();
                if (reader != null)
                    if (reader.Read())
                        if (reader["ID"].Equals(1))
                            return true;
                return false;
            }
        }
    } …
Run Code Online (Sandbox Code Playgroud)

c# sql asp.net sql-injection

5
推荐指数
2
解决办法
598
查看次数

了解 ASN.1 整数 PER 编码

考虑 h225 Ras 注册请求 (RRQ) 的 Wireshark 跟踪:

在此输入图像描述

正如你所看到的,Wireshark解码requestSeqNum为25601,但字节表示是0x6400,即25600。我查看了ASN.1 PER编码规则,但我找不到该值必须增加1的原因。我的问题,wireshark 是否正确解码这个,如果是,我在规范中哪里可以找到它?

ASN.1 代码:

RequestSeqNum       ::= INTEGER (1..65535)
Run Code Online (Sandbox Code Playgroud)

事实上,Wireshark 始终requestSeqNum对所有 h225 消息加 1。

decode asn.1 wireshark

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

TWebBrowser如何在IE8上将插入位置设置为INPUT(文本)字段的结尾

我有一个通过TWebBrowser加载网页的应用程序,在这个页面上我有一些HTML输入.我想要的是更改输入的值并将插入位置设置为结尾.

这就是我现在所拥有的:

procedure SetInputValue(Document : IHTMLDocument2; const ElementId, NewValue : String);

var Doc   : IHTMLDocument3;
    El    : IHTMLElement;

begin
 Doc := Document as IHTMLDocument3;
 if Assigned(Doc) then
  begin
   El := Doc.getElementById(ElementId);
   if Assigned(El) then
    begin
     if El.tagName = 'INPUT' then
      (El as IHTMLInputElement).Value := NewValue;
      (El as IHTMLInputElement).select;
    end;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

这段代码设置输入值并突出显示文本部分.我知道IHTMLInputTextElement2接口,但它只能从IE9获得

delphi input twebbrowser

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

如何用TIdTelnet来抑制回声?

使用Indy10 - DelphiXE.如何告诉我连接的telnet服务器TIdTelnet不回显我发送给telnet服务器的命令?

这是我目前的尝试(不起作用),我尝试在每次telnet写入时发送序列IAC DO SUPPRESS_LOCAL_ECHO,但我相信这必须在协商阶段完成?

uses
  TIdTelnet,

...
procedure TIOTelnetConnection.SendSupressEcho;

var
  Resp: TIdBytes;

begin
 SetLength(Resp, 3);
 Resp[0] := TNC_IAC;
 Resp[1] := TNC_DO;
 Resp[2] := TNO_SUPLOCALECHO;
 FIOConnection.IOHandler.Write(Resp);
end;

procedure TIOTelnetConnection.Write(Str: AnsiString);
begin
 SendSupressEcho;
 if Str <> '' then
  FIOConnection.IOHandler.Write(Str);
end;
Run Code Online (Sandbox Code Playgroud)

TIdTelnet源我看到Negotiate程序,但它受到保护,我怎样才能覆盖它的行为?

delphi telnet indy10

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

什么时候可以((指针)(P)+1)^工作?

我正在研究delphiXE2,我正在研究PInteger.如果我在我的delphi代码中这样做

var
  P: PInteger;
  testInt: Integer;
  Scores: array[0..4] of Integer=(33,44,56,78,78);
begin
  P := @Scores;
  testInt := (P+1)^;
  WriteLn(testInt);
  ReadLn;
end;
Run Code Online (Sandbox Code Playgroud)

我收到了这个错误.

[DCC Error] Project1.dpr(23): E2015 Operator not applicable to this operand type
Run Code Online (Sandbox Code Playgroud)

PS:testInt := (P+1)^;是第23行

但是,当我尝试这个

var
  PCh: PChar;
  testchar: char;
  str: array[0..4] of char=('a','b','c','d','e');
begin
  PCh := @str;
  testchar := (PCh+1)^;
  WriteLn(testchar);
  ReadLn;
end;
Run Code Online (Sandbox Code Playgroud)

它运作良好!控制台可以打印'b'!

我不清楚这是怎么发生的,什么时候((指针)(P)+1)^可以工作?

delphi pointers pchar delphi-xe2

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

Delphi&Indy&utf8

我有一个问题,访问到网站whit utf8 charset,例如当我尝试在这个www的accesso

点击例如

所有utf8字符都没有正确编码.这是我的访问例程:

var
  Web     : TIdHTTP;
  Sito    : String;
  hIOHand : TIdSSLIOHandlerSocketOpenSSL;

begin
  Url := TIdURI.URLEncode(Url);


  try
    Web := TIdHTTP.Create(nil);
    hIOHand := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
    hIOHand.DefStringEncoding := IndyTextEncoding_UTF8;
    hIOHand.SSLOptions.SSLVersions := [sslvTLSv1,sslvTLSv1_1,sslvTLSv1_2,sslvSSLv2,sslvSSLv3,sslvSSLv23];
    Web.IOHandler := hIOHand;
    Web.Request.CharSet := 'utf-8';


    Web.Request.UserAgent := INET_USERAGENT;       //Custom user agent string
    Web.RedirectMaximum := INET_REDIRECT_MAX;      //Maximum redirects
    Web.HandleRedirects := INET_REDIRECT_MAX <> 0; //Handle redirects
    Web.ReadTimeOut := INET_TIMEOUT_SECS * 1000;   //Read timeout msec
    try
      Sito := Web.Get(Url);
      Web.Disconnect;
    except
      on e : exception do
        Sito := 'ERR: ' …
Run Code Online (Sandbox Code Playgroud)

delphi indy delphi-xe6

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