Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi

Модерирует : ShIvADeSt

ShIvADeSt (20-04-2006 01:53): http://forum.ru-board.com/topic.cgi?forum=33&topic=6679#1  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102

   

2Polkan



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
кстати, откуда ты взял такую формулировку по self?  self на то и есть, что без всяких префиксов  

надо же пример привести :))). Придумал перове попавшееся...
 
Кстати, дай нормальные ссылки...  а то никак не зайду :)
 
Добавлено:
еще вопрос: если у меня в Мемо загружается большой файл, какой функцией прервать его загрузку? Блин, отдал другу книгу почитать в такой момент :)

Всего записей: 435 | Зарегистр. 20-11-2004 | Отправлено: 12:35 30-07-2005
Larry



Moderator
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Подскажите, пожалуйста, как реализовать функцию поиска фразы/слова в тексте? Допустим, на форме лежит Memo, Edit и Button. В Memo размещен текст, в Edit набираем слово или фразу, давим Button. Если содержимое поля Edit найдено в Memo, то функция возвращает результат true.
 
Заранее благодарен за ответ...

----------
Never put off till tomorrow what can be put off till day after tomorrow just as well

Всего записей: 3119 | Зарегистр. 20-07-2005 | Отправлено: 15:43 30-07-2005
GloThin



Тобольский шашлычник
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Larry

Цитата:
как реализовать функцию поиска фразы/слова в тексте?

Попробуй классический метод - используй функцию POS(), параметры, вернее порядок не помню, один из них строка которую ищешь, другой- в которой ищешь. Возвращает позицию первого вхождения искомой строки в той, где ищешь. Если не найдено - результат, по-моему=0. Детали можешь уточнить в Helpe.

----------
Все принципиальное-просто,а все простое-принципиально!
На каждого мудреца достаточно простоты!
Не изменишь существующее,не изменив себя!!

Всего записей: 706 | Зарегистр. 28-04-2004 | Отправлено: 16:19 30-07-2005
Larry



Moderator
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
GloThin, спасибо.


----------
Never put off till tomorrow what can be put off till day after tomorrow just as well

Всего записей: 3119 | Зарегистр. 20-07-2005 | Отправлено: 16:43 30-07-2005
DroN_S

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Larry
Вот такой пример кода:
 

Код:
 
procedure TfrmMain.cxButton1Click(Sender: TObject);
var
   t:TextFile;
   s,s1:string;
begin
s1:=ExtractFilePath(paramStr(0))+'\Base.txt';
AssignFile(t,S1);
reset(t);
while not eof(t) do
 begin
  readln(t,s);
   if pos(cxTextEdit1.Text, s)<>0 then
    begin
     cxMemo1.Lines.Add(s);
     Label1.Caption := 'Найдено -- ' + IntToStr(cxMemo1.Lines.Count);
    end;
 end;
if cxMemo1.Lines.Count = 0 then
 cxMemo1.Text := '                                                     Ничего не найдено';
closeFile(t);
end;
 

 
надеюсь разберёшься с кодом, если нет. пиши, объяню...

Всего записей: 1143 | Зарегистр. 09-04-2005 | Отправлено: 08:32 31-07-2005
GloThin



Тобольский шашлычник
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
DroN_S

Код:
 if pos(cxTextEdit1.Text, s)<>0 then  
    begin  
     cxMemo1.Lines.Add(s);  
     Label1.Caption := 'Найдено -- ' + IntToStr(cxMemo1.Lines.Count);  
    end;  

Человек просил помощи именно найти строку в заполненном MEMO, а ты ищешь строку при чтении из файла и выдаешь в MEMO и считаешь количество строк.

Код:
if cxMemo1.Lines.Count = 0 then  
 cxMemo1.Text := '                                                     Ничего не найдено';  
closeFile(t);  

  Это решение совершенно другой задачи, косвенно использующая принцип использования функции POS. Его можно использовать, например,  для поиска(фильтрации) содержимиого файла...

Код:
s1:=ExtractFilePath(paramStr(0))+'\Base.txt';

 


----------
Все принципиальное-просто,а все простое-принципиально!
На каждого мудреца достаточно простоты!
Не изменишь существующее,не изменив себя!!

Всего записей: 706 | Зарегистр. 28-04-2004 | Отправлено: 08:58 31-07-2005
moonrise



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Sleepwalker
почему не должна?
можно до посылки анонимуса  Receiveln(); послать
все равно ничего не меняется
 
а не работает.. он только приглашение в мемо выводит

----------
Истина внимательно выслушивает спорящих... вздыхает и уходит.

Всего записей: 1986 | Зарегистр. 19-09-2001 | Отправлено: 09:15 31-07-2005 | Исправлено: moonrise, 09:16 31-07-2005
Sleepwalker



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
moonrise
ну. Ничего сказать не могу, надо брать проект и тестировать. А чего компонент idFTp не захотел взять? не проще будет?
 
Добавлено:
2Polkan
нормальные ссылки куда? на помощь??? у тебя справка стандартная не установлена, что ли? на компоненте жмешь F1 и читаешь.
 

Цитата:
сли у меня в Мемо загружается большой файл, какой функцией прервать его загрузку?

думаю что никак (при обычном раскладе). Разве что переписать самому функцию Tstrings.readfromfile. Там ничего сложного нет, весь код доступен в исходниках.

Всего записей: 1957 | Зарегистр. 19-10-2002 | Отправлено: 12:11 31-07-2005
DroN_S

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
GloThin

Цитата:
Человек просил помощи именно найти строку в заполненном MEMO, а ты ищешь строку при чтении из файла и выдаешь в MEMO и считаешь количество строк.

Это пример поиска строки в файле, а что мешает поменять содержимое файла на содержимое МЕМО поля? Ничего сложного!!!!
 

Цитата:
if cxMemo1.Lines.Count = 0 then  
 cxMemo1.Text := '                                                     Ничего не найдено';  
closeFile(t);
 
 
А это просто сообщение, если искомая строка не найдена...
Это можно и не писать, просто код взят из действующего проекта!!!

Всего записей: 1143 | Зарегистр. 09-04-2005 | Отправлено: 12:27 31-07-2005 | Исправлено: DroN_S, 12:28 31-07-2005
moonrise



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Sleepwalker

Цитата:
ну. Ничего сказать не могу, надо брать проект и тестировать. А чего компонент idFTp не захотел взять? не проще будет?

так фактически это весь "проект"
только еще мемка есть в которой 2 тестовых фтп забито. могу на почту закинуть.
 
в idFTp не нашел возможность отключения блокирующего режима, да и не уверен я в корректности его захода
 
Добавлено:
попытался на idFTp

Код:
unit main;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  IdFTP, StdCtrls, ExtCtrls, IdAntiFreezeBase, IdAntiFreeze;
 
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Memo2: TMemo;
    IdFTP1: TIdFTP;
    Timer1: TTimer;
    Label1: TLabel;
    Memo3: TMemo;
    IdAntiFreeze1: TIdAntiFreeze;
    procedure Button1Click(Sender: TObject);
    procedure IdFTP1AfterClientLogin(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  T_me: integer;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
var
  I: Integer;
  J: Integer;
begin
  Memo1.Clear;
  Memo3.Clear;
  Memo3.Lines.Add('Start: ' + TimeToStr(Time));
  T_me := 0;
  Timer1.Enabled := True;
  for J := 1 to 255 do    // Iterate
  begin
    for I := 0 to memo2.Lines.Count - 1 do    // Iterate
      begin
        with TidFTP.Create(self) do
        begin
          try
              Name := 'FTP_' + IntToStr(J) + '_' + IntToStr(I);
              Host := memo2.Lines[I]+IntToStr(J);
              Port := 21;
              username := 'anonymous';
              password := 'FTP_bot';
              OnAfterClientLogin := IdFTP1AfterClientLogin;
              try
                Memo1.Lines.Add(TimeToStr(Time) + ' : ' + Host + ' Try connected');
                Connect(true, 150);
              except
  //              Memo1.Lines.Add(TimeToStr(Time) + ' : ' + Host + ' Error');
              end;
            finally
              Destroy;
            end;
        end
      end;    // for
  end;    // for
  Timer1.Enabled := False;
  Memo3.Lines.Add('Stop: ' + TimeToStr(Time));
  Memo3.Lines.Add('Time (sec): ' + IntToStr(T_me));
 
end;
 
procedure TForm1.IdFTP1AfterClientLogin(Sender: TObject);
begin
  Memo1.Lines.Add((Sender as TidFTP).Host + ': Anonym') ;
  (Sender as TidFTP).Disconnect;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo2.Clear;
  Memo2.Lines.Add('10.130.2.');
  Memo2.Lines.Add('10.130.4.');
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  T_me := T_me + 1;
end;
 
end.
приложение упирается в первый неработающий фтп и подвисает
 
Добавлено:
нашел 1 абзац
Цитата:
В компонентах Indy используются только блокирующие соединения. Любая операция сокета клиента может быть выполнена в потоке или (более простой вариант) с использованием специального вспомогательного компонента Indy (IdAntiFreeze). Использование блокирующих соединений для реализации протокола упрощает логику программы, так как нет необходимости проверять состояние каждого компьютера, как при неблокирующих соединениях.

расстроился...
подвисание частично удалось избежать путем добавления TIdAntiFreeze. но надо через неблокирующий режим
 
Добавлено:
собственно  победил делфю многопоточно скан ЗАПУСКАЕТСЯ секунды за 2 (на подсетку)
теперь только трабла есть.. там что бы нормально обрабатвало пришлось циклы делать.. а ключевое значение в них меняется в действии на ответ, а вот если ответа нету, то фигово он в бесконечный уходит
думаю как избежать

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  I, J: Integer;
begin
    Log.Clear;
    for I := 0 to 0{IPList.Lines.Count - 1} do    // Iterate
    begin
      for J := 1 to 254 do    // Iterate
      begin
          with TTcpClient.Create(self) do
          begin
            Tag :=0;
            BlockMode := bmNonBlocking;
            RemotePort := '21';
            RemoteHost := IPList.Lines[I]+IntToStr(J);
            OnReceive := TcpReceive;
            Log.Lines.Add(RemoteHost + 'Try to connect...');
            try
              Active := True;
//              if isOk =true then
              begin
                repeat Receiveln()
                until Tag = 1;
                Sendln('user anonymous');
                Tag := 0;
                repeat Receiveln();
                until Tag = 1;
              end;
            except
              Log.Lines.Add(RemoteHost + 'Error');
            end;
          end;    // with
      end;    // for
    end;    // for

end;

Код:
procedure TForm1.TcpReceive(Sender: TObject; Buf: PAnsiChar;
  var DataLen: Integer);
var
S: string;
begin
    Log.Lines.Add((Sender as TTcpClient).RemoteHost + '  ' + copy(Buf,1,DataLen-2));
    (Sender as TTcpClient).Tag := 1;
    S := copy(Buf,4,1);
    if S ='-' then (Sender as TTcpClient).Receiveln()
    else
    begin
     case  StrToInt(copy(Buf,1,3)) of    //
       220: begin
 
            end;
       230: begin
              (Sender as TTcpClient).Disconnect;
              (Sender as TTcpClient).Active := False;
              Log.Lines.Add((Sender as TTcpClient).RemoteHost +' : Anonymous');
              (Sender as TTcpClient).Destroy;
            end;
       331: begin
              (Sender as TTcpClient).Sendln('pass FTP_BOT');
              (Sender as TTcpClient).Tag := 0;
            end;
       500: begin
              (Sender as TTcpClient).Disconnect;
              (Sender as TTcpClient).Active := False;
              Log.Lines.Add((Sender as TTcpClient).RemoteHost +' : Non anonymous');
              (Sender as TTcpClient).Destroy;
            end;
      else
        (Sender as TTcpClient).Disconnect;
        (Sender as TTcpClient).Active := False;
        Log.Lines.Add((Sender as TTcpClient).RemoteHost +' : Error');
        (Sender as TTcpClient).Destroy;
      end;    // case
 
    end;
 
end;
может у кого какие соображения будут?

----------
Истина внимательно выслушивает спорящих... вздыхает и уходит.

Всего записей: 1986 | Зарегистр. 19-09-2001 | Отправлено: 13:09 31-07-2005 | Исправлено: moonrise, 18:54 31-07-2005
Sleepwalker



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
а вот если ответа нету, то фигово он в бесконечный уходит
думаю как избежать

Поставить таймер и вываливаться по таймауту, или счетчик с паузой, или тики виндовые считать. Тайм-аут в любом виде

Всего записей: 1957 | Зарегистр. 19-10-2002 | Отправлено: 20:42 31-07-2005
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
а вот если ответа нету, то фигово он в бесконечный уходит  
думаю как избежать

Сделать это в потоке, а поток по таймауту рубить, ИМХО более грамотно, чем в основном потоке проверять. В случае какого либо глюка, приложение просто не будет отвечать, а так основной поток всегда работает.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 02:07 01-08-2005
GloThin



Тобольский шашлычник
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
DroN_S

Цитата:
Это пример поиска строки в файле, а что мешает поменять содержимое файла на содержимое МЕМО поля? Ничего сложного!!!!

так для того чтобы это было проще, достаточно трех строк кода, не надо заморачиваться со строками, ведь весь текст в MEMO - можно обрабатывать как строку. И надо делать никаких циклов, использовать счетчики и т.д.


----------
Все принципиальное-просто,а все простое-принципиально!
На каждого мудреца достаточно простоты!
Не изменишь существующее,не изменив себя!!

Всего записей: 706 | Зарегистр. 28-04-2004 | Отправлено: 07:00 01-08-2005
DroN_S

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
GloThin
Я просто привёл обобщённый пример

Всего записей: 1143 | Зарегистр. 09-04-2005 | Отправлено: 15:49 01-08-2005
moonrise



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
ShIvADeSt

Цитата:
Сделать это в потоке, а поток по таймауту рубить, ИМХО более грамотно, чем в основном потоке проверять. В случае какого либо глюка, приложение просто не будет отвечать, а так основной поток всегда работает.

а можно самый простой пример потоков? к примеру создание 2 кнопочек в потоках по нажатию ан 3-ю

----------
Истина внимательно выслушивает спорящих... вздыхает и уходит.

Всего записей: 1986 | Зарегистр. 19-09-2001 | Отправлено: 16:20 01-08-2005
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
moonrise

Цитата:
а можно самый простой пример потоков? к примеру создание 2 кнопочек в потоках по нажатию ан 3-ю

Ну создавать кнопочки в потоках это ИМХО неправильно а вот обработку нажатия на кнопку легко, CreateThread.

Цитата:
 
procedure ThreadProcName;stdcall;
begin
   action //здесь код события
end;
 
procedure TForm1.OnButtonClick;
begin
   CreateThread(nil,0,@ThreadProcName,nil,0,ProtID);
end;
 

в общих чертах так. В принципе в потоке можно что угодно создавать, вот только не знаю, где будет обработчик событий, так как не занимался созданием контролов в потоках, обычно я туда действия пихаю.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 01:59 02-08-2005
moonrise



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
ShIvADeSt
т.е. правильнее создать один компанент (причем блокирующий, к примеру TidFTP) и создавать количество потоков CreateThread(nil,0,@ThreadProcName,nil,0,ProtID); ?
тогда можно ли писать:
CreateThread(nil,0,@ThreadProcName(var),nil,0,ProtID);?

----------
Истина внимательно выслушивает спорящих... вздыхает и уходит.

Всего записей: 1986 | Зарегистр. 19-09-2001 | Отправлено: 04:00 02-08-2005
GloThin



Тобольский шашлычник
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
DroN_S

Цитата:
Я просто привёл обобщённый пример

Это совсем не обобщенный, а написанный для специфической ситуации и решает совсем другие задачи.

----------
Все принципиальное-просто,а все простое-принципиально!
На каждого мудреца достаточно простоты!
Не изменишь существующее,не изменив себя!!

Всего записей: 706 | Зарегистр. 28-04-2004 | Отправлено: 07:22 02-08-2005 | Исправлено: GloThin, 07:24 02-08-2005
Felan

Junior Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
moonrise
У Indy можно выставить таймаут, тогда, если его правильно обработать, проложение не будет зависать когда "упрется в неработающий фтп".
 

Цитата:
тогда можно ли писать:  
CreateThread(nil,0,@ThreadProcName(var),nil,0,ProtID);?

Писать, в общем случае, можно, только надо позаботиться о синхронизации параметра.
Но то, что ты имеешь ввиду, нет. Надо делать в каждом потоке по своему экземпляру компанента... они же не визуальные...

Всего записей: 58 | Зарегистр. 04-03-2003 | Отправлено: 09:17 02-08-2005
moonrise



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Felan

Цитата:
Писать, в общем случае, можно, только надо позаботиться о синхронизации параметра.  
Но то, что ты имеешь ввиду, нет. Надо делать в каждом потоке по своему экземпляру компанента... они же не визуальные...

благодарствую
 
ThreadProcName;stdcall; - это обязательное, системнозарезервированное имя или там просто указывается имя процедуры, в которой создание компанента. К примеру MakeMyComp(s: string) ?

----------
Истина внимательно выслушивает спорящих... вздыхает и уходит.

Всего записей: 1986 | Зарегистр. 19-09-2001 | Отправлено: 20:53 03-08-2005
   

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi
ShIvADeSt (20-04-2006 01:53): http://forum.ru-board.com/topic.cgi?forum=33&topic=6679#1


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru