正如问题主题所说.我在Delphi中有一个控制台应用程序,它包含一个TTimer变量.我想要做的是为事件分配一个事件处理程序TTimer.OnTimer.我是Delphi的新手,我以前使用C#并且事件处理程序添加到事件是完全不同的.我发现一个人并不是简单地将一个过程作为一个处理程序分配给事件,你必须创建一个带有一个方法的虚拟类,该方法将成为处理程序,然后将此方法分配给该事件.这是我目前的代码:
program TimerTest;
{$APPTYPE CONSOLE}
uses
SysUtils,
extctrls;
type
TEventHandlers = class
procedure OnTimerTick(Sender : TObject);
end;
var
Timer : TTimer;
EventHandlers : TEventHandlers;
procedure TEventHandlers.OnTimerTick(Sender : TObject);
begin
writeln('Hello from TimerTick event');
end;
var
dummy:string;
begin
EventHandlers := TEventHandlers.Create();
Timer := TTimer.Create(nil);
Timer.Enabled := false;
Timer.Interval := 1000;
Timer.OnTimer := EventHandlers.OnTimerTick;
Timer.Enabled := true;
readln(dummy);
end.
Run Code Online (Sandbox Code Playgroud)
这似乎对我来说是正确的,但由于某种原因它不起作用.
编辑
看起来该TTimer组件将无法工作,因为控制台应用程序没有消息循环.有没有办法在我的应用程序中创建计时器?
我有一个硬币兑换器MEI Cashflow E7900和一个MDB适配器,用于将设备连接到串行端口.向我销售适配器的商店还提供了一个测试应用程序,用Delphi编写,用Borland Delphi v6.0编译.它工作得很好,但我的代码由于某种原因没有.
使用MDB时,必须POLL每200ms 发送一次命令.如果一切正常,硬币转换器发送ACK.当我使用Delphi应用程序发送它时,会话看起来像这样:
=> 0x0B*0x0B(星号表示奇偶校验设置为Mark.默认奇偶校验为空格)
<= 0x00
所以一切都很好,这就是我所期待的.当我POLL使用C#应用程序发送时,它就像:
=> 0x0B*0x0B
<= 0x3F 0x00
有时硬币兑换商发送给我0x3F 0x11之后POLL没有任何意义,没有任何有效的回应.当我得到这样的响应时,我运行Delphi应用程序,它得到一个有效的ACK响应.我使用的是COM端口嗅探器,以确保发送的数据没有任何差别,包括端口配置本身,我不断得到不同的响应.
这里是测试应用程序(Delphi)的源代码:
<...>
//The component used it called BComPort
form1.BComPort1.BaudRate:=br9600;
form1.BComPort1.Parity:=paSpace;
form1.BComPort1.Port:="%port name goes here%";
form1.BComPort1.Open;
<...>
procedure SetModeBit(modebit:boolean);
begin
if modebit then begin
form1.BComPort1.BeginUpdate;
form1.BComPort1.Parity:=paMark;
form1.BComPort1.EndUpdate;
end else begin
form1.BComPort1.BeginUpdate;
form1.BComPort1.Parity:=paSpace;
form1.BComPort1.EndUpdate;
end;
procedure TForm1.PollTimer(Sender: TObject);
var
s,buf,buf2:string;
i,len:integer;
x,adr,dat1,ack,chk:byte;
crc:integer;
<...>
adr:=$08 or $0B;
SetModeBit(true);
form1.BComPort1.Write(adr,1); …Run Code Online (Sandbox Code Playgroud) 为了满足我的软件的需要,我需要创建一个打印机驱动程序,它允许我将发送给它的所有图像保存到文件中,然后打开我的程序窗口,让用户对渲染的页面执行某些操作。
我找到了这篇文章,但示例使用了该FILE:端口,而我需要制作自己的端口,将图像转储到文件并运行可执行文件。但是,我认为我可以通过在驱动程序代码中执行此操作来完成我的任务,但我不确定这是一个好的决定,因为它是一个驱动程序,即使它是一个用户模式驱动程序。
我很高兴听到有关我的问题的任何建议。提前致谢。
我正试图为一个网站制作一个拍卖狙击手.要进行出价,您需要将4个参数(当然还有Cookie)发送到/ auction/place_bid.我需要使用套接字,而不是HttpWebRequest.这是代码:
string request1 = "POST /auction/place_bid HTTP/1.1\r\nHost: *host here*\r\nConnection: Keep-Alive\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)\r\nAccept: /*\r\nContent-Type: application/x-www-form-urlencoded; charset=UTF-8\r\nX-Requested-With: XMLHttpRequest\r\n" + cookies +"\r\n";
string request3 = "token=" + token + "&aid=" + aid + "&bidReq=" + ptzReq + "&recaptcha_challenge_field=" + rcf + "&recaptcha_response_field=" + rrf+"\r\n\r\n";
string request2 = "Content-Length: " + (Encoding.UTF8.GetByteCount(request1+request3)+23).ToString() + "\r\n";
byte[] dataSent = Encoding.UTF8.GetBytes(request1+request2+request3);
byte[] dataReceived = new byte[10000];
Socket socket = ConnectSocket(server, 80);
if (socket == null)
{
return null; …Run Code Online (Sandbox Code Playgroud) 我的任务是向用户显示他的XPS文档的每个页面的缩略图.我需要所有的图像都很小,所以我用dpi设置为72.0 渲染它们(我用Google搜索了那张A4纸的尺寸,dpi 72.0是635x896).基本上,我做了以下几点:
List<BitmapImage> thumbnails = new List<BitmapImage>();
documentPaginator.ComputePageCount();
int pageCount = documentPaginator.PageCount;
for (int i = 0; i < pageCount; i++)
{
DocumentPage documentPage = documentPaginator.GetPage(i);
bool isLandscape = documentPage.Size.Width > documentPage.Size.Height;
Visual pageVisual = documentPage.Visual;
//I want all the documents to be less or equals to A4
//private const double A4_SHEET_WIDTH = 635;
//private const double A4_SHEET_HEIGHT = 896;
//A4 sheet size in px, considering 72 dpi
RenderTargetBitmap targetBitmap = new RenderTargetBitmap(
(int)(System.Math.Min(documentPage.Size.Width, A4_SHEET_WIDTH)),
(int)(System.Math.Min(documentPage.Size.Height, A4_SHEET_HEIGHT)), …Run Code Online (Sandbox Code Playgroud) 我的程序有很多小图像(图像控件很小,而不是图像本身),并说了很多我的意思是超过500.这些图像是异步生成的,然后分配给Image之前初始化的控件.
基本上我的代码执行以下操作:
filename = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, string.Format("{0}.JPG", Guid.NewGuid().GetHashCode().ToString("x2")));
converter.ConvertPdfPageToImage(filename, i);
//Fire the ThumbnailCreated event
onThumbnailCreated(filename, (i - 1));
Run Code Online (Sandbox Code Playgroud)
在创建图像的代码中没有内存泄漏,我有以下代码:
string[] files = Directory.GetFiles("C:\\Users\\Daniel\\Pictures", "*.jpg");
for(int i=0; i<files.Length; i++){
onThumbnailCreated(files[i], i);
}
Run Code Online (Sandbox Code Playgroud)
问题仍然存在.这发生在事件处理程序方法中:
void Thumbnails_ThumbnailCreated(ThumbnailCreatedEventArgs e, object sender)
{
//Since we generate the images async, we need to use Invoke
this.parent.Dispatcher.Invoke(new SetImageDelegate(SetImage), e.Filename, e.PageNumber);
}
private void SetImage(string filename, int pageNumber)
{
BitmapImage bitmap = new BitmapImage();
bitmap.BeginInit();
//I am trying to make the Image control use as …Run Code Online (Sandbox Code Playgroud) 我在我的应用程序中使用DES-ECB + base64加密.这就是我称之为"Crypto"的类的代码
public class Crypto
{
public static string Decrypt(string encryptedString)
{
DESCryptoServiceProvider desProvider = new DESCryptoServiceProvider();
desProvider.Mode = CipherMode.ECB;
desProvider.Padding = PaddingMode.PKCS7;
desProvider.Key = Encoding.ASCII.GetBytes("e5d66cf8");
using (MemoryStream stream = new MemoryStream(Convert.FromBase64String(encryptedString)))
{
using (CryptoStream cs = new CryptoStream(stream, desProvider.CreateDecryptor(), CryptoStreamMode.Read))
{
using (StreamReader sr = new StreamReader(cs, Encoding.ASCII))
{
return sr.ReadToEnd();
}
}
}
}
public static string Encrypt(string decryptedString)
{
DESCryptoServiceProvider desProvider = new DESCryptoServiceProvider();
desProvider.Mode = CipherMode.ECB;
desProvider.Padding = PaddingMode.PKCS7;
desProvider.Key = Encoding.ASCII.GetBytes("e5d66cf8");
using (MemoryStream stream …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用POST请求发送base64编码数据,它包含"+"字符.当我发送请求时,"+"被替换为""(空格).这是代码
public string POST(string url, string query)
{
HttpWebRequest hwrq = CreateRequest(url);
hwrq.CookieContainer = Cookies;
hwrq.Method = "POST";
hwrq.ContentType = "application/x-www-form-urlencoded";
byte[] data = Encoding.Default.GetBytes(query);
hwrq.ContentLength = data.Length;
hwrq.GetRequestStream().Write(data, 0, data.Length);
using (HttpWebResponse hwrs = (HttpWebResponse)hwrq.GetResponse())
{
using (StreamReader sr = new StreamReader(hwrs.GetResponseStream()))
{
return sr.ReadToEnd().Trim();
}
}
}
public HttpWebRequest CreateRequest(string url)
{
HttpWebRequest Request = (HttpWebRequest)WebRequest.Create(url);
Request.UserAgent = UserAgent;
Request.Accept = Accept;
Request.Headers.Add("Accept-Language", AcceptLang);
Request.AutomaticDecompression = DMethod;
return Request;
}
Run Code Online (Sandbox Code Playgroud)
我一直在跟踪"查询"变量,它保持"+"字符,但当我在嗅探器(Charles)中看到请求时,请求将在没有"+"的情况下发送.
例如,我正在尝试发送
<...> + ZXJ ZZQ <...>
和 …
我正在使用MRIM(Mail.Ru代理)协议.MRIM是一个二进制协议,所以为了使数据成为二进制,我使用的是BinaryWriter类.这是代码:
private byte[] CreateMrimPacket(ulong message)
{
byte[] binaryData;
using (MemoryStream ms = new MemoryStream())
{
using (BinaryWriter bw = new BinaryWriter(ms))
{
bw.Write(CS_MAGIC); //CS_MAGIC is a constant that doesn't equal 0
bw.Write(PROTO_VERSION); //Same thing
bw.Write((ulong)SeqCounter);
bw.Write(message);
bw.Write((ulong)0);
bw.Write((ulong)0);
bw.Write((ulong)0);
bw.Write((ulong)0);
bw.Write((ulong)0);
bw.Write((ulong)0);
bw.Write((ulong)0);
binaryData = new byte[ms.Length];
ms.Read(binaryData, 0, binaryData.Length);
}
}
return binaryData;
}
Run Code Online (Sandbox Code Playgroud)
此函数返回字节数组,但所有值都为0.
请帮我解决这个问题.
提前致谢
我有一堆图像,看起来像
.
处理完毕后,我希望它们就像
.
我知道我可以使用Flood Fill算法轻松地将这些黑色区域变为白色.但首先,我需要确保黑色区域不是文本的一部分.我怎样才能做到这一点?与字母相比,这些领域是巨大的.那么也许我可以找出每个黑色区域的大小,并使区域大于n白色?
我正在编写一个应用程序,我需要在其中单击另一个应用程序托盘图标菜单中的菜单项。这是一个更好地理解的屏幕截图,因为我不擅长解释东西。

所以我需要单击这些菜单项之一,例如“退出”。
我知道我应该使用 WinApi 来做到这一点。但是,据我所知,该消息WM_NOTIFY负责通知顶部窗口有关菜单项单击的信息。正如 MSDN 站点所说,For Windows 2000 and later systems, the WM_NOTIFY message cannot be sent between processes. 我要运行我的应用程序的 PC 正在运行 Windows XP,因此我无法将此消息发送到窗口。有没有其他方法可以单击菜单项?
提前致谢。
c# ×8
delphi ×2
image ×2
post ×2
wpf ×2
base64 ×1
binarywriter ×1
console ×1
delphi-6 ×1
des ×1
dpi ×1
driver ×1
encryption ×1
memory-leaks ×1
printing ×1
serial-port ×1
sockets ×1
thumbnails ×1
timer ×1
tray ×1
winapi ×1
windows ×1