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

Вниз

массив форм   Найти похожие ветки 

 
andry1981   (2006-10-21 22:39) [0]

Здравствуйте, уважаемые!
Краткое введение: есть 2 формы -  Form1(основная) и Form2.
Form2 используется в таком виде:

type
wind=record
win:TForm2;
...
end;
var windows:array[1..500] of wind;

Создание массива форм windows[i] происходит сл.образом:

windows[i].win:=TForm2.Create(self);
with windows[i].win do
 begin
 windowstate:=wsminimized;
 windows[i].win.Show;
 Caption:="...";
 windows[i].win.flash.Enabled:=true;
 end;

где
windows[i].win.flash.Enabled:=true; - вызывает таймер, который должен заставлять мигать иконку формы windows[i].win на панели задач.

Мигание по таймеру описано в следующем виде:
if flash.Tag = 0 then
begin
FlashWindow(Form2.Handle,True);
flash.Tag:=1;
end
else
begin
FlashWindow(Form2.Handle,False);
flash.Tag:=0;
end;    

А теперь собственно вопросы:
1) После создания массива форм windows[i].win или любой одно такой формы,я  пытаюсь скрыть основную форму Form1, но если активна любая из созданных форм, то Form1 будет также активна. Как её скрыть таким образом чтобы оставались только формы windows[i].win ?

2) У созданной формы должна мигать иконка на панели задач, но она не мигает. Если вместо Form2.Handle поставить Application.Handle, то начинает мигать Form1, которая как я подчеркнул в 1-м вопросе - никуда не девается и вечно висит рядом с новыми созданными формами. Что не так?

Пробовал описывать процедуру для формы Form2:
procedure TPrivat.CreateParams(var Params: TCreateParams);
begin
   inherited;
Params.ExStyle:=Params.ExStyle or WS_EX_OVERLAPPEDWINDOW;
end;
Не помогает.

Что посоветуете?
Заранее спасибо за ответы!


 
@!!ex ©   (2006-10-21 23:05) [1]

WinAPI.
CreateWindow


 
andry1981   (2006-10-21 23:34) [2]

Но у меня слишком сложная форма с кучей компонентов на ней.


 
@!!ex ©   (2006-10-22 09:59) [3]

В плане VCL я ламер полный.....
Поэтому не смогу наверно ничего умного сказать....
В DLL форму засунуть? Тогда она не так связана с Апликейшеном вроде.


 
Leonid Troyanovsky ©   (2006-10-22 10:50) [4]


> andry1981   (21.10.06 22:39)  
 
> Form2 используется в таком виде:

> type
> wind=record
> win:TForm2;
> ...
> end;


Обычно делают так:

type TForm2 = class(TFormX)
 ..
end;

т.е., вся необходимая информация включается в класс формы в
виде полей (свойств).

Кроме того, для того, чтобы безопасно пользоваться ссылками на
формы из массива windows (не очень удачное имя), нужны доп. усилия.
Проще же воспользоваться уже готовым массивом Screen.Forms.

По поводу всего остального сказать ч.-л. сложно, бо
изложено сумбурно.

--
Regards, LVT.


 
andry1981   (2006-10-22 13:41) [5]

Leonid Troyanovsky, по поводу сумбурности, поясняю: есть форма Form2, которая у меня визуально посмотрена с множеством компонентов и т.д.  Я включаю описание формы в запись wind, которая используется для описания массива окон на основе этой формы. У меня есть подозрение что при создании windows[i].win:=TForm2.Create(self) - происходит что-то не совсем для меня подходящее, а именно форма зависит от первоначальной Form1..Может быть стоит расписать флаги создания формы?! Или посоветуете как это сделать с помощью WinAPI опять таки с привязкой к описанной мною Form2.
И что по поводу мигания иконки?


 
Percent   (2006-10-22 14:00) [6]

которая у меня визуально посмотрена с множеством компонентов

Непонятно...

Я включаю описание формы в запись wind

Непонятно и неочевидно...

запись wind, которая используется для описания массива окон на основе этой формы

Запись - для описания массива? Это как? Ты что-то загадочное делаешь...

TForm2.Create(self)

TForm2.Create(Application)?

Может быть стоит расписать флаги создания формы?!

Форма с флагами? :-)

как это сделать с помощью WinAPI опять таки с привязкой к описанной мною Form2.

Формы не создаются напрямую с помощью WinAPI. Создание формы инкапсулировано в классе TCustomForm. Если же использовать WinAPI, то это будут уже не формы, а окна.

И что по поводу мигания иконки?

"Мигание по таймеру описано в следующем виде" (С)

FlashWindow(Application.Handle, True); {и больше ничего; интервал таймера - 500 мсек}

У меня мигает иконка. Что я делаю не так?


 
andry1981   (2006-10-22 14:33) [7]

Хорошо, вот я сделал простой пример. Создал 2 формы на каждой из которых есть по 1-й кнопке

Form1:

unit Unit1;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;
type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
   procedure CreateParams(var Params: TCreateParams); override;
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation
uses Unit2;
{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
Form2.Show;
end;

end.

Form2:

unit Unit2;

interface

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

type
 TForm2 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
   procedure CreateParams(var Params: TCreateParams); override;
 public
   { Public declarations }
 end;

var
 Form2: TForm2;

implementation
uses Unit1;
{$R *.dfm}

procedure TForm2.CreateParams(var Params: TCreateParams);
begin
   inherited;
   Params.ExStyle:=Params.ExStyle or WS_EX_APPWINDOW;
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
Form1.Hide;
end;

end.

Я нажимаю на кнопку первой формы и Form2 становится видимой...WS_EX_APPWINDOW делает ее видимой на панели задач в виде иконки. Т.е. на данную секунду мы имеем 2 иконки на панели задач - иконку приложения и иконку формы...Теперь я жму на кнопку на Form2 и все что я хочу - скрыть иконку приложения на панели задач. Form1 исчезает, но на панели задач по прежнему висит 2 иконки...Как мне убрать  первую иконку и оставить только икоку 2-й формы????


 
@!!ex ©   (2006-10-22 14:39) [8]

ShowWindow(Application.Handle,SW_HIDE);


 
andry1981   (2006-10-22 14:53) [9]

Спасибо! Помогло!


 
andry1981   (2006-10-22 17:14) [10]

вопрос в догонку - как создать окно таким образом чтобы оно не стало активным и на него не перешел фокус? Т.е. Form2 создается в тот момент, когда я работаю с Form1 и первая форма теряет фокус, даже если Form2 я делаю windowstate:=wsminimized.


 
Leonid Troyanovsky ©   (2006-10-22 18:13) [11]


> andry1981   (22.10.06 17:14) [10]
> вопрос в догонку - как создать окно таким образом чтобы
> оно не стало активным и на


procedure TFormX.ShowNA;
begin
 ShowWindow(Handle, SW_SHOWNA);
 Visible := True;
end;

--
Regards, LVT.l


 
andry1981   (2006-10-22 18:38) [12]

спасибо!!!


 
andry1981   (2006-10-22 19:58) [13]

спасибо!!!



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

Форум: "Основная";
Текущий архив: 2006.12.03;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.043 c
15-1163685032
Андрей Сенченко
2006-11-16 16:50
2006.12.03
Работа с XML на Delphi. Начинающему :)


1-1161613126
click
2006-10-23 18:18
2006.12.03
popup menu при перетаскивании за клиент. область


6-1152536756
Ал
2006-07-10 17:05
2006.12.03
Синхронизация часов


2-1163275753
vertal
2006-11-11 23:09
2006.12.03
отношение FindDialog к клавише Enter


2-1163579264
Elen
2006-11-15 11:27
2006.12.03
Запрет перемещений других окон в выбранной области экрана





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский