小编Mar*_*ski的帖子

SQLite更新触发器更改表中的所有行

问题:最简单的更新触发器会将新值写入所有表行,而不仅仅是正在更新的行.这是表格:

[名]

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'列?

sqlite triggers

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

SQL将行对转置到MS ACCESS数据库中的列

我有一个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不是很大(只有几千行).

sql ms-access transpose rows

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

Delphi 2009 RawByteString变幻莫测

假设出于某些不正当的原因,您希望显示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中新奇的字符串类型,并认为我理解它们是如何工作的,但这是一个难题.

delphi unicode utf-8 delphi-2009 rawbytestring

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

什么是"高ascii"字符的正确技术术语?

引用"高ascii"或"扩展ascii"字符的技术上正确的方法是什么?我不只是指128-255的范围,而是0-127范围之外的任何字符.

通常它们被称为变音符号,重音字母,有时随便称为"国家"或非英语字符,但这些名称要么不精确,要么只涵盖可能字符的一部分.

程序员能够立即认识到的正确,精确的术语是什么?在与非技术受众交谈时,最好的英语术语是什么?

ascii terminology character character-encoding extended-ascii

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

将键盘事件从一个Windows控件转发到另一个Windows控件

在Delphi XE中,我正在尝试实现一个"即时搜索"功能 - 一种类似于Firefox的"在键入时搜索"的功能,但在开源剪贴板扩展器中类似的功能更好地说明了,Ditto:

同上搜索界面

有一个处理典型导航事件的项目列表.但是,任何字母数字键以及导航和编辑命令(向右/向左箭头,移位+箭头,退格键,删除等)都应该重新路由到列表下方的编辑框.编辑框的OnChange事件将触发刷新列表.

UI的要点是用户不必在控件之间使用制表符或shift键.这两个控件(列表和编辑框)应该"感觉"好像它们是单个控件.搜索UI的行为应该取决于哪个控件具有焦点.

似乎我最好的选择是将某些键盘事件从列表控件(我使用TcxTreeList)转发到编辑框,并将一些导航键从编辑框转发到列表.我怎样才能做到这一点?

笔记:

  1. TcxTreeList当然支持增量搜索,但这不是我追求的.搜索转到SQLite数据库并查找子字符串匹配.该列表仅显示db中的匹配项.

  2. 有一些重叠,例如两个控件通常会处理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)也没有效果.

windows delphi forwarding keyboard-events

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

在我的应用激活之前检测哪个窗口处于活动状态

在Delphi XE中,我尝试使用GetForegroundWindow来检测在应用程序激活之前立即激活的窗口."已激活"表示应用程序可能已从标志状态恢复,或者已通过alt + tab切换到,或者由激活热键等启动.

问题是所有可用的应用程序事件(OnActivate,OnRestore)来得太晚,因此GetForegroundWindow返回我自己的表单的句柄.主要形式的事件甚至没那么有用.在主窗体中处理WM_ACTIVATEAPP也发生得太晚了.

一种方法是在我的应用程序未激活时继续检查计时器上的活动窗口,但这似乎相当浪费.一个更好的解决方案是继承TApplication.WndProc并在处理WM_ACTIVATEAPP之前完成我的工作,但我不认为TApplication可以是子类.

有没有更好的办法?

windows delphi foreground

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

ES6不会将对象解构为预先声明的变量吗?

这有效:

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)

javascript destructuring ecmascript-6

5
推荐指数
0
解决办法
40
查看次数

在Delphi中读取MS Access mdb文件(免费)?

我正在寻找一个Delphi组件/库来打开和读取mdb(MS Access)数据库.我不会写入数据库或显示数据; 只需要使用sql Access支持读取数据库.

这是一个个人的项目(编程不是我付出的工作),所以我需要一个免费或非常便宜的解决方案,适用于任何Delphi 6,Delphi 2007或Delphi 2009(专业版全部).性能无所谓,简单就是:)

sql delphi ms-access components ms-jet-ace

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

在Delphi中检测辅助线程上下文

在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)检查单例调度程序对象是否已初始化; …

delphi multithreading detect

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

EnumResourceNames返回Windows错误998(对内存位置的无效访问)

(见底部编辑)

使用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 dll

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