现在,当然,我可以编写我的正则表达式来处理这两种情况,例如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)
但我觉得这是一个相当不优雅的解决方案.速度并不是真正的问题,但我需要知道是否还有另一种方式.
阅读完SVG2草案后,我有点失望地得知没有新的线路上限而不是标准3. 然而,新的弧线连接很精彩,但不是这个问题的内容(我只是想提一下).
我一直希望有一个以三角形结尾的帽子.但鉴于我的用例,这可能也不理想.
据我所知,Adobe Illustrator - 我自己不使用 - 允许笔画的宽度可变.从绘图板绘图时,这非常有用,可突出显示线条的压力.确实,这个功能存在于许多位图绘制程序中,但有没有办法在SVG中实现这种效果,而不必绘制多行?
我们的想法是每个节点都应该有一个宽度,然后这些线应该"平滑地"缩放具有不同宽度的每个节点之间的宽度.
这可能吗?如果没有,可以考虑吗?
PS我应该指出,这更像是一个思想实验和一个想法,而不是阻碍我的过程.比需要更多的好东西.
Indy的TIdHttp课程 - 在最近的版本中 - 是Delete()例程.但由于某种原因,这是一个程序,而不是一个功能. Put(),Get()等等都是返回响应主体内容的函数.无论是作为字符串还是将其传递给TStream.这是不可能的Delete(),这与DELETE定义相矛盾:
如果响应包括描述状态的实体,则成功响应应为200(OK),如果操作尚未执行,则应为202(已接受);如果操作已颁布但响应不包括,则应为204(无内容)一个实体.
来源.
然后我尝试使用GetResponse(),但这只是优雅地关闭了我的连接,而没有填写响应.
那么如何从DELETE响应中读取响应主体的内容呢?
考虑以下代码:
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) 请考虑以下代码:
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是一个有点可疑.
我正在使用FastReports,并且在iOS上无法正确读取生成的PDF.因为iOS读取PDF/A,FastReports不支持.这显然是FastReports 4.0中的一个已知错误,它将在FastReports 5.0中修复.然而,5.0还有很长的路要走,并且至今已经开发了多年.
所以我的简单解决方案 - 我更喜欢一个简单的解决方案,所以我可以在FastReports 5.0出来后再次删除它 - 现在只需将现有PDF打印到另一个PDF.这可以在没有在系统上安装PDF打印机而只使用Delphi的情况下完成吗?
如果没有,是否有转换器接受PDF文件并输出PDF文件?
我有TListView一些显示工具提示的专业领域.因为我不能通过设计来定义一个特定的区域TListView来显示超过工具提示Subitem.
所以我已经创建了一个结构,其中包含它们的位置以及工具提示(提示).这部分工作正常.但是,这些位置在TListView其顶部之间是相对的,因此一旦用户滚动,MousePos仍然指的是完全可见的TListView,无论TListView滚动到何处.
那讲得通; 但是我想在Y坐标中添加用户向下滚动的距离.(我也想为X坐标做同样的事情,但这不太相关.)但据我所知,A)没有机制TListView来检测这个和B)大多数指南都在谈论TListView和滚动是指捕获正在发生的滚动,而不是在我的情况下,在不同的事件期间(在这种情况下,在鼠标移动时).
那么我如何检测或计算用户在滚动事件中滚动的距离呢?
TList和TOjectList在Generics.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) 我试图将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().但既然ThousandSeparator是char,它实际上不是空白.
我运行了一些测试FloatToStr并FloatToStrF确定,此时我注意到它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'.所以我想知道这是预期的行为还是奇怪的. …
我意识到人们不应该期望真正的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,德尔福执行转换,铸造时不发生Variant到Integer?
我只提出这个问题,因为如果你习惯了真正的Boolean铸造1,那么在- 中varBoolean分享案例可能是危险的.varIntegerVarType()case
例如:
case VarType(V) of …Run Code Online (Sandbox Code Playgroud) delphi ×7
go ×2
delphi-xe3 ×1
fastreport ×1
generics ×1
indy ×1
inkscape ×1
pdf ×1
regex ×1
svg ×1