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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.08.2011, 00:43   #1
voverrr
Пользователь
 
Регистрация: 25.08.2010
Сообщений: 62
По умолчанию как динамически открыть и закрыть несколько окон?

Здравствуйте.
вот такая задача.

Нужно через промежутки времени(например 2 сек) динамически запускать открытие нескольких окон.(с этим я справился sleep-ом):
первое... 2 сек... второе... 2 сек... третье...2 сек...
Количество окон изначально не известно. Возможно два, а возможно и пятьдесят. На данный момент оно(количество) отрабатывается циклом, число оборотов которого вводим в окошке едит.
Время жизни каждого окна - 1 минута. По истечении минуты окна закрываются, в том же порядке, как и открывались: сначала первое, потом второе, третье, и т.д.

В каждом окне есть браузер через прокси, (кажется они работают некорректно, ну это уже другая тема). Мне бы разобраться пока что с открытием-закрытием окон.
вот код:

Код:
unit Unit1;

interface


uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, OleCtrls, SHDocVw, ExtCtrls, WinInet, urlmon;

type
  TForm1 = class(TForm)
    btn1: TButton;
    edt1: TEdit;
    lbl1: TLabel;



    procedure btn1Click(Sender: TObject);


  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}



procedure TForm1.btn1Click(Sender: TObject);
var
    fm : TForm;
    hor, vert : Integer;
    bw:TWebBrowser;
    lb: TLabel;
    i, okon: Integer;
begin
     okon := StrToInt(edt1.Text);//количество открываемых окон
     for i:=1 to okon do
  begin
     //форма
    fm := tform.Create(application);
    fm.Show();
    fm.Color := clSkyBlue;
    fm.Align := alNone;
    fm.Height := 100;
    fm.Width := 100;
    fm.BorderIcons := [];
    hor := Random(1600);//окошки появляются в случайных местах, типа для красоты.
    vert := Random(900);
    fm.Left := hor;
    fm.top := vert;
    //браузер на форме
    bw :=TWebBrowser.Create(fm);
    Fm.InsertControl(bw);
    bw.Align :=alBottom;
    //лейбл
    lb:=TLabel.Create(fm);
    Fm.InsertControl(lb);
    lb.Top :=5;
    lb.Left :=5;
    lb.Caption := 'адрес прокси';
    Sleep(2000);
    end;
end;

procedure proxy_go(proxy: string);
var proxy_info : PInternetProxyInfo;
begin
New (proxy_info);
proxy_info^.dwAccessType := INTERNET_OPEN_TYPE_PROXY;
proxy_info^.lpszProxy := PChar('188.165.254.157 :3128'); // àãà, çäåñü ïèøåì ïðîêñè.
proxy_info^.lpszProxyBypass := PChar('');
UrlMkSetSessionOption(INTERNET_OPTION_PROXY, proxy_info, SizeOf(Internet_Proxy_Info), 0);
proxy_go('188.165.254.157 :3128');
Dispose(proxy_info);
end;
end.
подозреваю, что нужно окна сделать пронумерованными, типа "Form1", "Form2"... и.т.д. Сейчас они у меня безличные. Просто "Form".
Но тогда не пойму как в цикле из обозначать Form(i).

Последний раз редактировалось voverrr; 20.08.2011 в 00:48.
voverrr вне форума Ответить с цитированием
Старый 20.08.2011, 00:45   #2
lux16
Форумчанин
 
Аватар для lux16
 
Регистрация: 11.02.2009
Сообщений: 305
По умолчанию

Хм, я думаю тебе надо сделать таймер на каждой форме с интервалом в одну минуту, и по ее истечению закрыть форму, таким образом форма сама себя будет закрыть, и тебе не надо это контролировать
Хочу быть лучшим, но пока что я только обычный =(
lux16 вне форума Ответить с цитированием
Старый 20.08.2011, 01:03   #3
voverrr
Пользователь
 
Регистрация: 25.08.2010
Сообщений: 62
По умолчанию

чот я наверное, не так делаю:
Код:
//таймер
    tm:=TTimer.Create(fm);
    Fm.InsertControl(tm);
    tm.Enabled:= True;
    tm.Interval := 5000;
    tm.Enabled := False;
    fm.Close();
вроде бы всё как и при вставке браузера на форму, но оно выдаёт ошибку.
Несовместимые, говорит, типы "TControl" и "TTimer"
voverrr вне форума Ответить с цитированием
Старый 20.08.2011, 01:16   #4
lux16
Форумчанин
 
Аватар для lux16
 
Регистрация: 11.02.2009
Сообщений: 305
По умолчанию

Хм, как ты странно добавляешь контрол на форму =) Попробуй что то вроде этого =)
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    procedure pp(Sender: TObject);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  i:  Byte;
  fm: TForm;
  tm: TTimer;
begin
  for i := 1 to 5 do
    begin
      fm := TForm.Create(nil);
      with (fm) do
        begin
          Left := 10;
          Top := 10;
          Caption := 'form ' + IntToStr(i);
          tm := TTimer.Create(fm);
          with (tm) do
            begin
              Interval := 1000;
              OnTimer := pp;
              Enabled := true;
            end;
          Show;
        end;
    end;
end;
procedure TForm1.pp(Sender: TObject);
begin
  Self.Close;
end;

end.
Хочу быть лучшим, но пока что я только обычный =(
lux16 вне форума Ответить с цитированием
Старый 20.08.2011, 01:49   #5
voverrr
Пользователь
 
Регистрация: 25.08.2010
Сообщений: 62
По умолчанию

ммм...
ругается на незакрытую скобку, а где - не пойму:
expected '=' but'(' found
Все ж скобки закрыты.
А вот это "рр" - его как-то нужно объявлять?
voverrr вне форума Ответить с цитированием
Старый 20.08.2011, 16:29   #6
voverrr
Пользователь
 
Регистрация: 25.08.2010
Сообщений: 62
По умолчанию

разобрался ить. спасибо за совет.

но только не совсем так как нужно.
В данном варианте он открывает первое, второе, третье, четвёртое.. последнее окно и через секунду после открытия последнего - все окна закрываются. Таким образом первое окно существует дольше всех, второе - поменьше и т.д.
А нужно, чтобы каждое окно открылось, пробыло сколько-то там(минуту, напр) и закрылось, а в это время последующие окна продолжают открываться(с интервалом в секунду) и так же через минуту закрываться.
voverrr вне форума Ответить с цитированием
Старый 20.08.2011, 19:55   #7
lux16
Форумчанин
 
Аватар для lux16
 
Регистрация: 11.02.2009
Сообщений: 305
По умолчанию

Так, а кто тебе мешает с каждый новым окном увеличивать таймер ? Просто у последнего окна будет самый большой интервал, или с этим тоже проблемы ? =)
Хочу быть лучшим, но пока что я только обычный =(
lux16 вне форума Ответить с цитированием
Старый 20.08.2011, 20:38   #8
voverrr
Пользователь
 
Регистрация: 25.08.2010
Сообщений: 62
По умолчанию

ты конечно, можешь надо мной насмехаться, но я толком не понимаю, как его увеличить. Я ж любитель-начинающий. По гуглу тыкаюсь слепошарый.
))

предположу, что интервал нужно прибавлять где-то в этом месте?

Код:
procedure TForm1.pp(Sender: TObject);
begin
  tm.Interval := tm.Interval+1000;                                 //куда-то сюда?
  Self.Close;
end;
voverrr вне форума Ответить с цитированием
Старый 20.08.2011, 20:47   #9
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Как то вот так, прошу прощения за возможные помарки, уже больше года не писал на дельфи, тем более в блокноте. Ваша задача: вывести вызовы ShowWindows и HideWindows для показа (создания) и скрытия (разрушения) соответственно, в таймер, вместо реализованного цикла
Код:
unit Unit1;

interface


uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, OleCtrls, SHDocVw, ExtCtrls, WinInet, urlmon;

type
  TForm1 = class(TForm)
    btn1: TButton;
    edt1: TEdit;
    lbl1: TLabel;


    procedure btn1Click(Sender: TObject);


    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }

    listOfShowedWindows: TList;
    isWindowsShowed: Boolean;

    procedure ShowWindows();
    procedure HideWindows();
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
    listOfShowedWindows := TList.Create;
    isWindowsShowed := False;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
    listOfShowedWindows.Free;
end;

procedure TForm1.ShowWindows(windowsCount: Integer);
var
    i: Integer;
    form: TForm;
    webBrowser: TWebBrowser;
    textLabel: TLabel;
begin
    for i := 1 to windowsCount do
    begin
        form := TForm.Create(Application);
        form.Color := clSkyBlue;
        form.Align := alNone;
        form.Height := 100;
        form.Width := 100;
        form.BorderIcons := [];
        form.Left := Random(1600); // зря вы так, может экран будет меньше шириной чем 1600? окошко уйдет за пределы
        form.Top := Random(900);
        
        webBrowser := TWebBrowser.Create(form);
        webBrowser.Align := alBottom;
        form.InsertControl(webBrowser);

        textLabel := TLabel.Create(form);
        textLabel.Top := 5;
        textLabel.Left := 5;
        textLabel.caption := 'адрес прокси';
        form.InsertControl(textLabel);

        form.Show();

        listOfShowedWindows.Add(form);
    end;
end;

procedure TForm1.HideWindows();
var
    i: Integer;
    form: TForm;
begin
    for i := 0 to listOfShowedWindows.Count - 1 do
    begin
        form := TForm(listOfShowedWindows[i]);
        form.Free();
    end;
    listOfShowedWindows.Clear();
end;

procedure TForm1.btn1Click(Sender: TObject);
begin
    if isWindowsShowed then
    begin
        HideWindows();
        isWindowsShowed := False;
    end else 
    begin
        ShowWindows(StrToInt(edt1.Text){ может быть ошибка, из-за некорректности ввода, например ввели букву});
        isWindowsShowed := True;
    end;
end;

Последний раз редактировалось BOBAH13; 20.08.2011 в 20:50.
BOBAH13 вне форума Ответить с цитированием
Старый 21.08.2011, 11:14   #10
lux16
Форумчанин
 
Аватар для lux16
 
Регистрация: 11.02.2009
Сообщений: 305
По умолчанию

Цитата:
Сообщение от voverrr Посмотреть сообщение
ты конечно, можешь надо мной насмехаться, но я толком не понимаю, как его увеличить. Я ж любитель-начинающий. По гуглу тыкаюсь слепошарый.
))

предположу, что интервал нужно прибавлять где-то в этом месте?

Код:
procedure TForm1.pp(Sender: TObject);
begin
  tm.Interval := tm.Interval+1000;                                 //куда-то сюда?
  Self.Close;
end;
Код:
  with (tm) do
   begin
    ...
    Interval := 1000 + i * 500; // где - то так
   end;
Хочу быть лучшим, но пока что я только обычный =(
lux16 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
код в с++ вин апи. как открыть/закрыть дисковод? ромик0 Общие вопросы C/C++ 1 25.05.2011 09:48
Как закрыть и снова открыть Оперу батником? ben1 Помощь студентам 5 27.10.2010 20:53
Закрыть и открыть форму Swatch Microsoft Office Access 1 31.05.2010 23:04
Как открыть\закрыть дверцу cd-rom'а в дельфи в консольном приложении Proger®© Win Api 9 11.10.2009 14:10
Сохоанить, Сохранить как, Открыть несколько элементов в одном файле Polotenchik Общие вопросы Delphi 9 01.08.2009 13:37