![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Работа с компонентом AsyncProfessional [D7, WinXP]
Kolan © (2006-04-06 14:09:00)Здравствуйте,
Использую компонент для работы с портом из этого пакета. Никак не могу открыть порт... Не занете как это сделать?
Там есть ф-ция Open, но она возврашает False, а при попытке записать что-то получаю исключение - устройство не открыто...
Kolan (2006-04-07 12:28:00) [1]
Вообще-то там два пакета: RTL и DTL.
Да я знаю. Я поставил DTL
Германн (2006-04-06 15:30:00) [2]
> Устанавливал так. Нашел файл - *.dpk Открыл в Delphi, сделал
> Install
Вообще-то там два пакета: RTL и DTL.
А бродить по закоулкам их кода - нелёгкое дело. :-(
Попробуй поставить номер порта 0 и брейкпойнт на функцию IsPortAvailable из AdSelCom.
Kolan (2006-04-06 15:19:00) [3]Перекомпилить компонент с отладочной инфой и пройтись по Open() пошагово в отладчике - такая мысль не посещала ?
Тут проблемма. Может я компонент не так истановил... Он не заходит в этот метод. Хотя исходники есть...
Устанавливал так. Нашел файл - *.dpk Открыл в Delphi, сделал Install
Сергей М. (2006-04-06 14:55:00) [4]
> Open - это св-во
> Там есть ф-ция Open,
Ты уж опоределись как-нибудь, что есть св-во, а что есть метод ..
Мда ... я предполагал, что там все значительно проще ...
Тут одной цитатой одного метода не обойдешься ..
Справка что по этому поводу говорит ?
Перекомпилить компонент с отладочной инфой и пройтись по Open() пошагово в отладчике - такая мысль не посещала ?
Kolan (2006-04-06 14:47:00) [5]Легко сказать.
Open - это св-во.
procedure TApdCustomComPort.SetOpen(const Enable : Boolean);
{-Open/close the port}
begin
if FOpen <> Enable then begin
if not (csDesigning in ComponentState) and
not (csLoading in ComponentState) then begin
if Enable then begin
if (PortState = psClosed) then
InitPort
else
OpenPending := True;
end else begin
DonePort;
end;
end else begin
FOpen := Enable;
if Enable then
ForceOpen := True;
end;
end;
end;
Вот тут я думаю все и происходит...
procedure TApdCustomComPort.InitPort;
{-Physically open the comport}
var
Res : Integer;
nBaud : LongInt;
nParity : Word;
nDataBits : TDatabits;
nStopBits : TStopbits;
nHWOpts, nSWOpts, nBufferFull, nBufferResume : Cardinal;
nOnChar, nOffChar : Char;
begin
{ Validate the comport -- not needed for Tapi }
if TapiMode <> tmOn then
ValidateComport;
{ Activate the specified device layer }
FDispatcher := ActivateDeviceLayer;
FDispatcher.DeviceName := Format('COM%d', [ComNumber]);
try
{ Get line parameters that Tapi set }
if TapiMode = tmOn then begin
if ValidDispatcher.ComHandle = 0 then
CheckException(Self, ecNotOpenedByTapi);
FDispatcher.GetLine(nBaud, nParity, nDataBits, nStopBits);
FDispatcher.GetFlowOptions(nHWOpts, nSWOpts, nBufferFull,
nBufferResume, nOnChar, nOffChar);
{ Sync our properties with those set by Tapi }
FBaud := nBaud;
FParity := TParity(nParity);
FDataBits := Ord(nDataBits);
FStopBits := Ord(nStopBits);
FHWFlowOptions := [];
if (nHWOpts and hfUseDTR) <> 0 then
Include(FHWFlowOptions, hwfUseDTR);
if (nHWOpts and hfUseRTS) <> 0 then
Include(FHWFlowOptions, hwfUseRTS);
if (nHWOpts and hfRequireDSR) <> 0 then
Include(FHWFlowOptions, hwfRequireDSR);
if (nHWOpts and hfRequireCTS) <> 0 then
Include(FHWFlowOptions, hwfRequireCTS);
FSWFlowOptions := TSWFlowOptions(nSWOpts);
FXOnChar := nOnChar;
FXOffChar := nOffChar;
end;
Res := InitializePort;
{$IFDEF Win32}
{Remap access denied and file not found errors}
if Res = ecAccessDenied then
Res := ecAlreadyOpen
else if (Res = ecFileNotFound) or (Res = ecPathNotFound) then
Res := ecBadId;
{$ENDIF}
if (Res = ecOk) then begin
{Handle preset properties}
PortState := psOpen;
UpdateHandlerFlag;
Force := True;
SetTracing(Tracing);
SetLogging(Logging);
SetHWFlowOptions(HWFlowOptions);
SetSWFlowOptions(SWFlowOptions);
SetXOnChar(FXonChar);
SetXOffChar(FXoffChar);
SetTriggerLength(FTriggerLength);
SetDTR(FDTR);
if DeviceLayer <> dlFossil then
SetRTS(FRTS);
SetUseMSRShadow(FUseMSRShadow);
SetUseEventWord(FUseEventWord);
SetCommNotificationLevel(FCommNotificationLevel);
SetRS485Mode(FRS485Mode);
{$IFDEF Win32}
SetThreadBoost(FThreadBoost);
{$ENDIF}
Force := False;
FOpen := True;
{Prepare for triggers}
RegisterComPort(True);
{Add pending triggers}
if CopyTriggers then begin
CopyTriggers := False;
FDispatcher.RestoreTriggers(SaveTriggerBuffer);
end;
{Send OnPortEvent}
PortOpen;
end else
CheckException(Self, Res);
except
FOpen := False;
PortState := psClosed;
FDispatcher.Free;
FDispatcher := nil;
raise;
end;
end;
Сергей М. (2006-04-06 14:34:00) [6]Значит, CreateFile() - не последний API-вызов в теле Open() ..
Приводи его код ...
Kolan (2006-04-06 14:29:00) [7]1447 - Окно не имеет полос прокрутки..... И что...
Ненавижу эти компоненты, еслибы не RS485...
Сергей М. (2006-04-06 14:22:00) [8]Если не поможет, привети сюда текст тела метода Open()
Сергей М. (2006-04-06 14:21:00) [9]SysErrorMessage(GetLasterror)
Kolan (2006-04-06 14:19:00) [10]1447
Чтобы в строку преобразовать кажется FormatMessage нужно использовать?
Сергей М. (2006-04-06 14:16:00) [11]
> она возврашает False
Что говорит GetLastError() при этом ?