Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 27.06.2008, 10:39
Raam Raam вне форума
Прохожий
 
Регистрация: 19.05.2008
Сообщения: 3
Репутация: 10
Восклицание передача функции имени объекта

я создал свой класс 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  
Старый 27.06.2008, 10:46
xchrom xchrom вне форума
Начинающий
 
Регистрация: 08.04.2008
Сообщения: 177
Репутация: 15
По умолчанию

так ты уже вроде и сам все написал, в чем проблема то?
Ответить с цитированием
  #3  
Старый 27.06.2008, 14:48
Аватар для Genry
Genry Genry вне форума
Начинающий
 
Регистрация: 14.04.2008
Адрес: с. Россия, г. Курган
Сообщения: 160
Версия Delphi: 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Raam
я создал свой класс 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 На мой взгляд не профессионально!
В классе Tcomport у тебя есть свойство Name?
Желательно исходник... я не очень понял.
*******************
* Используй тег [code] *
*******************
__________________
http://forceway.ru/
Ответить с цитированием
  #4  
Старый 28.06.2008, 11:19
voron_paa voron_paa вне форума
Прохожий
 
Регистрация: 26.01.2008
Сообщения: 49
Репутация: 10
По умолчанию

Используй события...
И выведи код класса...
Надо посмотреть что там у тя. Дабы дать диагноз..
Ответить с цитированием
  #5  
Старый 30.06.2008, 10:51
Raam Raam вне форума
Прохожий
 
Регистрация: 19.05.2008
Сообщения: 3
Репутация: 10
По умолчанию

//класс для порта
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  
Старый 30.06.2008, 11:24
Аватар для Genry
Genry Genry вне форума
Начинающий
 
Регистрация: 14.04.2008
Адрес: с. Россия, г. Курган
Сообщения: 160
Версия Delphi: 7
Репутация: 10
По умолчанию

Я уже говорил, следует использовать тег
__________________
http://forceway.ru/
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:47.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025