Maks150988
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору И еще, ребята, хотелось бы помощи в оптимизации части кода для программы. Вкратце: имеем строку с данными о маршруте вида 10.10.10.10 mask 255.255.255.255 (name) или вида 10.10.10.10 (name). Необходимо из такой строки выцепить адрес маршрута, его маску и название. Для тех кто не понял что имелось ввиду, поясню, Адрес - 10.10.10.10, маска - 255.255.255.255, название name. Раньше делал функцию для вытаскивания названия маршрута из такой строки. Первый неоптимизированный вариант скажем был таким: Код: function GetRouteNameFromString(StrPrs : String) : String; var Domen : String; I : Integer; P : Integer; begin Result := ''; // Удаляем из начальной строки последний символ (скобка после названия) Delete(StrPrs, Length(StrPrs), 1); // Проходимся по все строке и ищем начальную скобку перед названием P := -1; for I := Length(StrPrs) downto 1 do begin if StrPrs[I] = '(' then begin P := I; Break; end; end; // Если скобку нашли - получаем название из начальной строки if P <> -1 then Domen := Copy(StrPrs, P + 1, Length(StrPrs)); Result := Domen; end; | Потом переделал код и теперь функция такая: Код: function GetRouteNameFromString(S : String) : String; var I : Integer; begin // Удяляем из конца строки последний символ - закрывающую скобку // Она следует за названием маршрута и роли здесь не играет Delete(S, Length(S), 1); // Ищем позицию символа начальной скобки в строке, которую парсим I := Pos('(', S); // Копируем строку в результат с положения искомого символа скобки if I <> -1 then Result := Copy(S, I + 1, Length(S)); end; | Можно заметить что разница ощутима, при чем весьма. Теперь собственно нужно вытащить из такой строки адрес маршрута и его маску. Я сделал очень "грязно": проверял на буковку m и парсил, копируя в контрол SysIPAddress32 строку с начальными цифрами и вот что помещалось в него, обратно вычислял длину из этого и вычитал ее для маски. Получалось уж очень много лишних манипуляций... Вот старая неоптимизированная такая функция например: Код: { Обрабатываем строку для отображения только адреса и названия } procedure ParserStringGetListRoute1(StrPrs : String; hSys, hEdt : THandle); var Domen : String; Route : String; I : Integer; P : Integer; Temp : String; begin // Удаляем из начальной строки последний символ (скобка после названия) Delete(StrPrs, Length(StrPrs), 1); // Проходимся по всей строке и ищем начальную скобку перед названием P := -1; for I := Length(StrPrs) downto 1 do begin if StrPrs[I] = '(' then begin P := I; Break; end; end; // Если скобку нашли - получаем название из начальной строки if P <> -1 then Domen := Copy(StrPrs, P + 1, Length(StrPrs)); // Приравниваем начальную строку в строке маршрута Route := StrPrs; // Удаляем название из строки, включая 2 последних символа (две скобки из маршрута) Delete(Route, Length(StrPrs) - Length(Domen) - 1, Length(Domen) + 2); // Выводим полученные результаты в элементы управления SysIP32_SetText(hSys, PChar(Route)); // Получаем точный адрес первого адреса для дальнейшего подсчета его длины Temp := SysIP32_GetText(hSys); // Выводим в первый контрол точный адрес SysIP32_SetText(hSys, PChar(Temp)); // Выводим в третий контрол точное название SendMessage(hEdt, WM_SETTEXT, 0, Integer(PChar(Domen))); end; { Обрабатываем строку для отображения адреса, маски и названия } procedure ParserStringGetListRoute2(StrPrs : String; hSys1, hSys2, hEdt : THandle); var Domen : String; Route1 : String; Route2 : String; I : Integer; P : Integer; Temp : String; begin // Удаляем из начальной строки последний символ (скобка после названия) Delete(StrPrs, Length(StrPrs), 1); // Проходимся по всей строке и ищем начальную скобку перед названием P := -1; for I := Length(StrPrs) downto 1 do begin if StrPrs[I] = '(' then begin P := I; Break; end; end; // Если скобку нашли - получаем название из начальной строки if P <> -1 then Domen := Copy(StrPrs, P + 1, Length(StrPrs)); // Приравниваем начальную строку в строке маршрута Route1 := StrPrs; // Удаляем название из строки, включая 2 последних символа (две скобки из маршрута) Delete(Route1, Length(StrPrs) - Length(Domen) - 1, Length(Domen) + 2); // Выводим полученные результаты в элементы управления SysIP32_SetText(hSys1, PChar(Route1)); // Получаем точный адрес первого адреса для дальнейшего подсчета его длины Temp := SysIP32_GetText(hSys1); // Копируем с заданной позиции (число символов адреса + 1 для смещения + 6 для длины слова " mask ") Route2 := Copy(Route1, (Length(Temp) + 1) + 6, Length(Route1)); // Выводим в первый контрол точный адрес SysIP32_SetText(hSys1, PChar(Temp)); // Выводим во второй контрол точный адрес SysIP32_SetText(hSys2, PChar(Route2)); // Выводим в третий контрол точное название SendMessage(hEdt, WM_SETTEXT, 0, Integer(PChar(Domen))); end; | Собственно необходима помощь в оптимизации этих 2 функций. Или хотя бы желательно помощь со второй, что-то все никак не придумывается способ корректно-правильного вытаскивания маски из строки без копирования в контрол с последующим опять его выдиранием из него... |