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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.06.2011, 16:14   #1
Aleksandr
Форумчанин
 
Регистрация: 22.05.2007
Сообщений: 511
По умолчанию Перебрать все значения столбца по условию.

Есть таблица со столбцами num и IP. По столбцу IP Если num = труе идет пинг который я поместил в поток. Но у меня почему-то берет только то значение где находится курсор, как перебрать все значения IP где num = труе ?
Вот модуль потока
Код:
unit MyThread1;


interface

uses
  Classes,WinSock,Windows,Messages,Dialogs,SysUtils;
type
IPINFO = record
Ttl :char;
Tos :char;
IPFlags :char;
OptSize :char;
Options :^char;
end;

type
ICMPECHO = record
Source :longint;
Status :longint;
RTTime :longint;
DataSize:Shortint;
Reserved:Shortint;
pData :^variant;
i_ipinfo:IPINFO;
end;

TIcmpCreateFile =
  function():integer; {$IFDEF WIN32} stdcall; {$ENDIF} 
TIcmpCloseHandle =
  procedure(var handle:integer);{$IFDEF WIN32} stdcall; {$ENDIF} 
TIcmpSendEcho =
  function(var handle:integer; endereco:DWORD; buffer:variant;
  tam:WORD; IP:IPINFO; ICMP:ICMPECHO; tamicmp:DWORD;
  tempo:DWORD):DWORD;{$IFDEF WIN32} stdcall; {$ENDIF} 

type
  TCountObj = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
  end;

implementation

uses Main;


procedure TCountObj.Execute;
var
wsadt : wsadata;
icmp :icmpecho;
HNDicmp : integer;
hndFile :integer;
Host :PHostEnt;
Destino :in_addr;
Endereco :^DWORD;
IP : ipinfo;
Retorno :integer;
dwRetorno :DWORD;
x :integer;

IcmpCreateFile : TIcmpCreateFile;
IcmpCloseHandle : TIcmpCloseHandle;
IcmpSendEcho : TIcmpSendEcho;

 i:Integer;

begin



 MainForm.ADOTable1.Refresh;
 //  MainForm.ADOQuery1.Active:=false;
 // MainForm.ADOQuery1.SQL.Clear;
//   MainForm.ADOQuery1.SQL.Text := 'select * from refbook' +
//    ' where num=true' +' and Id='+MainForm.DbText1.Caption;
//  MainForm.ADOQuery1.Open;
//  MainForm.ADOQuery1.Active:=true;
//  MainForm.ADOQuery1.Refresh;
  MainForm.ADOTable1.Edit;



// Работа с таблицей

 For i:=0 to MainForm.DbGrid2.Columns.Count-1 do begin

if (MainForm.DBGrid2.DataSource.DataSet.FieldByName('num').AsBoolean = false) then
exit
else
begin

if (MainForm.DBGrid2.DataSource.DataSet.FieldByName('IP').Text = '') then begin

showmessage('Digite um HostName ou um End. IP');
exit;
end;

HNDicmp := LoadLibrary('ICMP.DLL');
if (HNDicmp <> 0) then begin 
@IcmpCreateFile := GetProcAddress(HNDicmp,'IcmpCreateFile'); 
@IcmpCloseHandle := GetProcAddress(HNDicmp,'IcmpCloseHandle');
@IcmpSendEcho := GetProcAddress(HNDicmp,'IcmpSendEcho');
if (@IcmpCreateFile=nil) or (@IcmpCloseHandle=nil) or
   (@IcmpSendEcho=nil) then begin
showmessage('Erro pegando endereзos ICMP');
FreeLibrary(HNDicmp);
end;
end; 
Retorno := WSAStartup($0101,wsadt); 

if (Retorno <> 0) then begin 
showmessage('N-гo foi possнvel carregar WinSockets');

WSACleanup();
FreeLibrary(HNDicmp); 
end;

Destino.S_addr := inet_addr(Pchar(MainForm.DBGrid2.DataSource.DataSet.FieldByName('IP').Text));
if (Destino.S_addr = 0) then begin 
Host := GetHostbyName(PChar(MainForm.DBGrid2.DataSource.DataSet.FieldByName('IP').Text));
end 
else begin
Host := GetHostbyAddr(@Destino,sizeof(in_addr), AF_INET); 
end; 

if (host = nil) then begin


MainForm.ADOTable1.FieldByName('Время_ост').AsString := TimeToStr(now);

WSACleanup();
FreeLibrary(HNDicmp); 
exit; 
end;


Endereco := @Host.h_addr_list;

HNDFile := IcmpCreateFile();
for x:= 0 to 4 do begin
Ip.Ttl := char(255); 
Ip.Tos := char(0); 
Ip.IPFlags := char(0);
Ip.OptSize := char(0); 
Ip.Options := nil; 

//dwRetorno := IcmpSendEcho(HNDFile,Endereco^,null,0,Ip,Icmp,sizeof(Icmp),DWORD(5000));
Destino.S_addr := icmp.source;

MainForm.ADOTable1.FieldByName('Время_пуск').AsString := TimeToStr(now);

end;
 end;
  if terminated then

   exit;
//  end;
MainForm.ADOTable1.Post;

// MainForm.ADOQuery1.Active:=false;
//   MainForm.ADOQuery1.Refresh;
end;
 end;
end.
Aleksandr вне форума Ответить с цитированием
Старый 22.06.2011, 16:30   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Для перебора всех записей обычно используется конструкция:
Код:
DataSet.First;
while not DataSet.Eof do begin
  if ... then begin
    ...
  end;
  DataSet.Next;
end;
И если Grid через DataSource нацелен на этот DataSet - зачем колонки грида перебирать, если все данные есть в полях DataSet-а?

+ При скроллинге по DataSet в потоке будет прорисовка грида на форме выполняться, а это чревато, синхронизировать надо
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 22.06.2011 в 16:43.
Аватар вне форума Ответить с цитированием
Старый 22.06.2011, 16:30   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А я бы на твоем месте получил запросов все у которых num = true и в цикле отфетчил бы:
Код:
... select ip from ... where num=true...
with ADOQuery do
 while not eof do begin
   Пингуем по fieldByName('IP').AsString;
   
   next;
 end;
Понятна мысль?
Цитата:
HNDicmp := LoadLibrary('ICMP.DLL');
Это внутри цикла??? Выводи его за пределы цикла.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.06.2011, 16:57   #4
Aleksandr
Форумчанин
 
Регистрация: 22.05.2007
Сообщений: 511
По умолчанию

Сделал через запрос и вынес HNDicmp := LoadLibrary('ICMP.DLL'); , но никакого результата
Код:
if (MainForm.DBGrid2.DataSource.DataSet.FieldByName('IP').Text = '') then begin

showmessage('Digite um HostName ou um End. IP');
exit;
end;

HNDicmp := LoadLibrary('ICMP.DLL');

MainForm.ADOTable1.Refresh;
   MainForm.ADOQuery1.Active:=false;
  MainForm.ADOQuery1.SQL.Clear;
   MainForm.ADOQuery1.SQL.Text := 'select * from refbook' +
   ' where num=true' +' and Id='+MainForm.DbText1.Caption;
  MainForm.ADOQuery1.Open;
 MainForm.ADOQuery1.Active:=true;
  MainForm.ADOQuery1.Refresh;
  MainForm.ADOTable1.Edit;


with MainForm.ADOQuery1 do
 while not eof do begin

if (HNDicmp <> 0) then begin 
@IcmpCreateFile := GetProcAddress(HNDicmp,'IcmpCreateFile'); 
@IcmpCloseHandle := GetProcAddress(HNDicmp,'IcmpCloseHandle');
@IcmpSendEcho := GetProcAddress(HNDicmp,'IcmpSendEcho');
if (@IcmpCreateFile=nil) or (@IcmpCloseHandle=nil) or
   (@IcmpSendEcho=nil) then begin
showmessage('Erro pegando endereзos ICMP');
FreeLibrary(HNDicmp);
end;
end; 
Retorno := WSAStartup($0101,wsadt);

if (Retorno <> 0) then begin 
showmessage('N-гo foi possнvel carregar WinSockets');

WSACleanup();
FreeLibrary(HNDicmp); 
end;

Destino.S_addr := inet_addr(Pchar(  MainForm.ADOQuery1.DataSource.DataSet.FieldByName('IP').Text));
if (Destino.S_addr = 0) then begin 
Host := GetHostbyName(PChar(  MainForm.ADOQuery1.DataSource.DataSet.FieldByName('IP').Text));
end 
else begin
Host := GetHostbyAddr(@Destino,sizeof(in_addr), AF_INET); 
end; 

if (host = nil) then begin


MainForm.ADOTable1.FieldByName('Время_ост').AsString := TimeToStr(now);

WSACleanup();
FreeLibrary(HNDicmp); 
exit;
end;


Endereco := @Host.h_addr_list;

HNDFile := IcmpCreateFile();
for x:= 0 to 4 do begin
Ip.Ttl := char(255); 
Ip.Tos := char(0); 
Ip.IPFlags := char(0);
Ip.OptSize := char(0); 
Ip.Options := nil; 

//dwRetorno := IcmpSendEcho(HNDFile,Endereco^,null,0,Ip,Icmp,sizeof(Icmp),DWORD(5000));
Destino.S_addr := icmp.source;

MainForm.ADOTable1.FieldByName('Время_пуск').AsString := TimeToStr(now);

 MainForm.ADOTable1.Post;

 MainForm.ADOQuery1.Active:=false;
   MainForm.ADOQuery1.Refresh;

Next;
end;
 end;
  if terminated then

   exit;
 end;
Aleksandr вне форума Ответить с цитированием
Старый 22.06.2011, 17:48   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Вы сами, когда смотрите на исходник, ориентируетесь по быстрому, где какой блок begin-end начинается и заканчиваеися? Пробелами трудно выровнять слева и отсупами вложенность показать? Вы себе кучу времени этим сэкономите.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 23.06.2011, 11:39   #6
Aleksandr
Форумчанин
 
Регистрация: 22.05.2007
Сообщений: 511
По умолчанию

Что-то не получается. выбор работает, а не записывает время остановки и время пуска в колонки Время_пуск и Время_ост
Aleksandr вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi перебрать все символы из Edit AdDa Помощь студентам 2 06.06.2011 09:19
перебрать все CheckBox Aleksandr Microsoft Office Excel 21 03.03.2011 17:01
Как программно перебрать в цикле все формы в приложении? chandrasecar Общие вопросы Delphi 18 11.09.2009 12:14
как перебрать все элементы на форме? Аlex Общие вопросы C/C++ 1 07.02.2009 03:46
перебрать все варианты перестановки строк sv_mix Помощь студентам 2 26.07.2008 17:48