我正在使用TIdCmdTCPClient和TIdCmdTCPServer.突然间,我发现我可能想要进行双向沟通.
什么是最好的?我应该使用其他一些组件吗?如果是这样,哪个?或者我应该使用'客户'轮询'服务器'来询问它是否希望进行任何通信?
这是一个非常小的系统.两个客户端和十个服务器,每天30到60秒发生一次喷射,每天一次几分钟,因此轮询的开销是无关紧要的.
如果有一个'正确'的方式,我只是喜欢.
更新:这真的是一个非常简单的系统.交通非常少,而且一切都很简单.所有传输都是偶数类型的指示,是可选的单个参数.
<event type> [ <parameter>] 例如 "HERE_IS_SOME_DATA 42"
这可以在两个方向发送,悬停在这里不是"回复"本身.只是发消息(并希望它到达那里)?收到没有数据的Ack?不捕获异常表示消息已成功发送?)
使用两个TIdCmdTCPServer是否可能(是否有点矫枉过正?)
我ToolStatusPanel2在设计时声明了一个面板,并希望添加10个代表状态的面板,以颜色显示.
现在,我的主要表格声明
ToolOnlineStatusPanel : Array[0..Pred(NUM_TOOLS)] of TPanel;
Run Code Online (Sandbox Code Playgroud)
我FormCreate想将它们设置为默认的颜色clRed由
for i:= 0 to Pred(NUM_TOOLS) do
begin
ToolOnlineStatusPanel[i] := TPanel.Create(ToolStatusPanel2);
ToolOnlineStatusPanel[i].Parent := ToolStatusPanel2;
ToolOnlineStatusPanel[i].Height := 16;
ToolOnlineStatusPanel[i].Width := 16;
ToolOnlineStatusPanel[i].Top := 8 + (i * (16 + 8));
ToolOnlineStatusPanel[i].Left := 8;
ToolOnlineStatusPanel[i].Color := clRed;
end;
Run Code Online (Sandbox Code Playgroud)
但这些儿童小组总是和他们的父母有相同的颜色,即使我改变了 - 从不红色.
显然我忽略了一些相当简单的事情.它是什么?谢谢
我有超过25年的100多GB照片.它们按类别排列在目录树中,具有嵌套的子目录.
我想在4月份的任何一个目录中搜索特定月份拍摄的所有照片.
我不认为Windows搜索会起作用,因为这可能是文件创建数据,这可能是一两个月之后我终于将更多文件从SD卡发送到PC.
也许搜索EXIF数据?是否有免费的VCL组件可以帮助我做到这一点?
我按照演示,事情正常.我的客户端有一个功能,可以将命令发送到服务器并处理响应.
对于前几个命令来说这很好,我处理它
var result : String;
TCPclient.SendCmd(theMessage);
TCPclient.GetResponse(Result);
if Result <> 'OK' then ....
Run Code Online (Sandbox Code Playgroud)
服务器发送的位置
ASender.Reply.SetReply(200, 'OK'); ... or ...
ASender.Reply.SetReply(400, 'NAK');
Run Code Online (Sandbox Code Playgroud)
现在,我想添加一个新命令,结果将是NAK或ACK PLUS值0,1或2
我对响应代码感到朦胧,这些代码似乎有两个参数,一个是数字的,一个是文本的....
我可以只是kludge并发送'Ok0','OK1'或'OK2',但这非常难看(可能是一件坏事)
我想我虽然使用200成功并在文本参数中发送0,1或2(或使用'OK'并发送0,1或2作为数字代码,或使用200,201,202作为数字代码)?
有人可以帮我理解我应该编码的内容以及为什么?(或者只是指着我的URL)谢谢
问题是,作为我的第一个可执行语句,我想检查是否可以从数据库中读取.如果我不能,我打电话MessageDlg来解释,然后我Halt;.
但是,关闭对话框后,我仍然在tak管理器中看到应用程序(如果我停止并重新运行应用程序,则会发生同样的事情).
知道我做错了什么吗?
Global.ADQuery1是一个AnyDac数据库访问组件.我通过IP地址访问d/b.当我将我的PC地址设置为d/b地址时,代码工作正常,并在我更改IP地址时提供报告的问题(因此,无法访问d/b,这会引发异常).
procedure TMainForm.FormCreate(Sender: TObject);
begin
try
Global.ADQuery1.Open('SHOW DATABASES');
except
On E: Exception do
begin
MessageDlg('Database access problem', mtError, [mbOK], 0);
Halt;
end;
end;
Run Code Online (Sandbox Code Playgroud)
[更新]当我在IDE中运行后,捕获
(EMySQLNativeException) : "[AnyDAC][Phys][MySQL] Can't connect to MySQL server on '10.21.18.211' (10060)"
我抓到了EIdWinSockStubError either the program has not called wsastartup or wsastartup failed- 但我不是udnertsand它是如何抛出的......我猜这些Application.Terminate调用可能是主要的形式FormClose,它对我的Indy组件没有任何作用,但我想当父表单被销毁时它的子节点会也是.
[进一步更新]
我TMainForm.FormCreate现在只说
Sleep(1000);
PostMessage(Handle, UM_PROGRAM_START, 0, 0);
Run Code Online (Sandbox Code Playgroud)
我将所有代码都移动到处理它的函数stat中.当然一切都是在那个时候创造出来的?那么,为什么我的Indy组件会抛出异常?
也许我应该放入PostMessage()我的[应用程序] .pas之后Application.Run();?
(旁白:1)其他人如何通常以这种方式处理应用程序启动?2)有人有申请骨架吗?我正在考虑创建一个带有选项来处理最小化到系统托盘,只允许一个实例,最近的文件菜单等等) - 尽管这可能更好作为一个单独的问题
如何在处理其到期的函数中获得动态创建的计时器标记?
procedure TMainForm.TimerExpired(Sender: TObject);
begin
// how do I get the tag here?
Run Code Online (Sandbox Code Playgroud)
谁是谁Sender?主要形式?
用户坚持在应用程序中为每个"重要事件"弹出一个框.在备忘录或列表框中添加一行是不可接受的.
我使用标准模式盒bceuase PC通常是未经过的,我的应用程序将等待用户在继续之前单击"确定".
我可以使用备忘录组件和确定按钮动态创建表单并传递一些文本以显示在备忘录中吗?
我试过了,当点击OK时我遇到了访问冲突.
问题:
谷歌没有那么有用,因为形式应该自我毁灭,而例子有它的创造者摧毁它.
主要形式:
theDialogForm := TDialogFormForm.Create(Nil);
theDialogForm.ShowTheForm('Database error '+#13+#10+''+#13+#10+
E.ClassName+#13+#10+
E.Message);
Run Code Online (Sandbox Code Playgroud)
和对话形式......
unit fDialogForm;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TDialogFormForm = class(TForm)
Memo1: TMemo;
OkButton: TButton;
procedure OkButtonClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
procedure ShowTheForm(const theMessage : String);
end;
implementation
{$R *.dfm}
// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
procedure TDialogFormForm.FormCreate(Sender: TObject);
begin
Visible := False;
end;
// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
procedure TDialogFormForm.OkButtonClick(Sender: TObject);
begin
// …Run Code Online (Sandbox Code Playgroud) 屏幕宽度不足以显示一些文本字段.我不知道如何自动包装它们,我怀疑它可以很容易地完成.
所以,我以为我会做类似的事情
procedure TForm1.FormMouseMove(Sender: TObject;
Shift: TShiftState; X,Y: Integer);
var column, row : Integer;
begin
myDbGrid.MouseToCell(X, Y, column, row);
myDbGrid.Hinst := myDbGrid.Cells(column, row); // <==== ooops
end;
Run Code Online (Sandbox Code Playgroud)
或者,也许这样做OnShowHint并获得鼠标坐标并将它们转换为列和行(更高效)
但是,当然,TDbGrid没有Cells.知道如何在用户将鼠标移动到网格的"单元格"上时如何设置控件的提示?
当用户将鼠标移到a上时,我想显示一个提示TDbStringGrid.它几乎可以工作,但提示显示高和左.
在我OnMouseMove,我收到X&Y,我认为它是abosulte屏幕corrdinates,但我可以dbGrid.MouseCoord(X, Y)用来获得DB网格中的一个点.
当我使用时显示我的提示时Application.ActivateHint(),它被放置在高处和左侧.
知道我做错了什么吗?
Delphi XE2和MySql.
我之前的问题导致我建议我应该使用MySql的本机TIMESTAMP数据类型来存储日期/时间.
不幸的是,我似乎无法找到任何编码示例,而且我得到了奇怪的结果.
鉴于此表:
mysql> describe test_runs;
+------------------+-------------+------+-----+---------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------------+-------------+------+-----+---------------------+-------+
| start_time_stamp | timestamp | NO | PRI | 0000-00-00 00:00:00 | |
| end_time_stamp | timestamp | NO | | 0000-00-00 00:00:00 | |
| description | varchar(64) | NO | | NULL | |
+------------------+-------------+------+-----+---------------------+-------+
3 rows in set (0.02 sec)
Run Code Online (Sandbox Code Playgroud)
我喜欢:
SELECT CURRENT_TIMESTAMP- 它应该是什么类型的?TSQLTimeStamp?start_time_stamp …