小编Svi*_*vip的帖子

如何在Go中执行不区分大小写的正则表达式?

现在,当然,我可以编写我的正则表达式来处理这两种情况,例如regexp.Compile("[a-zA-Z]"),但我的正则表达式是由用户给出的字符串构造的:

reg, err := regexp.Compile(strings.Replace(s.Name, " ", "[ \\._-]", -1))
Run Code Online (Sandbox Code Playgroud)

s.Name名字在哪里 这可能是'北西北'.现在,对我来说最明显的解决方案是遍历每个字符s.Name并为每个字母写'[nN]':

for i := 0; i < len(s.Name); i++ {
  if s.Name[i] == " " {
    fmt.Fprintf(str, "%s[ \\._-]", str);
  } else {
    fmt.Fprintf(str, "%s[%s%s]", str, strings.ToLower(s.Name[i]), strings.ToUpper(s.Name[i]))
  }
}
Run Code Online (Sandbox Code Playgroud)

但我觉得这是一个相当不优雅的解决方案.速度并不是真正的问题,但我需要知道是否还有另一种方式.

regex go

70
推荐指数
4
解决办法
6万
查看次数

如何沿路径/线改变笔划宽度?

阅读完SVG2草案后,我有点失望地得知没有新的线路上限而不是标准3. 然而,新的弧线连接很精彩,但不是这个问题的内容(我只是想提一下).

我一直希望有一个以三角形结尾的帽子.但鉴于我的用例,这可能也不理想.

据我所知,Adobe Illustrator - 我自己不使用 - 允许笔画的宽度可变.从绘图板绘图时,这非常有用,可突出显示线条的压力.确实,这个功能存在于许多位图绘制程序中,但有没有办法在SVG中实现这种效果,而不必绘制多行?

我们的想法是每个节点都应该有一个宽度,然后这些线应该"平滑地"缩放具有不同宽度的每个节点之间的宽度.

这可能吗?如果没有,可以考虑吗?

PS我应该指出,这更像是一个思想实验和一个想法,而不是阻碍我的过程.比需要更多的好东西.

svg inkscape

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

如何使用TIdHttp获取DELETE的响应文本?

Indy的TIdHttp课程 - 在最近的版本中 - 是Delete()例程.但由于某种原因,这是一个程序,而不是一个功能. Put(),Get()等等都是返回响应主体内容的函数.无论是作为字符串还是将其传递给TStream.这是不可能的Delete(),这与DELETE定义相矛盾:

如果响应包括描述状态的实体,则成功响应应为200(OK),如果操作尚未执行,则应为202(已接受);如果操作已颁布但响应不包括,则应为204(无内容)一个实体.

来源.

然后我尝试使用GetResponse(),但这只是优雅地关闭了我的连接,而没有填写响应.

那么如何从DELETE响应中读取响应主体的内容呢?

delphi indy

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

为什么 Go 的 time.Parse() 不解析时区标识符?

考虑以下代码:

package main

import (
    "time"
    "fmt"
)

const (
    format = "2006 01 02 15:04 MST"

    date = "2018 08 01 12:00 EDT"
)

func main() {
    aloc, _ := time.LoadLocation("America/New_York")
    eloc, _ := time.LoadLocation("Europe/Berlin")
    tn, _ := time.Parse(format, date)
    tl, _ := time.ParseInLocation(format, date, aloc)

    fmt.Println(tn) // Says +0000 despite EDT being -0400
    fmt.Println(tn.In(eloc)) // Expect 18:00, but get 14:00
    fmt.Println(tl) // Correctly -0400
    fmt.Println(tl.In(eloc)) // Correctly 18:00
}
Run Code Online (Sandbox Code Playgroud)

您也可以在Go Playground上试用。

当我运行它时,我得到了这个结果(在我自己的系统上和通过 Playground):

2018-08-01 12:00:00 +0000 …
Run Code Online (Sandbox Code Playgroud)

go

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

为什么Variant在100 CE之前不能包含TDateTime?

请考虑以下代码:

procedure Test;
  function d1: Variant;
  var
    DDt: TDateTime;
  begin
    DDt := EncodeDate(100,1,1);
    Result := DDt;
  end;
  function d2: Variant;
  var
    DDt: TDateTime;
  begin
    DDt := EncodeDate(99,12,31);
    Result := DDt;
  end;
  procedure Writedate(V: Variant);
  begin
    Writeln(string(V));
  end;
var
  V: Variant;
begin
  V := d1;
  Writedate(V);
  V := d2;
  Writedate(V);
end;
Run Code Online (Sandbox Code Playgroud)

第一次调用Writedate将成功,输出将为'01 -01-0100'.但是,第二次调用将因"无效参数"失败而失败.检查代码,您可以看到Variant99-12-31日期有EVariantInvalidArgError错误.

但是,如果我打电话FormatDateTime('c', TDateTime(V))给他们TDateTime,他们都会成功.实际上,在Variant包含a的任何时候TDateTime,其日期都在100 CE之前,IDE将EVariantInvalidArgError在检查其值时显示.

似乎很奇怪,Variant无法处理100前的CE日期,何时TDateTime可以.这是Delphi中的一个错误吗?我觉得这是正确的,并与99 100 CE是一个有点可疑.

delphi

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

如何让FastReport生成可在iOS上查看的PDF?

我正在使用FastReports,并且在iOS上无法正确读取生成的PDF.因为iOS读取PDF/A,FastReports不支持.这显然是FastReports 4.0中的一个已知错误,它将在FastReports 5.0中修复.然而,5.0还有很长的路要走,并且至今已经开发了多年.

所以我的简单解决方案 - 我更喜欢一个简单的解决方案,所以我可以在FastReports 5.0出来后再次删除它 - 现在只需将现有PDF打印到另一个PDF.这可以在没有在系统上安装PDF打印机而只使用Delphi的情况下完成吗?

如果没有,是否有转换器接受PDF文件并输出PDF文件?

pdf delphi fastreport delphi-xe3

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

如何计算用户在TListView中滚动的距离,但在用户滚动时却没有?

我有TListView一些显示工具提示的专业领域.因为我不能通过设计来定义一个特定的区域TListView来显示超过工具提示Subitem.

所以我已经创建了一个结构,其中包含它们的位置以及工具提示(提示).这部分工作正常.但是,这些位置在TListView其顶部之间是相对的,因此一旦用户滚动,MousePos仍然指的是完全可见的TListView,无论TListView滚动到何处.

那讲得通; 但是我想在Y坐标中添加用户向下滚动的距离.(我也想为X坐标做同样的事情,但这不太相关.)但据我所知,A)没有机制TListView来检测这个和B)大多数指南都在谈论TListView和滚动是指捕获正在发生的滚动,而不是在我的情况下,在不同的事件期间(在这种情况下,在鼠标移动时).

那么我如何检测或计算用户在滚动事件中滚动的距离呢?

delphi

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

为什么Generics.Collections.TObjectList.List不安全?

TListTOjectListGenerics.Collections有一个.List属性,它是一个枚举.

例如:

oList := TObjectList<TItem>.Create;
// Add items to oList
for Item in oList.List do begin
  // Do something with Item
end;
Run Code Online (Sandbox Code Playgroud)

这很整洁,但结果却很严重. .List只读FList(在TList和上的私人声明TObjectList),这只是一个arrayofT.

由于动态数组在添加超出其大小的项目时大小加倍,这意味着它具有未使用项目的空间.

如果您添加了3 TItem秒,则实际FList为4个项目,第四个(和最后一个)项目为nil.

因此使用TObjectList's .List是不安全的,因为如果你TObjectList没有.Count2的幂值(例如1,2,4,8,16等),它可能会引发访问冲突.

以下代码可能会引发访问冲突:

for Item in oList.List do begin
  Writeln(Item.ClassName);
end;
Run Code Online (Sandbox Code Playgroud)

当然,安全的解决方案是一个简单的迭代,使用.Count:

for I := 0 to oList.Count - 1 do begin
  Item …
Run Code Online (Sandbox Code Playgroud)

delphi generics

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

为什么FloatToStr会忽略ThousandSeparator?

我试图将Double和/或Currency转换为字符串,以便在SQL调用中使用.这意味着我总是对ThousandSeparator什么都没有感兴趣并且DecimalSeparator是'.'.

当然,由于我的机器的语言环境配置为丹麦语,Windows将返回'.' for ThousandSeparator和','for DecimalSeparator.因此,我需要补偿语言环境错误的可能情况.

此外,我的代码需要在D2007(由于遗留原因)和XE3中工作.因此代码看起来像这样:

{$IF CompilerVersion>=19}
fms := TFormatSettings.Create(LOCALE_SYSTEM_DEFAULT);
{$ELSE}
GetLocaleFormatSettings(LOCALE_SYSTEM_DEFAULT, fms);
{$IFEND}
fms.ThousandSeparator := '?';
fms.DecimalSeparator := '.';
Result := FloatToStr(Val, fms);
Result := StringReplace(Result, '?', '', [rfReplaceAll]);
Run Code Online (Sandbox Code Playgroud)

当然,有人可能会争辩说,因为我们假设FloatToStr只使用TFormatSettings' ThousandSeparator并且DecimalSeparator用任何语言环境创建它都是毫无意义的,因为我们无论如何都要覆盖它们.

尽管如此,我认为这是一个非常简单的操作的代码.我也不是那个ThousandSeparator'?' 的粉丝.然后被删除StringReplace().但既然ThousandSeparatorchar,它实际上不是空白.

我运行了一些测试FloatToStrFloatToStrF确定,此时我注意到它TFormatSettings.ThousandSeparator完全被忽略了:

fms := TFormatSettings.Create;
fms.ThousandSeparator := 'W';
fms.DecimalSeparator := '.';
Writeln(FloatToStr(1234567.8901, fms));
Writeln(FloatToStrF(1234567.8901, ffFixed, 18, 4, fms));
Run Code Online (Sandbox Code Playgroud)

我希望每个结果都是'1W234W567.8901',但它只是'1234567.8901'.所以我想知道这是预期的行为还是奇怪的. …

delphi

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

为什么真正的变体布尔值在转换为整数时变为-1?

我意识到人们不应该期望真正的Booleans成为1一个Integer纯粹的他们变成非0.

但是,结果会根据变量是否为Variant(但varBoolean)或a而变化Boolean.

考虑以下:

I := Integer(true);
Run Code Online (Sandbox Code Playgroud)

I现在1.

但...

var
  I: Integer;
  V: Variant;
begin
  V := true;
  I := Integer(V);
end;
Run Code Online (Sandbox Code Playgroud)

I现在-1.

当然,如果我投V到一个Boolean铸造所产生的前Boolean一个Integer,I变成-1.

但我很好奇为什么会这样.

这是因为,该方式Booleans的存储(说的那样1位),以及铸造的时候Integer,德尔福执行转换,铸造时不发生VariantInteger

我只提出这个问题,因为如果你习惯了真正的Boolean铸造1,那么在- 中varBoolean分享案例可能是危险的.varIntegerVarType()case

例如:

case VarType(V) of …
Run Code Online (Sandbox Code Playgroud)

delphi

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

标签 统计

delphi ×7

go ×2

delphi-xe3 ×1

fastreport ×1

generics ×1

indy ×1

inkscape ×1

pdf ×1

regex ×1

svg ×1