![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() я создал свой класс Tcomport и создал 2 объекта класса port_m и potr_s;
существует процедура вне класса, которая использует процедуры ккласса Tcomport EXAMPLE PROCEDURE ANALIZ; begn port_m.procedure1; port_m.procedure2; end; ВОПРОС: КАК мне переделать эту процедуру к виду procedure analiz(port_:Tcomport); begin port_.procedure1; ... end; чтобы использовать эту мроцедуру для любых объектов класса и как передать имя объекта в эту процедуру. Если не понятен вопрос - могу вывесить исходники! помогите пожалуйста, а то писать в нутри процедуры какие нить if then else На мой взгляд не профессионально! |
#2
|
|||
|
|||
![]() так ты уже вроде и сам все написал, в чем проблема то?
|
#3
|
||||
|
||||
![]() Цитата:
Желательно исходник... я не очень понял. ******************* * Используй тег [code] * ******************* http://forceway.ru/ ![]() |
#4
|
|||
|
|||
![]() Используй события...
И выведи код класса... Надо посмотреть что там у тя. Дабы дать диагноз.. |
#5
|
|||
|
|||
![]() //класс для порта
TComPort = class constructor createC(NameP:string); destructor destroyC; private InBuffer : array[0..1023] of Char; dcb:Tdcb; //настройка порта ct: TCommTimeouts; //настройка времени Panswer:string; procedure analaize(rezT:string); public ComPort:THandle; property answer:string read Panswer write analaize; Procedure WritePort(commandT:string); Procedure ReadPort; end; var comThread:TcomThread; implementation uses UMain,Uanaliz; //запуск потока procedure TcomThread.Execute; begin Repeat Port.ReadPort; Until Terminated; end; //*************Описание класса для компорта******* //создание порта и запуск потока constructor Tcomport.CreateC(NameP:string); begin ComPort:= CreateFile(PChar(NameP),GENERIC_WRITE+GENERIC_READ , 0,nil,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,0); if ComPort = INVALID_HANDLE_VALUE then showmessage ('Устройтсво не обнаружено'); Windows.SetupComm(ComPort, 2048, 2048);// then showmessage(''); GetCommState(ComPort, dcb); with dcb do begin BaudRate := 9600; ByteSize := 8; Parity := NOPARITY; StopBits := ONESTOPBIT; // одиночный стоп-бит Flags := EV_RXCHAR + EV_EVENT2; end; setCommState(ComPort, dcb); //смена настроек порта with ct do begin ReadTotalTimeoutConstant := 50; ReadIntervalTimeout := 50; ReadTotalTimeoutMultiplier := 1; WriteTotalTimeoutMultiplier := 0; WriteTotalTimeoutConstant := 10; end; SetCommTimeouts(comport, ct); //смена таймингов //запуск потока на чтение comThread := TcomThread.Create(false); //************ end; //деструктор (Обрывает поток и закрывает порт) destructor Tcomport.destroyC; begin comThread.Terminate; CloseHandle(ComPort);//закрыть файл end; //запись в порт Procedure Tcomport.WritePort(commandT:string); var NumberWritten:cardinal;commandP:string; begin NumberWritten:=0; commandP:=commandT + #13 + #10; if WriteFile(Comport,PChar(commandP)^, Length(commandP),NumberWritten, nil) = false then ShowMessage('Unable to write to ' + POrtname); //отчистить буфер PurgeComm(Comport, PURGE_TXCLEAR + PURGE_RXCLEAR); end; //Чтение из порта procedure TComPort.ReadPort; var BytesRead:cardinal; tempAnswer:String;i:integer; begin if ReadFile(Comport,InBuffer,SizeOf(InBuffer),BytesRe ad,nil) then begin for i:=0 to (BytesRead-1) do tempAnswer:=tempAnswer+InBuffer[i]; end; //Очистка пота PurgeComm(Comport, PURGE_TXCLEAR + PURGE_RXCLEAR); if BytesRead<>0 then answer := Trim(tempAnswer); //trim - убирает слева и справа все пробелы end; //функция анализа procedure TcomPort.analaize(rezT:string); var i:integer;l:string;//l для отладки begin Panswer:=rezT; //временно for i:=1 to length(answer) do l:=l+inttostr(i); FMain.Memo1.Lines.Add(l); FMain.Memo1.Lines.Add(answer); //******** if answer='RING' then DMAnalize.AnalaizeCall; if copy(answer,1,11) = '+CMTI: "MT"' then DMAnalize.AnalaizeSMS(answer); end; ВОТ ТУТ ПРОБЛЕМА: КАК В ФУНКЦИЮ DMAnalize.AnalaizeCall ПЕРЕДАТЬ ИМЯ ОБЪЕКТА, А ИХ 2:PORT И PORT_S, ЧТОБЫ ИЗБЕЖАТЬ СЛЕДУЮЩЕГО: 1. дАННАЯ ФУНКЦИЯ РАБОТАТЕТ ТОЛЬКО С PORT, А Я ХОЧУ ЧТОБЫ ОНА РАБОТАЛА C ТЕМ ПОРТОМ - ИМЯ КОТОРОГО ЕЙ ПЕРЕДАТЬ (AnalaizeCall(poRT_:tCOMPORT)) - Я НЕ МОГУ ПЕРЕДАТЬ ИМЯ В ФУНКЦИЮ - БОНАЛЬНО НАМЕ ГОВОРИТ ЧТО РАЗНЫЕ ТИПЫ procedure TDMAnalize.AnalaizeCall; var mesag:string; begin comThread.Terminate;//1.оставноить поток на считывание Port.WritePort('AT+clcc');//определение номера Port.ReadPort; //поиск номера в базе phonenumber:=copy(POrt.answer,21,10); with ADOQnamber do begin SQL.Text:='select * from abonent where TelephoneE="'+phonenumber+'"'; Active:=true; if RecordCount <> 1 {отсутствует в базе} then begin POrt.WritePort('ATH'); //Umain.GridColor:='Y'; выделение цветтом различных групп событий mesag:='Попытка несанкционированного доступа (ЗВОНОК) от номера 8'+ phonenumber; end else begin POrt.WritePort('ATA'); sleep(1000);{длительность звонка} POrt.WritePort('ATH'); mesag:='Сработка сигнализации по адресу '+ ADOQnamber.FieldByName('Adress').AsString; TimeAlarm:=(DateToStr(date)+' '+TimeToStr(Time));//глобальная памаять на последнюю сработку Timer.Enabled:=true end; end; comThread := TcomThread.Create(false); //запуск потока на считывания with ADOQEvents do //запись сообщения begin Active:=true; Insert; FieldByName('EvPhonenumber').AsString:=phonenumber ; FieldByName('Message').AsString:='Call'; FieldByName('date').AsDateTime:=StrToDateTime(Date ToStr(date)+' '+TimeToStr(Time)); Post; Active:=false; end; ADOQnamber.Active:=false; with Fmain.SGINF do begin Cells[0,Fmain.SGINF.RowCount-1]:=TimeToStr(Time)+' '+DateToStr(date); Cells[1,Fmain.SGINF.RowCount-1]:=mesag+' ЗВОНОК'; RowCount:=Fmain.SGINF.RowCount+1; Perform(WM_VScroll,SB_LINEDOWN,0); end; |
#6
|
||||
|
||||
![]() Я уже говорил, следует использовать тег
http://forceway.ru/ ![]() |