public array of THandle
WriteFile(aHandle[m],' 1 1c'+#239,6,dw_Write,@OverWrite) не работает.
А когда в главной форме описываю просто как Thandle и открываю только один порт, то все проходит нормально.
Как сделать, чтобы все работало.
В главной форме описываю массив как public и складываю в него Handle, открытых СОМ портов.
Пример кода в студию! В первую очередь, объявление в том, и в другом случае.
Пример кода в студию! В первую очередь, объявление в том, и в другом случае.
unit Gl;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, ExtCtrls, DB, DBTables,Registry;
type
TGl_Form = class(TForm)
MainMenu1: TMainMenu;
Oper: TMenuItem;
Timer_c: TTimer;
Timer_s: TTimer;
Timer_t: TTimer;
Timer_d: TTimer;
Timer_h: TTimer;
Uzel_Konv_Q: TQuery;
Uzel_Konv_QAKTIV: TStringField;
Uzel_Konv_QUZEL: TSmallintField;
Uzel_Konv_QKONV: TSmallintField;
Uzel_Konv_QCOM_PORT: TSmallintField;
Database1: TDatabase;
Uzel_Konv_Cur_Q: TQuery;
Uzel_Konv_Cur_QAKTIV: TStringField;
Uzel_Konv_Cur_QUZEL: TSmallintField;
Uzel_Konv_Cur_QKONV: TSmallintField;
Uzel_Konv_Cur_QCOM_PORT: TSmallintField;
Timer_Swor: TTimer;
procedure FormCreate(Sender: TObject);
procedure Timer_dTimer(Sender: TObject);
procedure Timer_hTimer(Sender: TObject);
procedure Timer_tTimer(Sender: TObject);
procedure Timer_cTimer(Sender: TObject);
procedure Timer_sTimer(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Timer_SworTimer(Sender: TObject);
private
{ Private declarations }
public
ss:TStringList;
stUzel_Konv:TStringList;
stUzel_Konv_Cur:TStringList;
st_Com_Port:TStringList;
l:integer;
l1:Integer;
l2:integer;
l3:integer;
reg:TRegistry;
aHandle:array of THandle;
{ Public declarations }
end;
var
Gl_Form: TGl_Form;
implementation
procedure TGl_Form.FormCreate(Sender: TObject);
var i:integer;
rez:string[2];
rez1:String[2];
rez2:String[1];
m:Integer;
Dcb:TDCB;
TimeOuts:COMMTIMEOUTS;
st:TStringList;
fHand:THandle;
begin
l:=0;
ss:=TStringList.Create; //ñòåê êîìàíä ïîðòó
stUzel_Konv:=TStringList.Create; //ñòåê âñåõ óçëîâ
stUzel_Konv_Cur:=TStringList.Create; // òåêóùèé óçåë
Uzel_Konv_Q.Close;
Uzel_Konv_Q.Open;
i:=0;
while not Uzel_Konv_Q.Eof do
begin
str(Uzel_Konv_QUZEL.AsInteger:2,rez);
str(Uzel_Konv_QKONV.AsInteger:2,rez1);
str(Uzel_Konv_QCOM_PORT.AsInteger:1,rez2);
stUzel_Konv.Add(rez+rez1+rez2);
Uzel_Konv_Q.Next;
i:=i+1;
end;
Uzel_Konv_Cur_Q.Close;
Uzel_Konv_Cur_Q.Open;
str(Uzel_Konv_Cur_QUZEL.AsInteger:2,rez);
str(Uzel_Konv_Cur_QKONV.AsInteger:2,rez1);
str(Uzel_Konv_Cur_QCOM_PORT.AsInteger:1,rez2);
stUzel_Konv_Cur.Add(rez+rez1+rez2);
reg:=TRegistry.Create;
reg.RootKey:=HKEY_LOCAL_MACHINE;
reg.OpenKey('hardware\devicemap\serialcomm',false);
st:=TStringList.Create;
reg.GetValueNames(st);
st_Com_Port:=TStringList.Create;
for m:=0 to st.Count-1 do
begin
st_Com_Port.Add(reg.ReadString(st.Strings[m]));
end;
SetLength(aHandle,st_Com_Port.Count);
for m:=0 to st_Com_Port.Count-1 do
begin
aHandle[m]:=CreateFile(PChar(st_Com_Port.Strings[m]),
GENERIC_READ or GENERIC_WRITE,0,nil,
OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0);
if aHandle[m]=INVALID_HANDLE_VALUE then
raise Exception.Create('Îøèáêà îòêðûòèå ïîðòà');
вот здесь уже начинается бяка!! при обращении aHandle[m]
if not GetCommState(aHandle[m],Dcb) then
raise Exception.Create('0022');
Dcb.BaudRate:=9600;
Dcb.Parity:=NOPARITY;
dcb.ByteSize:=8;
dcb.StopBits:=ONESTOPBIT;
if not SetCommState(aHandle[m],Dcb) then
raise Exception.Create('0033');
if not GetCommTimeouts(aHandle[m],TimeOuts) then
raise Exception.Create('0044');
TimeOuts.ReadIntervalTimeout:=MAXWORD;
TimeOuts.ReadTotalTimeoutMultiplier:=0;
TimeOuts.ReadTotalTimeoutConstant:=0;
if not SetCommTimeouts(aHandle[m],TimeOuts) then
raise Exception.Create('0055');
if not PurgeComm(aHandle[m],PURGE_TXCLEAR or PURGE_RXCLEAR) then
raise Exception.Create('0066');
end;
// Timer_c.Enabled:=True;
// Timer_s.Enabled:=true;
// Timer_t.Enabled:=true;
// Timer_d.Enabled:=true;
// Timer_h.Enabled:=true;
//Timer_Swor.Enabled:=true;
end;
procedure TGl_Form.Timer_SworTimer(Sender: TObject);
var
OverWrite:TOverlapped;
dw_Write:DWORD;
bc:DWORD;
ww:array[0..40] of Char;
TmpStr:String;
ll:integer;
pp:integer;
fhand:DWORD;
begin
Timer_Swor.Enabled:=false;
OverWrite.hEvent:=CreateEvent(nil,False,False,nil);
if OverWrite.hEvent=null then
raise Exception.Create('1111');
///// Здесь таже картина
WriteFile(ahandle[0],' 1 1c'+#239,6,dw_Write,@OverWrite);
if(WaitForSingleObject(OverWrite.hEvent,1000)=WAIT_OBJECT_0) then
GetOverlappedResult(aHandle[0],OverWrite,bc,True);
CloseHandle(OverWrite.hEvent);
OverWrite.hEvent:=CreateEvent(nil,False,False,nil);
if OverWrite.hEvent=null then
raise Exception.Create('2211');
bc:=0;
FillChar(ww,sizeof(ww),' ');
ReadFile(aHandle[0],ww,21,bc,@OverWrite);
if(WaitForSingleObject(OverWrite.hEvent,1000)=WAIT_OBJECT_0) then
GetOverlappedResult(aHandle[0],OverWrite,bc,True);
TmpStr:='';
TmpStr:=string(ww);
Timer_Swor.Enabled:=true;
end;
В случае переменной, то объявлена как
FHandl:THandle;
и по тексту элемент массива заменен на эту переменную.
вот здесь уже начинается бяка!! при обращении aHandle[m]
Давай следующую чайную ложку - как выглядит ошибка?
Давай следующую чайную ложку - как выглядит ошибка?
:D Спасибо!!! Я уже решила проблему, дело не в массиве, а в порядке записи портов в реестре.