Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Найти динамически созданое окно 
:(
    Опции темы
LordVanBoom
Дата 24.12.2006, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 15.12.2006
Где: Беларусь

Репутация: нет
Всего: нет



Имеется список элементов в виде дерева, на каждый элемент списка создается окно.

Код

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

Это сообщение отредактировал(а) LordVanBoom - 24.12.2006, 18:57
PM MAIL   Вверх
Romkin
Дата 24.12.2006, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 189
Регистрация: 14.11.2006
Где: Москва

Репутация: 2
Всего: 5



Ужасно. 
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 здесь никакой связи с твоим не имеет ;)
PM ICQ   Вверх
LordVanBoom
Дата 24.12.2006, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 15.12.2006
Где: Беларусь

Репутация: нет
Всего: нет



Цитата

Ужасно. 

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

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

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

Код

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

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

 smile 
PM MAIL   Вверх
Romkin
Дата 25.12.2006, 01:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 189
Регистрация: 14.11.2006
Где: Москва

Репутация: 2
Всего: 5



Код
 if TForm8(Application.Components[i]).Caption = Label1.Caption then...

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

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

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

А что подробнее? Посмотри в справке, посмотри в dpr файл - там написано. Подается тип формы и переменная, куда писать.
PM ICQ   Вверх
Sunvas
Дата 25.12.2006, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 28
Всего: 89



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


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
LordVanBoom
Дата 25.12.2006, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 15.12.2006
Где: Беларусь

Репутация: нет
Всего: нет



Цитата

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

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

Цитата

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

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

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

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

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

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

Это сообщение отредактировал(а) LordVanBoom - 25.12.2006, 15:41
PM MAIL   Вверх
Snowy
Дата 25.12.2006, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Код

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;

PM MAIL   Вверх
LordVanBoom
Дата 25.12.2006, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 15.12.2006
Где: Беларусь

Репутация: нет
Всего: нет



Snowy, это получается для вех окон твоего приложение перебор идет или для тех которые в текущее время открыты?
PM MAIL   Вверх
Snowy
Дата 25.12.2006, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



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

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

Добавлено @ 15:53 
В смысле, перебирая через список компонент, ты перебираешь все формы, кнопочки, лабелы и т.д.
А их может быть вагоны.
Зачем?
Есть же список форм - его и перебирать smile
PM MAIL   Вверх
LordVanBoom
Дата 25.12.2006, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 15.12.2006
Где: Беларусь

Репутация: нет
Всего: нет



Хм, пусть немного не по правилам форума, но один вопросик я задам.

Как мне форму развернуть если она свернута?
PM MAIL   Вверх
Snowy
Дата 25.12.2006, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Свёрнута как?
Вместе с приложением?
Скрыта?
Свёрнута брусочком внизу экрана?
Form.WindowState := wsNormal; ?
PM MAIL   Вверх
LordVanBoom
Дата 26.12.2006, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 15.12.2006
Где: Беларусь

Репутация: нет
Всего: нет



Цитата

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


 smile вот так
PM MAIL   Вверх
Snowy
Дата 26.12.2006, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



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


PM MAIL   Вверх
LordVanBoom
Дата 26.12.2006, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 15.12.2006
Где: Беларусь

Репутация: нет
Всего: нет



О! Пасиба!

Сделал вобщем так, кто что найдет лишнего - отпишитесь если вмочь 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 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0576 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.