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

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

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.05.2011, 16:55   #21
OlegVE
Форумчанин
 
Регистрация: 27.09.2010
Сообщений: 376
По умолчанию

Вот сделал... Добавка: См. следующий пост, - там лучше.
Функция генерации диапазона IP адресов
Код:
function GetIPrange(strS, strE : string): TStringList;
var
 IPStart, IPEnd : Int64;
 tmpStr : string;
 i  : Int64;
begin
 Result := TStringList.Create; // Это важно !!!
 Result.Delimiter := '.';
 Result.DelimitedText := strS;
 IPStart := StrToInt64(Format('%.3d%.3d%.3d%.3d',[StrToInt(Result[0]), StrToInt(Result[1]), StrToInt(Result[2]), StrToInt(Result[3])]));
 Result.Clear;
 Result.DelimitedText := strE;
 IPEnd   := StrToInt64(Format('%.3d%.3d%.3d%.3d',[StrToInt(Result[0]), StrToInt(Result[1]), StrToInt(Result[2]), StrToInt(Result[3])]));
 Result.Clear;

 if IPStart > IPEnd then
 begin
  ShowMessage('Начальный адрес больше конечного');
  exit;
 end;

 i  := IPStart;
 tmpStr := Format('%.12d', [i]);

 while i <= IPEnd do
 begin
  Result.Add(IntToStr(StrToInt(Copy(tmpStr, 1, 3)))+'.'+IntToStr(StrToInt(Copy(tmpStr, 4, 3)))+'.'+IntToStr(StrToInt(Copy(tmpStr, 7, 3)))+'.'+IntToStr(StrToInt(Copy(tmpStr, 10, 3))));
  Inc(i);
  tmpStr := Format('%.12d', [i]);
  if StrToInt(Copy(tmpStr, 10, 3)) = 256 then
  begin
   i := i-256+1000;
   if StrToInt(Copy(tmpStr,  7, 3)) = 255 then
   begin
    i := i-256000+1000000;
    if StrToInt(Copy(tmpStr,  4, 3)) = 255 then
    begin
     i := i-256000000+1000000000;
     if StrToInt(Copy(tmpStr,  1, 3)) = 255 then
     begin
      i := i-256000000000+1000000000000;
      if i > 999999999999 then
       i := i + IPEnd;
     end;
    end;
   end;
  end;
  tmpStr := Format('%.12d', [i]);
 end;
end;
Проверить можно так
Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
 ListBox1.Items.AddStrings(GetIPrange(Edit1.Text, Edit2.Text));
end;
Добавка
Я Вам в посте 7 писал
Цитата:
// Здесь сами генерируйте список
вот сюда и вставьте формирование списка, а не то, что Вы сделали.

Последний раз редактировалось OlegVE; 12.05.2011 в 14:44.
OlegVE вне форума Ответить с цитированием
Старый 12.05.2011, 12:27   #22
OlegVE
Форумчанин
 
Регистрация: 27.09.2010
Сообщений: 376
По умолчанию

А утром я проснулся...
Код:
function GetIPrange(strS, strE : string): TStringList;
var
 IPStart, IPEnd, tmpIP : Longword;
 tmpStr : string;
 c1 : byte;
 c2 : Longword;
begin
 IPStart := 0;
 IPEnd   := 0;

 Result := TStringList.Create; // Это важно !!!
 Result.Delimiter := '.';
 Result.DelimitedText := strS;

 for c1 := 0 to 3 do IPStart := IPStart*256 + StrToInt(Result[c1]);

 Result.Clear;
 Result.DelimitedText := strE;

 for c1 := 0 to 3 do IPEnd := IPEnd*256 + StrToInt(Result[c1]);

 Result.Clear;

 if IPStart > IPEnd then
 begin
  ShowMessage('Начальный адрес больше конечного'); exit;
 end;

 for c2 := IPStart to IPEnd do
 begin
  tmpStr := '';
  tmpIP  := c2;
  for c1 := 1 to 4 do
  begin;
    tmpStr  := IntToStr(tmpIP mod 256) + '.' + tmpStr;
    tmpIP := tmpIP div 256;
  end;
  SetLength(tmpStr, Length(tmpStr) -1);
  Result.Add(tmpStr);
 end;
end;
OlegVE вне форума Ответить с цитированием
Старый 12.05.2011, 14:26   #23
Aleksandr
Форумчанин
 
Регистрация: 22.05.2007
Сообщений: 511
По умолчанию

Использую вот этот код, но он не удаляет
Код:
 MyList := TStringList.Create;


     MyList.AddStrings(GetIPrange(MaskEdit1.Text, MaskEdit2.Text));


     MyList.Sort;
  ADOQuery1.Active:=false;
  ADOQuery1.SQL.Text := 'select IP from refbook Where IP>'+ quotedstr(MaskEdit1.Text) + ' AND IP<'+ quotedstr(MaskEdit2.Text);
  ADOQuery1.Active:=true;

  ADOQuery1.First;
  while not ADOQuery1.Eof do begin
 if MyList.Find(ADOQuery1.FieldByName('IP').AsString, Index) then MyList.Delete(Index); // почему-то не удаляет
    ADOQuery1.Next;
  end;
  MyList.SaveToFile('D:\123.dat');

  MyList.Free;
Aleksandr вне форума Ответить с цитированием
Старый 12.05.2011, 14:40   #24
OlegVE
Форумчанин
 
Регистрация: 27.09.2010
Сообщений: 376
По умолчанию

Здравствуйте
А у Вас в результате запроса ADOQuery1 точно есть хоть один адрес присутствующий в списке MyList? Может у Вас сразу ADOQuery1.Eof? Попробуйте использовать Trim(MaskEdit1.Text) и Trim(MaskEdit2.Text). Возможно надо добавить строку MyList.Sort; перед ADOQuery1.Next; в цикле.
До свидания

Последний раз редактировалось OlegVE; 12.05.2011 в 14:46.
OlegVE вне форума Ответить с цитированием
Старый 13.05.2011, 13:37   #25
Aleksandr
Форумчанин
 
Регистрация: 22.05.2007
Сообщений: 511
По умолчанию

Загружаю список в listBox1. Вот код
Код:
     MyList.AddStrings(GetIPrange(Trim(MaskEdit1.Text), Trim(MaskEdit2.Text)));


     MyList.Sort;
     listBox1.Items.Text:= MyList.Text;
Список отображается. Затем удаляю те значения которые совпадают, но здесь что-то не получается. Вот код
Код:
 ADOQuery1.First;

  while not ADOQuery1.Eof do
  begin
    Index:=listbox1.ItemIndex;
   if ADOQuery1.FieldByName('IP').AsString=ListBox1.Items.Strings[Index] then

 listbox1.Items.Delete(Index);
    ADOQuery1.Next;
  end;

  listbox1.Items.Text;
или вот еще один с циклом, но он тоже не удаляет
Код:
for i:=0 to ListBox1.Items.Count - 1  do
  begin


   if ADOQuery1.FieldByName('IP').AsString=ListBox1.Items.Strings[i] then

 listbox1.Items.Delete(i);
    ADOQuery1.Next;
  end;
  listbox1.Items.Text;
  MyList.Free;

Последний раз редактировалось Aleksandr; 13.05.2011 в 13:45.
Aleksandr вне форума Ответить с цитированием
Старый 13.05.2011, 14:40   #26
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А в поле IP точно данные в формате без незначащих нулей слева, без пробелов? Отобрази полученные запросом данные, посмотри что в нем. Есть ли вообще адреса из интервала?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 13.05.2011, 16:08   #27
Aleksandr
Форумчанин
 
Регистрация: 22.05.2007
Сообщений: 511
По умолчанию

Адреса есть. Вот бросил пример
Вложения
Тип файла: rar пример.rar (35.3 Кб, 6 просмотров)
Aleksandr вне форума Ответить с цитированием
Старый 13.05.2011, 16:32   #28
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

В StringList у вас данные пишутся в виде 192.168.23.2, а запросом из базы выбирается 192.168.23.02 Как вы думаете, есть такая строка в StringList? Вывод - перед поиском в StringList в данных полученных из базы нужно убрать незначащие нули

ADD Кстати, а интервал для поиска как задаётся, с нулями или без? Для упрощения жизни лучше всего в базе хранить без таких нулей и интервал без них задавать
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 13.05.2011 в 16:57.
Аватар вне форума Ответить с цитированием
Старый 13.05.2011, 17:06   #29
Gulik
Холост/Не замужем
Форумчанин
 
Аватар для Gulik
 
Регистрация: 13.11.2007
Сообщений: 283
По умолчанию

А зачем собственно нужен список не используемых IP?
Есть список используемых...
Gulik вне форума Ответить с цитированием
Старый 15.05.2011, 09:57   #30
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

1. Насчет хранения в базе адресов без незначащих нулей я был не совсем прав. С точки зрения СУБД строка "192.168.23.2" больше строки "192.168.23.125". Если эти адреса хранить в нормализованном виде "192.168.023.002" и "192.168.023.125", то такой проблемы не будет. При выборке из базы границы интервала тоже нужно задать в нормализованном виде. Ну и в StringList данные тоже должны записываться в этом же виде.
2. Я бы вообще пошел бы другим путем. Вместо одного символьного поля для хранения адреса использовал бы четыре цифровых поля для хранения отдельных элементов адреса. Проблем с незначащими нулями не стало бы. И дырки в списке адресов можно было бы получать непосредственно запросом, из Access не уверен, а из СУБД поддерживающих вложенные подзапросы можно
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 15.05.2011 в 10:16.
Аватар вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывести список файлов assch Общие вопросы C/C++ 1 21.10.2010 03:16
Delphi вывести на экран таблицу значений функции rager06 Помощь студентам 6 11.09.2010 15:51
Список уникальных значений PARTOS Microsoft Office Excel 13 18.12.2009 11:14
Раскрывающийся список значений, макросом. Flangini Microsoft Office Excel 13 22.06.2009 17:01
Элементы управления и список значений tomasmazas Microsoft Office Excel 1 26.12.2007 09:20