管道操作小问题 ( 积分: 30 )

  • 主题发起人 主题发起人 sy0116
  • 开始时间 开始时间
S

sy0116

Unregistered / Unconfirmed
GUEST, unregistred user!
我想用一下代码来实现向控制台中写入命令,然后让命令执行的结果仍然显示在控制台中,可是程序无法正常执行,请问应该如何修改?我想问题应该出在<br>start.hStdOutput:=GetStdHandle(STD_OUTPUT_HANDLE);<br>这一句<br>begin<br>&nbsp;&nbsp;&nbsp;&nbsp;security.nLength:=SizeOf(security);<br>&nbsp;&nbsp;&nbsp;&nbsp;security.lpSecurityDescriptor:=nil;<br>&nbsp;&nbsp;&nbsp;&nbsp;security.bInheritHandle:=True;<br>&nbsp;&nbsp;&nbsp;&nbsp;CreatePipe(readin,writein,@security,0);<br>&nbsp;&nbsp;&nbsp;&nbsp;CreatePipe(readout,writeout,@security,0);<br>&nbsp;&nbsp;&nbsp;&nbsp;ZeroMemory(@start,SizeOf(start));<br>&nbsp;&nbsp;&nbsp;&nbsp;start.cb:=SizeOf(start);<br>&nbsp;&nbsp;&nbsp;&nbsp;start.dwFlags:=STARTF_USESTDHANDLES&nbsp;+&nbsp;STARTF_USESHOWWINDOW;<br>&nbsp;&nbsp;&nbsp;&nbsp;start.hStdInput:=readin;<br>&nbsp;&nbsp;&nbsp;&nbsp;start.hStdOutput:=GetStdHandle(STD_OUTPUT_HANDLE);<br>&nbsp;&nbsp;&nbsp;&nbsp;start.hStdError:=writeout;<br>&nbsp;&nbsp;&nbsp;&nbsp;//start.hStdOutput:=writeout;<br>&nbsp;&nbsp;&nbsp;&nbsp;//start.hStdError:=writeout;<br>&nbsp;&nbsp;&nbsp;&nbsp;start.wShowWindow:=SW_SHOWNORMAL;<br>&nbsp;&nbsp;&nbsp;&nbsp;start.lpReserved&nbsp;:=&nbsp;nil;<br>&nbsp;&nbsp;&nbsp;&nbsp;CreateProcess(nil,'cmd',nil,nil,True,NORMAL_PRIORITY_CLASS,nil,nil,start,pi);<br>&nbsp;&nbsp;&nbsp;&nbsp;Cmdexist:=True;<br>&nbsp;&nbsp;&nbsp;&nbsp;CreateThread(nil,0,@readcmd,0,0,id);<br>&nbsp;&nbsp;end;
 
以前做的一个测试。<br>uMain.pas<br>========================================<br>unit&nbsp;uMain;<br><br>interface<br><br>uses<br>&nbsp;&nbsp;Windows,&nbsp;Messages,&nbsp;SysUtils,&nbsp;Variants,&nbsp;Classes,&nbsp;Graphics,&nbsp;Controls,&nbsp;Forms,<br>&nbsp;&nbsp;Dialogs,&nbsp;StdCtrls,&nbsp;ExtCtrls,&nbsp;ShellCtrls;<br>const<br>&nbsp;&nbsp;&nbsp;&nbsp;ReadBuffer&nbsp;=&nbsp;255;<br>type<br>&nbsp;&nbsp;TForm1&nbsp;=&nbsp;class(TForm)<br>&nbsp;&nbsp;&nbsp;&nbsp;Memo1:&nbsp;TMemo;<br>&nbsp;&nbsp;&nbsp;&nbsp;Timer1:&nbsp;TTimer;<br>&nbsp;&nbsp;&nbsp;&nbsp;Panel1:&nbsp;TPanel;<br>&nbsp;&nbsp;&nbsp;&nbsp;ComboBox1:&nbsp;TComboBox;<br>&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;FormCreate(Sender:&nbsp;TObject);<br>&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;FormClose(Sender:&nbsp;TObject;&nbsp;var&nbsp;Action:&nbsp;TCloseAction);<br>&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;Timer1Timer(Sender:&nbsp;TObject);<br>&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;ComboBox1KeyPress(Sender:&nbsp;TObject;&nbsp;var&nbsp;Key:&nbsp;Char);<br>&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;ComboBox1Select(Sender:&nbsp;TObject);<br>&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;Memo1KeyPress(Sender:&nbsp;TObject;&nbsp;var&nbsp;Key:&nbsp;Char);<br>&nbsp;&nbsp;private<br>&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;WriteToPipe(Pipe:&nbsp;THandle;&nbsp;Value:&nbsp;string);<br>&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;ReadFromPipe(Pipe:&nbsp;THandle):&nbsp;string;<br>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;Private&nbsp;declarations&nbsp;}<br>&nbsp;&nbsp;public<br>&nbsp;&nbsp;&nbsp;&nbsp;ReadPipeIn,&nbsp;WritePipeIn,ReadPipeOut,&nbsp;WritePipeOut:&nbsp;THandle;<br>&nbsp;&nbsp;&nbsp;&nbsp;ProcessInfo:&nbsp;TProcessInformation;<br>&nbsp;&nbsp;&nbsp;&nbsp;Buffer:&nbsp;PChar;<br>&nbsp;&nbsp;&nbsp;&nbsp;BytesRead:&nbsp;DWord;<br>&nbsp;&nbsp;&nbsp;&nbsp;bStart:boolean;<br>&nbsp;&nbsp;&nbsp;&nbsp;s:Tstringlist;<br>&nbsp;&nbsp;end;<br><br>var<br>&nbsp;&nbsp;Form1:&nbsp;TForm1;<br><br>implementation<br><br>{$R&nbsp;*.dfm}<br><br>procedure&nbsp;TForm1.FormCreate(Sender:&nbsp;TObject);<br>var<br>Security:&nbsp;TSecurityAttributes;<br>start:&nbsp;TStartUpInfo;<br>begin<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;s.Destroy;<br>&nbsp;&nbsp;&nbsp;&nbsp;with&nbsp;Security&nbsp;do<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nlength&nbsp;:=&nbsp;SizeOf(TSecurityAttributes);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;binherithandle&nbsp;:=&nbsp;true;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpsecuritydescriptor&nbsp;:=&nbsp;nil;<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;{创建一个命名管道用来捕获console程序的输出}<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;not&nbsp;Createpipe(ReadPipeIn,&nbsp;WritePipeIn,&nbsp;@Security,&nbsp;0)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;showmessage('无法创建命名管道!');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;not&nbsp;Createpipe(ReadPipeOut,&nbsp;WritePipeOut,&nbsp;@Security,&nbsp;0)&nbsp;&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;showmessage('无法创建命名管道!');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(ReadPipeIn);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(WritePipeIn);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;Buffer&nbsp;:=&nbsp;AllocMem(ReadBuffer&nbsp;+&nbsp;1);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;FillChar(Start,&nbsp;Sizeof(Start),&nbsp;#0);<br>&nbsp;&nbsp;&nbsp;&nbsp;{设置console程序的启动属性}<br>&nbsp;&nbsp;&nbsp;&nbsp;with&nbsp;start&nbsp;do<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cb&nbsp;:=&nbsp;SizeOf(start);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;start.lpReserved&nbsp;:=&nbsp;nil;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpDesktop&nbsp;:=&nbsp;nil;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpTitle&nbsp;:=&nbsp;nil;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dwX&nbsp;:=&nbsp;0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dwY&nbsp;:=&nbsp;0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dwXSize&nbsp;:=&nbsp;0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dwYSize&nbsp;:=&nbsp;0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dwXCountChars&nbsp;:=&nbsp;0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dwYCountChars&nbsp;:=&nbsp;0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dwFillAttribute&nbsp;:=&nbsp;0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cbReserved2&nbsp;:=&nbsp;0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpReserved2&nbsp;:=&nbsp;nil;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hStdOutput&nbsp;:=&nbsp;WritePipeOut;&nbsp;//将输出定向到我们建立的WritePipe上<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hStdInput&nbsp;:=&nbsp;ReadPipeIn; &nbsp;//将输入定向到我们建立的ReadPipeIn上<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hStdError&nbsp;:=&nbsp;WritePipeOut;&nbsp;&nbsp;//将错误输出定向到我们建立的WritePipe上<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dwFlags&nbsp;:=&nbsp;STARTF_USESTDHANDLES&nbsp;or&nbsp;STARTF_USESHOWWINDOW;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wShowWindow&nbsp;:=&nbsp;SW_hide;&nbsp;&nbsp;//设置窗口为hide<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;not&nbsp;CreateProcess(nil,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PChar('cmd.exe'),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Security,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Security,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;true,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NORMAL_PRIORITY_CLASS,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nil,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nil,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;start,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ProcessInfo)<br>&nbsp;&nbsp;&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;showmessage('无法起动cmd!');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;Memo1.Lines.Add('程序起动');<br>&nbsp;&nbsp;&nbsp;&nbsp;BytesRead&nbsp;:=&nbsp;0;<br>&nbsp;&nbsp;&nbsp;&nbsp;self.bStart&nbsp;:=true;<br><br>end;<br>procedure&nbsp;TForm1.WriteToPipe(Pipe:&nbsp;THandle;&nbsp;Value:&nbsp;string);<br>var<br>&nbsp;&nbsp;len:&nbsp;integer;<br>&nbsp;&nbsp;BytesWrite:&nbsp;DWord;<br>&nbsp;&nbsp;Buffer:&nbsp;PChar;<br>begin<br>&nbsp;&nbsp;len&nbsp;:=&nbsp;Length(Value)&nbsp;+&nbsp;2;<br>&nbsp;&nbsp;Buffer&nbsp;:=&nbsp;PChar(Value&nbsp;+&nbsp;#13#10);<br>&nbsp;&nbsp;WriteFile(Pipe,&nbsp;Buffer[0],&nbsp;len,&nbsp;BytesWrite,&nbsp;nil);<br>end;<br><br>procedure&nbsp;TForm1.FormClose(Sender:&nbsp;TObject;&nbsp;var&nbsp;Action:&nbsp;TCloseAction);<br>begin<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;self.bStart&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TerminateProcess(ProcessInfo.hProcess,0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FreeMem(Buffer);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(ProcessInfo.hProcess);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(ProcessInfo.hThread);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(ReadPipeOut);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(WritePipeOut);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(ReadPipeIn);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle(WritePipeIn);<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>end;<br><br>procedure&nbsp;TForm1.Timer1Timer(Sender:&nbsp;TObject);<br>var<br>&nbsp;&nbsp;&nbsp;&nbsp;Buf:&nbsp;string;<br>&nbsp;&nbsp;&nbsp;&nbsp;fileSize:dword;<br>begin<br>&nbsp;&nbsp;&nbsp;&nbsp;buf:=&nbsp;ReadFromPipe(&nbsp;ReadPipeOut);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;buf&nbsp;&lt;&gt;''&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Memo1.Lines.BeginUpdate&nbsp;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Memo1.Text&nbsp;:=&nbsp;Memo1.Text&nbsp;+&nbsp;buf;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;postmessage(Memo1.Handle,EM_SCROLL,SB_BOTTOM,0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;application.ProcessMessages;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memo1.SelStart&nbsp;:=&nbsp;length(Memo1.Text);<br> Memo1.Lines.EndUpdate;<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>end;<br><br>function&nbsp;TForm1.ReadFromPipe(Pipe:&nbsp;THandle):&nbsp;string;<br>var<br>&nbsp;&nbsp;Buffer:&nbsp;PChar;<br>&nbsp;&nbsp;BytesRead:&nbsp;DWord;<br>begin<br>&nbsp;&nbsp; Result&nbsp;:=&nbsp;'';<br><br>&nbsp;&nbsp; if&nbsp;GetFileSize(Pipe,&nbsp;nil)&nbsp;=&nbsp;0&nbsp;then&nbsp;Exit;<br><br>&nbsp;&nbsp; Buffer&nbsp;:=&nbsp;AllocMem(ReadBuffer&nbsp;+&nbsp;1);<br><br>&nbsp;&nbsp; repeat<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BytesRead&nbsp;:=&nbsp;0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ReadFile(Pipe,&nbsp;Buffer[0],<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ReadBuffer,&nbsp;BytesRead,&nbsp;nil);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;BytesRead&nbsp;&gt;&nbsp;0&nbsp;then&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Buffer[BytesRead]&nbsp;:=&nbsp;#0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OemToAnsi(Buffer,&nbsp;Buffer);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Result&nbsp;:=&nbsp;Result+string(Buffer);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp; until&nbsp;(GetFileSize(Pipe,&nbsp;nil)&nbsp;&lt;=&nbsp;0);<br><br>&nbsp;&nbsp; FreeMem(Buffer);<br><br>end;<br><br>procedure&nbsp;TForm1.ComboBox1KeyPress(Sender:&nbsp;TObject;&nbsp;var&nbsp;Key:&nbsp;Char);<br>begin<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;Key&nbsp;=&nbsp;#13&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//向管道写入数据。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteToPipe(WritePipeIn,ComboBox1.Text);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Key&nbsp;:=#0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ComboBox1.Text&nbsp;&lt;&gt;&nbsp;'')then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ComboBox1.Items.Insert(0,ComboBox1.Text);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;ComboBox1.Items.Count&nbsp;&gt;&nbsp;20&nbsp;&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ComboBox1.Items.Delete(ComboBox1.Items.Count&nbsp;-1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ComboBox1.Text:='';<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ComboBox1.ItemIndex:=-1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp; ComboBox1.Tag:=&nbsp;ComboBox1.SelStart&nbsp;;<br>end;<br><br>procedure&nbsp;TForm1.ComboBox1Select(Sender:&nbsp;TObject);<br>begin<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;length(ComboBox1.Text)&nbsp;&lt;=ComboBox1.Tag&nbsp;&nbsp;then<br>&nbsp;&nbsp;&nbsp;ComboBox1.SelStart&nbsp;:=&nbsp;ComboBox1.Tag&nbsp;&nbsp;;<br>end;<br><br>procedure&nbsp;TForm1.Memo1KeyPress(Sender:&nbsp;TObject;&nbsp;var&nbsp;Key:&nbsp;Char);<br>begin<br>&nbsp;&nbsp;&nbsp;&nbsp;PostMessage(ComboBox1.Handle,WM_CHAR,&nbsp;integer(Key),0);<br>&nbsp;&nbsp;&nbsp;&nbsp;Key:=#0;<br>&nbsp;&nbsp;&nbsp;&nbsp;ComboBox1.SetFocus;<br>end;<br><br>end.<br><br><br><br>uMain.DFM<br>========================================================================<br>object&nbsp;Form1:&nbsp;TForm1<br>&nbsp;&nbsp;Left&nbsp;=&nbsp;273<br>&nbsp;&nbsp;Top&nbsp;=&nbsp;444<br>&nbsp;&nbsp;Width&nbsp;=&nbsp;870<br>&nbsp;&nbsp;Height&nbsp;=&nbsp;673<br>&nbsp;&nbsp;Caption&nbsp;=&nbsp;'Form1'<br>&nbsp;&nbsp;Color&nbsp;=&nbsp;clBtnFace<br>&nbsp;&nbsp;Font.Charset&nbsp;=&nbsp;DEFAULT_CHARSET<br>&nbsp;&nbsp;Font.Color&nbsp;=&nbsp;clWindowText<br>&nbsp;&nbsp;Font.Height&nbsp;=&nbsp;-11<br>&nbsp;&nbsp;Font.Name&nbsp;=&nbsp;'MS&nbsp;Sans&nbsp;Serif'<br>&nbsp;&nbsp;Font.Style&nbsp;=&nbsp;[]<br>&nbsp;&nbsp;OldCreateOrder&nbsp;=&nbsp;False<br>&nbsp;&nbsp;OnClose&nbsp;=&nbsp;FormClose<br>&nbsp;&nbsp;OnCreate&nbsp;=&nbsp;FormCreate<br>&nbsp;&nbsp;PixelsPerInch&nbsp;=&nbsp;96<br>&nbsp;&nbsp;TextHeight&nbsp;=&nbsp;13<br>&nbsp;&nbsp;object&nbsp;Memo1:&nbsp;TMemo<br>&nbsp;&nbsp;&nbsp;&nbsp;Left&nbsp;=&nbsp;0<br>&nbsp;&nbsp;&nbsp;&nbsp;Top&nbsp;=&nbsp;0<br>&nbsp;&nbsp;&nbsp;&nbsp;Width&nbsp;=&nbsp;862<br>&nbsp;&nbsp;&nbsp;&nbsp;Height&nbsp;=&nbsp;616<br>&nbsp;&nbsp;&nbsp;&nbsp;Align&nbsp;=&nbsp;alClient<br>&nbsp;&nbsp;&nbsp;&nbsp;Color&nbsp;=&nbsp;clMenuText<br>&nbsp;&nbsp;&nbsp;&nbsp;Font.Charset&nbsp;=&nbsp;ANSI_CHARSET<br>&nbsp;&nbsp;&nbsp;&nbsp;Font.Color&nbsp;=&nbsp;clWhite<br>&nbsp;&nbsp;&nbsp;&nbsp;Font.Height&nbsp;=&nbsp;-16<br>&nbsp;&nbsp;&nbsp;&nbsp;Font.Name&nbsp;=&nbsp;'System'<br>&nbsp;&nbsp;&nbsp;&nbsp;Font.Style&nbsp;=&nbsp;[fsBold]<br>&nbsp;&nbsp;&nbsp;&nbsp;Lines.Strings&nbsp;=&nbsp;(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'Memo1')<br>&nbsp;&nbsp;&nbsp;&nbsp;ParentFont&nbsp;=&nbsp;False<br>&nbsp;&nbsp;&nbsp;&nbsp;ScrollBars&nbsp;=&nbsp;ssVertical<br>&nbsp;&nbsp;&nbsp;&nbsp;TabOrder&nbsp;=&nbsp;0<br>&nbsp;&nbsp;&nbsp;&nbsp;OnKeyPress&nbsp;=&nbsp;Memo1KeyPress<br>&nbsp;&nbsp;end<br>&nbsp;&nbsp;object&nbsp;Panel1:&nbsp;TPanel<br>&nbsp;&nbsp;&nbsp;&nbsp;Left&nbsp;=&nbsp;0<br>&nbsp;&nbsp;&nbsp;&nbsp;Top&nbsp;=&nbsp;616<br>&nbsp;&nbsp;&nbsp;&nbsp;Width&nbsp;=&nbsp;862<br>&nbsp;&nbsp;&nbsp;&nbsp;Height&nbsp;=&nbsp;23<br>&nbsp;&nbsp;&nbsp;&nbsp;Align&nbsp;=&nbsp;alBottom<br>&nbsp;&nbsp;&nbsp;&nbsp;Caption&nbsp;=&nbsp;'Panel1'<br>&nbsp;&nbsp;&nbsp;&nbsp;TabOrder&nbsp;=&nbsp;1<br>&nbsp;&nbsp;&nbsp;&nbsp;DesignSize&nbsp;=&nbsp;(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;862<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;23)<br>&nbsp;&nbsp;&nbsp;&nbsp;object&nbsp;ComboBox1:&nbsp;TComboBox<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Left&nbsp;=&nbsp;0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Top&nbsp;=&nbsp;0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Width&nbsp;=&nbsp;865<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Height&nbsp;=&nbsp;21<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AutoComplete&nbsp;=&nbsp;False<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BevelInner&nbsp;=&nbsp;bvSpace<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BevelKind&nbsp;=&nbsp;bkSoft<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BevelOuter&nbsp;=&nbsp;bvNone<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Anchors&nbsp;=&nbsp;[akLeft,&nbsp;akRight,&nbsp;akBottom]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ItemHeight&nbsp;=&nbsp;13<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TabOrder&nbsp;=&nbsp;0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OnKeyPress&nbsp;=&nbsp;ComboBox1KeyPress<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OnSelect&nbsp;=&nbsp;ComboBox1Select<br>&nbsp;&nbsp;&nbsp;&nbsp;end<br>&nbsp;&nbsp;end<br>&nbsp;&nbsp;object&nbsp;Timer1:&nbsp;TTimer<br>&nbsp;&nbsp;&nbsp;&nbsp;Interval&nbsp;=&nbsp;10<br>&nbsp;&nbsp;&nbsp;&nbsp;OnTimer&nbsp;=&nbsp;Timer1Timer<br>&nbsp;&nbsp;&nbsp;&nbsp;Left&nbsp;=&nbsp;8<br>&nbsp;&nbsp;&nbsp;&nbsp;Top&nbsp;=&nbsp;48<br>&nbsp;&nbsp;end<br>end
 
楼上的代码我有了,但是如果单独设置hStdInput而保持原有hStdOutput却还是不行
 
后退
顶部