Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как узнать номера СОМ-портов компьютера? 
:(
    Опции темы
Yasim
Дата 29.3.2004, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 2.12.2003

Репутация: нет
Всего: нет



Люди, подскажите, как можно получить список номеров СОМ портов компьютера.
PM MAIL   Вверх
Alex
Дата 29.3.2004, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 80
Всего: 162



Лови
Код
unit Port;

interface

uses
 Windows, SysUtils, Classes, StdCtrls, VCLUtils;

 procedure SelectPort(n :Integer; Cmb: TComboBox);

implementation

type
 tComPortState = (csNotPresent,csAccessible,csNoAccessible);

function ComPortState (n :Integer) :tComPortState;
var h :tHandle;
begin
 h := CreateFile(pChar(Format('\\.\COM%d',[n])),     // name
                 GENERIC_READ or GENERIC_WRITE,      // access attributes
                 0,                                  // no sharing
                 nil,                                // no security
                 OPEN_EXISTING,                      // creation action
                 FILE_ATTRIBUTE_NORMAL or
                 FILE_FLAG_OVERLAPPED,               // attributes
                 0);                                 // no template
 if  h <> INVALID_HANDLE_VALUE  then begin
   // порт открыли
   Result := csAccessible;   // порт существует и доступен
   CloseHandle(h);           // закроем обратно :)
   end
 else if  GetLastError = ERROR_ACCESS_DENIED  then begin
   // порт не открыли по причине недоступности
   Result := csNoAccessible; // порт существует но недоступен
   end
 else begin
   // порт не открыли но не по причине недоступности
   Result := csNotPresent;   // порт несуществует
 end;
end;

const
 MaxComNum = 32;


procedure GetPortsList (List :tStrings);
 // Заполняет List списком портов
var n :Integer;
begin
 //if  List.Count > 0  then  Exit;
 StartWait;
 with  List  do try
   BeginUpdate;
   Clear;
   for n := 1 to MaxComNum do
     case ComPortState(n) of
       csNotPresent   :; // несуществующие порты нам неинтересны
       csAccessible   : AddObject('Com'+IntToStr(n)           , Pointer(n));
       csNoAccessible : AddObject('Com'+IntToStr(n)+' (занят)', Pointer(n));
     end;
 finally
   EndUpdate;
   StopWait;
 end;
end;

procedure SelectPort(n :Integer; Cmb: TComboBox);
var
 i :Integer;
begin
 with  Cmb.Items  do begin
   if  Count <= 0  then
     // список пуст, возможно еще не заполняли, сделаем это
     GetPortsList(Cmb.Items);
   // очистим список от несуществующих портов
   i := 0;
   while i < Count do
     if  Pos('(не существует)',Strings[i]) > 0  then
       Delete(i)
     else
       Inc(i);
   // получим индекс выбираемого порта в списке
   i := Cmb.Items.IndexOfObject(Pointer(n));
   // если выбираемый порт не существует, занесем его в список
   if  i < 0  then begin
     // причем вставить его надо с учетом сортировки, поищем куда
     i := 0;  while (i < Count) and (Integer(Objects[i]) < n)  do  Inc(i);
     // ну и вставим конечно
     InsertObject(i,'Com'+IntToStr(n)+' (не существует)', Pointer(n));
   end;
 end;
 // теперь выберем его
 Cmb.ItemIndex := i;
 // надо уведомить заинтересованных об изменении выбора
 //if  Assigned(ComboBox1.OnChange)  then  ComboBox1.OnChange(ComboBox1);
end;


end.



--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
Strike
Дата 7.4.2004, 18:55 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











procedure TfrmSetPort.FormCreate(Sender: TObject);
var reg: TRegistry;
ts:TStrings;
i: integer;
setiniFile: TIniFile;
begin
iniFileName:= Application.ExeName;
iniFileName:= ExtractWord(1,iniFileName,['.']);
iniFileName:= iniFileName+'.ini';
setiniFile := TIniFile.Create(iniFileName);
{считываем активные каналы}
chPort1.Checked:= setiniFile.ReadBool('Active Chanel','Chanel#1',false);
chPort2.Checked:= setiniFile.ReadBool('Active Chanel','Chanel#2',false);
chPort3.Checked:= setiniFile.ReadBool('Active Chanel','Chanel#3',false);
chPort4.Checked:= setiniFile.ReadBool('Active Chanel','Chanel#4',false);
{считываем номера портов}
cbPort1.Text:= setiniFile.ReadString('Port Name','Chanel#1','COM%');
cbPort2.Text:= setiniFile.ReadString('Port Name','Chanel#2','COM%');
cbPort3.Text:= setiniFile.ReadString('Port Name','Chanel#3','COM%');
cbPort4.Text:= setiniFile.ReadString('Port Name','Chanel#4','COM%');
cbStartRun.Checked:= setiniFile.ReadBool('Start at run application','RunStart',false);
case cbStartRun.Checked of //
true: begin
btnApplay.Click;
btnApplay.Enabled:=false;
end;
false: begin

end;
end; // case

setiniFile.Free;

{установка флагов в 0};
flagPort1:=0;
flagPort2:=0;
flagPort3:=0;
flagPort4:=0;
{заполение именами портов}
reg := TRegistry.Create;
reg.RootKey := HKEY_LOCAL_MACHINE;
reg.OpenKey('hardware\devicemap\serialcomm',false);
ts := TStringList.Create;
reg.GetValueNames(ts);
for i := 0 to ts.Count -1 do
begin
cbPort1.Items.Add(reg.ReadString(ts.Strings[i]));
cbPort2.Items.Add(reg.ReadString(ts.Strings[i]));
cbPort3.Items.Add(reg.ReadString(ts.Strings[i]));
cbPort4.Items.Add(reg.ReadString(ts.Strings[i]));
end;
ts.Free;
reg.CloseKey;
reg.free;
count_HSP_port1:=1;
lastHBCH1:=now;
flagErrorPort1:=0;
isOnLine1:= true;
end;
wink.gif
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0823 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.