问题:最简单的更新触发器会将新值写入所有表行,而不仅仅是正在更新的行.这是表格:
[名]
id INTEGER PRIMARY KEY
name TEXT
len INTEGER
Run Code Online (Sandbox Code Playgroud)
现在我想创建触发器以'name'的长度更新'len'.这个INSERT触发器似乎正在做核心工作:
CREATE TRIGGER 'namelen' AFTER INSERT ON 'names'
BEGIN
UPDATE 'names' SET len = length(NEW.name) WHERE (id=NEW.id);
END;
Run Code Online (Sandbox Code Playgroud)
添加类似的UPDATE触发器时出现问题:
CREATE TRIGGER 'namelenupd' AFTER UPDATE ON 'names'
BEGIN
UPDATE 'names' SET len = length(NEW.name) WHERE (OLD.id=NEW.id);
END;
Run Code Online (Sandbox Code Playgroud)
尽管有WHERE子句,update触发器会将新长度写入表的所有行.例如,如果我说
UPDATE 'names' SET name='foo' where id=1;
Run Code Online (Sandbox Code Playgroud)
然后'len'的值对于表的所有行变为3 .我看过sqlite触发器示例,我看不到我的错误.还有什么办法可以确保触发器仅在实际更新的行中更新'len'列?
我有一个MS Access数据库,其中包含源 - 目标对中的翻译句子(CAT工具的其他用户的翻译记忆库).有点烦人的是,源和目标不是存储在单独的列中,而是存储在由ID链接的行中,如下所示:
+---+----+--------------+
|id |lang| text |
+---+----+--------------+
1 a lang a text
1 b lang b text
2 a more a text...
2 b more b text...
+---+----+--------------+
Run Code Online (Sandbox Code Playgroud)
我可以使用什么SQL将其转换为表格,例如:
+---+--------------+--------------+
|id | lang A | lang B |
+---+--------------+--------------+
1 lang a text lang b text
2 more a text... more b text...
Run Code Online (Sandbox Code Playgroud)
性能在这里并不重要,因为我只需要偶尔执行一次,并且db不是很大(只有几千行).
假设出于某些不正当的原因,您希望显示UTF8String的原始字节内容.
var
utf8Str : UTF8String;
begin
utf8Str := '€?????ó???';
end;
Run Code Online (Sandbox Code Playgroud)
(1)这不行,它显示可读形式:
memo1.Lines.Add( RawByteString( utf8Str ));
// output: '€?????ó???'
Run Code Online (Sandbox Code Playgroud)
(2)然而,这确实"有效" - 请注意连接:
memo1.Lines.Add( 'x' + RawByteString( utf8Str ));
// output: 'x€ąćę?‚?„???›????'
Run Code Online (Sandbox Code Playgroud)
我理解(1),虽然编译器强制转换为UnicodeString似乎阻止了原样显示RawByteString var.但是,为什么行为会在(2)中发生变化?
(3)陌生人仍然 - 让我们扭转连接:
memo1.Lines.Add( RawByteString( utf8Str ) + 'x' );
// output: '€?????ó???x'
Run Code Online (Sandbox Code Playgroud)
我一直在阅读Delphi中新奇的字符串类型,并认为我理解它们是如何工作的,但这是一个难题.
引用"高ascii"或"扩展ascii"字符的技术上正确的方法是什么?我不只是指128-255的范围,而是0-127范围之外的任何字符.
通常它们被称为变音符号,重音字母,有时随便称为"国家"或非英语字符,但这些名称要么不精确,要么只涵盖可能字符的一部分.
程序员能够立即认识到的正确,精确的术语是什么?在与非技术受众交谈时,最好的英语术语是什么?
ascii terminology character character-encoding extended-ascii
在Delphi XE中,我正在尝试实现一个"即时搜索"功能 - 一种类似于Firefox的"在键入时搜索"的功能,但在开源剪贴板扩展器中类似的功能更好地说明了,Ditto:

有一个处理典型导航事件的项目列表.但是,任何字母数字键以及导航和编辑命令(向右/向左箭头,移位+箭头,退格键,删除等)都应该重新路由到列表下方的编辑框.编辑框的OnChange事件将触发刷新列表.
UI的要点是用户不必在控件之间使用制表符或shift键.这两个控件(列表和编辑框)应该"感觉"好像它们是单个控件.搜索UI的行为不应该取决于哪个控件具有焦点.
似乎我最好的选择是将某些键盘事件从列表控件(我使用TcxTreeList)转发到编辑框,并将一些导航键从编辑框转发到列表.我怎样才能做到这一点?
笔记:
TcxTreeList当然支持增量搜索,但这不是我追求的.搜索转到SQLite数据库并查找子字符串匹配.该列表仅显示db中的匹配项.
有一些重叠,例如两个控件通常会处理VK_HOME和VK_END,但这没关系 - 在这种情况下,键将进入列表.我需要决定是否转发每个单独的按键,或者在接收它的控件中处理它.
在编辑: 一个显而易见的方法似乎是调用编辑控件的相应KeyDown,KeyUp和KeyPress方法,如下所示:
type
THackEdit = class( TEdit );
procedure TMainForm.cxTreeList1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
THackEdit( edit1 ).KeyDown( Key, Shift );
end;
Run Code Online (Sandbox Code Playgroud)
不幸的是,这没有任何效果.我的猜测是TEdit不会处理关键事件,除非它是专注的.使用SendMessage(THackEdit(edit1).Handle,WM_KEYDOWN,Key,0)也没有效果.
在Delphi XE中,我尝试使用GetForegroundWindow来检测在应用程序激活之前立即激活的窗口."已激活"表示应用程序可能已从标志状态恢复,或者已通过alt + tab切换到,或者由激活热键等启动.
问题是所有可用的应用程序事件(OnActivate,OnRestore)来得太晚,因此GetForegroundWindow返回我自己的表单的句柄.主要形式的事件甚至没那么有用.在主窗体中处理WM_ACTIVATEAPP也发生得太晚了.
一种方法是在我的应用程序未激活时继续检查计时器上的活动窗口,但这似乎相当浪费.一个更好的解决方案是继承TApplication.WndProc并在处理WM_ACTIVATEAPP之前完成我的工作,但我不认为TApplication可以是子类.
有没有更好的办法?
这有效:
const { foo, bar } = someFunc();
Run Code Online (Sandbox Code Playgroud)
这样做:
let { foo, bar } = someFunc();
Run Code Online (Sandbox Code Playgroud)
但是如果我试图将结构化为已经声明的变量......
let foo = 0;
let bar = 0;
{ foo, bar } = someFunc();
Run Code Online (Sandbox Code Playgroud)
然后:
未捕获的SyntaxError:意外的令牌=
这是设计的吗?除了声明临时对象接收值之外,还有其他解决方法吗?我在switch/case语句中这样做; foo和bar在顶部声明并在切换后使用.到目前为止,我只能这样做:
const temp = someFunc();
foo = temp.foo;
bar = temp.bar;
Run Code Online (Sandbox Code Playgroud) 我正在寻找一个Delphi组件/库来打开和读取mdb(MS Access)数据库.我不会写入数据库或显示数据; 只需要使用sql Access支持读取数据库.
这是一个个人的项目(编程不是我付出的工作),所以我需要一个免费或非常便宜的解决方案,适用于任何Delphi 6,Delphi 2007或Delphi 2009(专业版全部).性能无所谓,简单就是:)
在Delphi 2009和Windows API中,有没有办法检测特定代码段是否在辅助线程的上下文中运行?在伪代码中,我想能够说:
procedure DoSomething;
begin
if InvokedBySecondaryThread then
DoIt_ThreadSafeWay
else
DoIt_RegularWay;
end;
Run Code Online (Sandbox Code Playgroud)
这是我编写并已使用多年的日志库,现在我正在尝试适应可以从多个线程调用一个过程的情况.我的"常规方式"不是线程安全的.我知道如何使它线程安全,但我只想在实际需要时使用线程安全方法.
解释(不是必读的:-)
它归结为使用SendMessage和PostMessage将记录的消息分派给多个接收器(例如日志文件,控制台或VCL控件)之间的选择.使用PostMessage意味着在长时间阻塞操作正在进行时将不会收到消息,这有点违背了记录的目的,尤其是.用来表示进度.我想我可以用一个关键部分来保护SendMessage调用,但我再次希望只有在真正需要时才能这样做.
我知道system.pas中的全局变量IsMultiThread,但这只会告诉我应用程序已经启动了辅助线程.这些可能是由第三方库创建的线程,因此它们永远不会访问"我的"代码,因此它们的存在不会影响我的日志记录逻辑.
我真的希望我可以使用相同的低级库代码,无论它是从一个还是多个线程调用.例如,从辅助线程内部调用修改的线程安全日志记录过程很容易,但这会复制很多代码,我仍然要记住要做正确的事情.
@Lieven:目前,日志逻辑就像这样,有点简化了
我希望日志记录尽可能轻松,使用最少的设置代码并且不必担心管理对象生存期,因此库只暴露了许多重载的帮助程序,例如
procedure Log( const msgText : string; level : TLogLevel = lvNotice ); overload;
procedure Log( const msgText : string; Args : array of const; level : TLogLevel = lvNotice ); overload;
etc, including specialized routines that log a StringList, a boolean, an Exception and so on
Run Code Online (Sandbox Code Playgroud)
几乎所有其他事情都发生在单位的实施中.所有帮助程序最终都会调用
procedure _LogPostMessage( const msgText : string; level : TLogLevel );
Run Code Online (Sandbox Code Playgroud)
其中(a)检查单例调度程序对象是否已初始化; …
(见底部编辑)
使用EnumResourceNames,我试图在我自己的DLL中找到存储为资源的图标.这是整个DLL代码:
library focusRes;
{$R focusResResource.res} // contains the icons I need to load
{$R *.res}
begin
end.
Run Code Online (Sandbox Code Playgroud)
我可以使用LoadLibrary和LoadLibraryEx(已验证)正确加载DLL.但是对EnumResourceNames的调用返回false,而GetLastError返回998(对内存位置的无效访问).调用代码是:
hdll := LoadLibraryEx( PChar( DLLFilename ), 0, LOAD_LIBRARY_AS_DATAFILE );
// OR: hdll := LoadLibrary( PChar( DLLFilename ));
enumResult := EnumResourceNames( hDll, RT_ICON, @EnumResFlags, 0 );
// (hDll is the handle returned from LoadLibrary)
Run Code Online (Sandbox Code Playgroud)
和回调函数:
function EnumResFlags( hDll : HMODULE; ResType, ResName : PChar;
notUsed : pointer ) : integer; stdcall;
begin
// NEVER GETS CALLED
// log( ResName);
result := 1; …Run Code Online (Sandbox Code Playgroud) delphi ×6
ms-access ×2
sql ×2
windows ×2
ascii ×1
character ×1
components ×1
delphi-2009 ×1
detect ×1
dll ×1
ecmascript-6 ×1
foreground ×1
forwarding ×1
javascript ×1
ms-jet-ace ×1
rows ×1
sqlite ×1
terminology ×1
transpose ×1
triggers ×1
unicode ×1
utf-8 ×1