Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Найти динамически созданое окно


Автор: LordVanBoom 24.12.2006, 18:53
Имеется список элементов в виде дерева, на каждый элемент списка создается окно.

Код

procedure TForm1.VTDblClick(Sender: TObject);
begin
  inc(i);
  setlength(m,i);
  m[i-1]:=TForm8.Create(Application);
  m[i-1].Caption:=Label1.Caption; //Label1 - это Caption элемента списка
  m[i-1].Show;
end;


Как мне потом его найти?

Если можно, то  smile

Автор: Romkin 24.12.2006, 19:09
Ужасно. 
1. Как я понял, m - динамический массив? Он не нужен.
2. Приращение длины массива на 1 постоянно - очень хороший расход памяти, зачем? Если очень хочется, есть TObjectList.
3. Поскольку ты создаешь форму, назначая ей владельцем Application - она есть в списке Application.Components.
4. Есть типовой вызов создания формы, Application.CreateForm. По возможности используй его.

Код для поиска примерно такой: 
Код

for i := 0 to Application.ComponentCount - 1 do
  if (Application.Components[i] is TForm8) then
    if Form8(Application.Components[i]).Caption = Label1.Caption then 
    begin
      //Найдено!!!
      break;
    end;

P.S. i здесь никакой связи с твоим не имеет ;)

Автор: LordVanBoom 24.12.2006, 20:58
Цитата

Ужасно. 

Предложи лучше
Цитата

Есть типовой вызов создания формы, Application.CreateForm. По возможности используй его.

Поподробнее плиз...

Код

if Form8(Application.Components[i]).Caption = Label1.Caption then

Ругается "Missing operator or semicolon"

 smile 

Автор: Romkin 25.12.2006, 01:34
Код
 if TForm8(Application.Components[i]).Caption = Label1.Caption then...

НУ опечатался я, с кем не бывает? Это просто преобразование к нужному типу.

Цитата(LordVanBoom @  24.12.2006,  20:58 Найти цитируемый пост)
Предложи лучше

Я предложил.
Цитата(LordVanBoom @  24.12.2006,  20:58 Найти цитируемый пост)
Есть типовой вызов создания формы, Application.CreateForm. По возможности используй его.Поподробнее плиз...

А что подробнее? Посмотри в справке, посмотри в dpr файл - там написано. Подается тип формы и переменная, куда писать.

Автор: Sunvas 25.12.2006, 15:05
Romkin, искать окна по заголовку, это чревато.. Лучше использовать свойство tag или еще использовать массив из хэндлов окон

Автор: LordVanBoom 25.12.2006, 15:39
Цитата

НУ опечатался я, с кем не бывает? Это просто преобразование к нужному типу.

Забей, тут и я ступил, все поправил - работает, спасибо.

Цитата

Romkin, искать окна по заголовку, это чревато.. Лучше использовать свойство tag или еще использовать массив из хэндлов окон

А тут поподробнее если можно?!

Это мне получается при каждом создании динамической формы прописывать ее "номер" в tag, а потом уже не по заголовку искать а по tag?

Добавлено @ 15:44 
Цитата

Приращение длины массива на 1 постоянно - очень хороший расход памяти, зачем?

И помойму тут великого расхода памяти не намечается, у меня перед созданием формы проверяется существует ли она. А элементов в списке не так уж и много, штук 10-20.

Автор: Snowy 25.12.2006, 15:46
Код

for i := 0 to Screen.FormCount - 1 do
  if Screen.Forms[i].Caption = Label1.Caption then
  with Screen.Forms[i] begin
    Show;
    BringToFront;
    break;
  end;

Автор: LordVanBoom 25.12.2006, 15:50
Snowy, это получается для вех окон твоего приложение перебор идет или для тех которые в текущее время открыты?

Автор: Snowy 25.12.2006, 15:51
Цитата(LordVanBoom @  25.12.2006,  15:39 Найти цитируемый пост)
А элементов в списке не так уж и много, штук 10-20.
А список и нафиг не нужен.

Добавлено @ 15:51 
Цитата(LordVanBoom @  25.12.2006,  15:50 Найти цитируемый пост)
Snowy, это получается для вех окон твоего приложение перебор идет или для тех которые в текущее время открыты?
Для тех, которые в данный момент существуют.
И это явно быстрее, чем перебирать вообще все контролы smile

Добавлено @ 15:53 
В смысле, перебирая через список компонент, ты перебираешь все формы, кнопочки, лабелы и т.д.
А их может быть вагоны.
Зачем?
Есть же список форм - его и перебирать smile

Автор: LordVanBoom 25.12.2006, 16:15
Хм, пусть немного не по правилам форума, но один вопросик я задам.

Как мне форму развернуть если она свернута?

Автор: Snowy 25.12.2006, 16:36
Свёрнута как?
Вместе с приложением?
Скрыта?
Свёрнута брусочком внизу экрана?
Form.WindowState := wsNormal; ?

Автор: LordVanBoom 26.12.2006, 15:35
Цитата

Свёрнута брусочком внизу экрана?


 smile вот так

Автор: Snowy 26.12.2006, 15:38
Цитата(Snowy @  25.12.2006,  16:36 Найти цитируемый пост)
Form.WindowState := wsNormal; 


Автор: LordVanBoom 26.12.2006, 20:47
О! Пасиба!

Сделал вобщем так, кто что найдет лишнего - отпишитесь если вмочь smile

Код

function IsFormOpen(const FormName: string): Boolean;
var
  i: Integer;
begin
  Result := False;
  for i := Screen.FormCount - 1 DownTo 0 do
    if (Screen.Forms[i].Name = FormName) then
      begin
        Result := True;
        Break;
      end;
end;

procedure TForm1.VTDblClick(Sender: TObject);
var
  a: integer;
begin
inc(i);
setlength(m, i);
if not IsFormOpen('Form'+Label1.Caption) then
  begin
    m[i-1]:=TForm8.Create(Application);
    m[i-1].Caption:=Label1.Caption;
    m[i-1].Name:='Form'+Label1.Caption;
    m[i-1].Show;
  end;
for a := 0 to Application.ComponentCount - 1 do
  if (Application.Components[a] is TForm8) then
    if TForm8(Application.Components[a]).Caption = Label1.Caption then
    begin
      TForm8(Application.Components[a]).Label1.Caption:=Label1.Caption;
      TForm8(Application.Components[a]).Show;
      TForm8(Application.Components[a]).WindowState:=wsNormal;
      break;
    end;
end;

Всем спасибо!  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)