Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.11.2016, 11:41   #1
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
Вопрос Освободить порт в массиве

Имеется
Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    BP3: TButton;
    BP1: TButton;
    Edit1: TEdit;
    Label1: TLabel;
    BP2: TButton;
    Edit2: TEdit;
    Label2: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure BP3Click(Sender: TObject);
    procedure BP1Click(Sender: TObject);
    procedure BP2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
  TPorts = Record
    Port: Integer;
    Available: Boolean;
  end;

var
  Form1: TForm1;
  Ports: Array[1..6] of TPorts;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  I: Integer;
begin
  // Создадим массив с портами для передачи файлов (1000-1005)
  for I := 1 to Length(Ports) do
  begin
    Ports[I].Port := 999 + I;
    Ports[I].Available := True;
  end;
end;

procedure TForm1.BP1Click(Sender: TObject);
  procedure TakePort(Port: Integer);
  var
    I: Integer;
  begin
    for I := 1 to Length(Ports) do
    begin
      if Ports[I].Port = Port then
      begin
        Ports[I].Available := False;
        Break;
      end;
    end;
  end;
begin
  TakePort(StrToIntDef(Edit1.Text, -1));
end;

procedure TForm1.BP2Click(Sender: TObject);
  procedure ReleasePort(Arr: Array of TPorts; Port: Integer);
  var
    I: Integer;
  begin
    for I := 1 to Length(Arr) do
    begin
      if Arr[I].Port = Port then
      begin
        Arr[I].Available := True;
        Break;
      end;
    end;
  end;
begin
  ReleasePort(Ports, StrToIntDef(Edit1.Text, -1));
end;

procedure TForm1.BP3Click(Sender: TObject);
  function GetPort: Integer;
  var
    I: Integer;
  begin
    Result := -1;

    for I := 1 to Length(Ports) do
    begin
      if Ports[I].Available then
      begin
        Result := Ports[I].Port;
        Break;
      end;
    end;
  end;
begin
  ShowMessage(IntToStr(GetPort));
end;

end.
Процедура освобождения порта ReleasePort при первом входе в цикл
Код:
if Arr[I].Port = Port then
начинает проверку сразу с 1001 порта вместо 1000
Так
Код:
  procedure ReleasePort(Arr: Array of TPorts; Port: Integer);
  var
    I: Integer;
  begin
    for I := 0 to Length(Arr) - 1 do
    begin
      if Arr[I].Port = Port then
      begin
        Arr[I].Available := True;
        Break;
      end;
    end;
  end;
самый первый порт (1000) хоть и попадает под проверку, но не освобождается
Shouldercannon вне форума Ответить с цитированием
Старый 06.11.2016, 12:21   #2
kropotkina-alice
Форумчанин
 
Аватар для kropotkina-alice
 
Регистрация: 27.10.2014
Сообщений: 594
По умолчанию

Ну посмотрите внимательно - как это стыкуется???
Код:
Ports: Array[1..6] of TPorts;
и
Код:
for I := 0 to Length(Arr) - 1 do
Ведь до последнего момента у вас было верно:
Код:
for I := 1 to Length(Ports) do
kropotkina-alice вне форума Ответить с цитированием
Старый 06.11.2016, 12:38   #3
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

При 1 to длина массива первый порт не захватывается, сразу с 1001 проверка идёт
Shouldercannon вне форума Ответить с цитированием
Старый 06.11.2016, 13:02   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
ReleasePort(Arr: Array of TPorts; Port: Integer);
А зачем массив параметром передаешь? Он же и так у тебя глобальный и доступен всему чему не лень.
Цитата:
самый первый порт (1000) хоть и попадает под проверку, но не освобождается
А чего ему освобождаться? Передана копия массива и изменения в процедуре не отразятся на источнике
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 06.11.2016 в 13:08.
Аватар вне форума Ответить с цитированием
Старый 06.11.2016, 13:05   #5
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
А зачем массив параметром передаешь? Он же и так у тебя глобальный и доступен всему чему не лень.
Хотел перенести данную процедуру во внутрь другой, но понял, что это плохое решение
Shouldercannon вне форума Ответить с цитированием
Старый 06.11.2016, 13:13   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
type
  TPorts = Record
    Port: Integer;
    Available: Boolean;
  end;
  TMyArray = Array[1..6] of TPorts;

var
  Form1: TForm1;
  Ports: TMyArray;

procedure ReleasePort(var Arr: TMyArray; Port: Integer);

for I := 0 to Length(Arr) - 1 do
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 06.11.2016, 13:41   #7
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

В самый раз
Shouldercannon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
установил phpstorm, он занял порт 80, и не запускается openserver " Невозможно занять порт 80 поскольку он уже используется victorshkoda PHP 5 07.04.2016 10:04
Освободить занятые COM порты Crystallon Общие вопросы Delphi 2 26.09.2015 00:43
Освободить память формы st_yak C++ Builder 0 21.12.2013 19:56
label динамически освободить grafgrial Общие вопросы Delphi 5 07.09.2011 07:59
освободить СОМ порт varelik Общие вопросы Delphi 11 11.02.2010 21:49