Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2002.02.21;
Скачать: [xml.tar.bz2];

Вниз

сортировка IP адресов и не только....   Найти похожие ветки 

 
Digitman   (2002-01-25 13:18) [7]


uses WinSock;

type
EIPSpellCheckError = class(Exception);

const
IllegalIP = "Недопустимое строковое представление адреса : %s";

function ParseIp(Address: String; InAddr: PInAddr): Boolean;
var
PartNum, PartValue, PartCharNum, DelimiterCount: Integer;
psrc: PChar;
pdst: PByteArray;
NextChar: Char;
begin
Result:= False;
InAddr.S_addr:= 0;
PartNum:= 0;
PartCharNum:= 0;
PartValue:= 0;
DelimiterCount:= 0;
Address:= Trim(Address);
psrc:= PChar(Address);
pdst:= PByteArray(InAddr);
while psrc^ <> #0 do begin
NextChar:= psrc^;
case NextChar of
"0".."9":
if PartNum <= 4 then
if PartCharNum < 3 then begin
if DelimiterCount > 0 then
DelimiterCount:= 0
else if PartNum = 0 then
Inc(PartNum);
Inc(PartCharNum);
PartValue:= PartValue * 10 + byte(NextChar) - byte("0");
if PartValue > 255 then
Exit;
end else
Exit
else
exit;
".":
if DelimiterCount = 0 then
if PartNum > 0 then begin
pdst[PartNum - 1]:= Byte(PartValue);
PartValue:= 0;
Inc(PartNum);
PartCharNum:= 0;
PartValue:= 0;
Inc(DelimiterCount);
end else
Exit
else
Exit;
else
Exit;
end;
Inc(psrc);
end;
if PartNum > 0 then begin
if DelimiterCount = 0 then
pdst[PartNum - 1]:= Byte(PartValue);
Result:= True;
end;
end;


function CompareAddresses(List: TStringList; Index1, Index2: Integer): Integer;
var
InAddr: TInAddr;
Addr1, Addr2: DWord;
begin
if ParseIp(List[Index1], @inaddr) then
Addr1:= ntohl(InAddr.S_addr)
else
raise EIPSpellCheckError.CreateFmt(IllegalIP, [List[Index1]]);
if ParseIp(List[Index2], @inaddr) then
Addr2:= ntohl(InAddr.S_addr)
else
raise EIPSpellCheckError.CreateFmt(IllegalIP, [List[Index2]]);
if Addr1 > Addr2 then
Result:= 1
else if Addr1 < Addr2 then
Result:= -1
else
Result:= 0
end;

procedure Test;
var
AddrList: TStringList;
i, k: Integer;
s: string;
begin
AddrList:= TStringList.Create;
try
for i:= 0 to 9 do begin
s:= "";
for k:= 1 to Random(4) + 1 do
s:= s + IntToStr(Random(256)) + ".";
AddrList.Add(s);
end;
AddrList.CustomSort(@CompareAddresses);
s:= "";
for i:= 0 to AddrList.Count - 1 do
s:= s + AddrList[i] + #10;
ShowMessage(s);
finally
AddrList.Free;
end;
end;



Вызови процедуру Test(), она сгенерирует список из десятка строк, имитирующих список неких произвольных заданных тобой IP-адресов (в указанном тобой формате), отсортирует их и выведет окно с результатами сортировки



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2002.02.21;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.004 c
3-66462
vano1
2002-01-25 15:01
2002.02.21
Кодировка


1-66587
Brand
2002-02-06 00:34
2002.02.21
Автозагрузка через реестр, SysTray


1-66511
BJValentine
2002-02-01 16:46
2002.02.21
Как это делается?


6-66631
Donal
2001-12-03 10:59
2002.02.21
RAS функции


3-66442
XX
2002-01-27 12:28
2002.02.21
как сделать поиск по DBGRID?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский