Форум программистов, компьютерный форум CyberForum.ru

Поиск компонента по имени - Delphi FireMonkey

Восстановить пароль Регистрация
 
SHiipa
0 / 0 / 0
Регистрация: 10.07.2011
Сообщений: 147
12.11.2016, 08:05     Поиск компонента по имени #1
На форме создан [B]Layout3[/B ]в нем создаются другие
Delphi
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
var
  vysota_u,shirina_u :integer;
 
procedure obn();
var
  image: TImage;
  i,j,kl: integer;
  LayoutMainM:TLayout;
begin
  i_razreshenie_hoda:=True;
  kolvo_gotovyh_iaschikov:=0;
  kolvo_hodov:=0;
 
  for i := 0 to vysota_u do
  begin
    for j := 0 to shirina_u do
    begin
      image := TImage.Create(LayoutMainM);
      image.Parent := (Form2.FindComponent('vysita') as TLayout);
      image.Align := TAlignLayout.alNone;
      image.Width := kl;
      image.Height := kl;
      image.Position.X := (j*shirina_kletki);
      image.Position.Y := (i*shirina_kletki);
 
      image.Name := 'fon_'+inttostr(i)+'_'+inttostr(j);
      image.Bitmap.LoadFromFile('C:\Users\SHipa\Desktop\Img\0.png');
      image.WrapMode:= TImageWrapMode.iwStretch;
 
      if (i=5) and (j=5) then
      begin
        image := TImage.Create(LayoutMainM);
        image.Parent := (Form2.FindComponent('vysita') as TLayout);
        image.Align := TAlignLayout.alNone;
        image.Width := kl;
        image.Height := kl;
        image.Position.X := (j*kl);
        image.Position.Y := (i*kl);
 
        image.Name := 'st_'+inttostr(i)+'_'+inttostr(j);
        image.Bitmap.LoadFromFile('C:\Users\SHipa\Desktop\Img\1.png');
        image.WrapMode:= TImageWrapMode.iwStretch;
      end;
 
    end;
  end;
 
end;
 
procedure TForm2.Image1Click(Sender: TObject);
var
    LayoutMainM:TLayout;
begin
    vysota_u:=10;
    shirina_u :=10;
    kl:=10;
 
    if Assigned(Form2.FindComponent('shirina') as TLayout) then
    begin
       (Form2.FindComponent('shirina') as TLayout).Destroy;
    end;
 
    LayoutMainM := TLayout.Create(Form2);
    LayoutMainM.Parent := Layout3;
    LayoutMainM.Align := TAlignLayout.alHorzCenter; 
    LayoutMainM.Name := 'shirina';
 
    LayoutMain := TLayout.Create(LayoutMainM);
    LayoutMain.Parent := LayoutMainM;
    LayoutMain.Align := TAlignLayout.alVertCenter;
    LayoutMain.Name := 'vysita';
 
    obn();
 
end;
 
procedure TForm2.Image2Click(Sender: TObject);
begin
    
end;
При изменении владельца у объекта vysita. FindComponent не находит динамически созданный объект vysita
Как найти и получить доступ к объекту и именем vysita ?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.11.2016, 08:05     Поиск компонента по имени
Посмотрите здесь:

Из имени компонента сделать строку ... Delphi
C++ Builder Динамическое изменение имени компонента
Динамическое определение имени компонента VBA
Поиск компонента по имени Delphi
Delphi FireMonkey Почему нет компонента TWebBrowser?
Куда делась процедура .Click из компонента Button в Rad Studio XE5? Delphi FireMonkey
Delphi FireMonkey Дополнительные свойства не появились в свойствах нового компонента
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
FIL
Модератор
 Аватар для FIL
3363 / 2501 / 476
Регистрация: 19.09.2012
Сообщений: 7,817
12.11.2016, 10:18     Поиск компонента по имени #2
У тебя владельцем 'vysita' является 'shirina', а ты его ищешь на форме почему-то.
SHiipa
0 / 0 / 0
Регистрация: 10.07.2011
Сообщений: 147
12.11.2016, 10:27  [ТС]     Поиск компонента по имени #3
значит FindComponent ищет только по форме?. а как его можно найти в моем случае
FIL
Модератор
 Аватар для FIL
3363 / 2501 / 476
Регистрация: 19.09.2012
Сообщений: 7,817
12.11.2016, 11:51     Поиск компонента по имени #4
Функция FindComponent ищет не по форме, а среди принадлежащих вызывающему ее объекту компонентов.
Если сделаешь владельцем форму, то найдешь через FindComponent формы.
SHiipa
0 / 0 / 0
Регистрация: 10.07.2011
Сообщений: 147
12.11.2016, 11:55  [ТС]     Поиск компонента по имени #5
Владельца тут менять нельзя нужно как то подругому найти
krapotkin
 Аватар для krapotkin
1956 / 1902 / 490
Регистрация: 14.04.2014
Сообщений: 9,302
12.11.2016, 12:17     Поиск компонента по имени #6
я фигею, сначала мы создаем компонент и выкидываем ссылку на него за ненужностью
а потом старательно ищем ее и не можем найти...
что мешает сохранять все, что вы насоздавали?
и не вижу смысла в использовании простых процедур, когда вокруг ООП. сделайте их методами класса
и храните в полях класса все нужные вам ссылки
FIL
Модератор
 Аватар для FIL
3363 / 2501 / 476
Регистрация: 19.09.2012
Сообщений: 7,817
12.11.2016, 12:30     Поиск компонента по имени #7
Цитата Сообщение от SHiipa Посмотреть сообщение
Владельца тут менять нельзя
Ну тогда ищи через FindComponent компонента 'shirina', который является владельцем 'vysita'.
SHiipa
0 / 0 / 0
Регистрация: 10.07.2011
Сообщений: 147
12.11.2016, 13:42  [ТС]     Поиск компонента по имени #8
krapotkin код на компьютере работает нормально но при компиляции под андроид при повторном запуске выдает ошибку что то связаное с именами в памяти я таким образом хочу добится полной очистки памяти выделенной под дочерние элементы компонента 'shirina'

FIL а можно код
FIL
Модератор
 Аватар для FIL
3363 / 2501 / 476
Регистрация: 19.09.2012
Сообщений: 7,817
12.11.2016, 13:59     Поиск компонента по имени #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от SHiipa Посмотреть сообщение
а можно код
Delphi
1
((Form2.FindComponent('shirina') as TLayout).FindComponent('vysita') as TLayout)
Добавлено через 31 секунду
И кстати, что мешает владельца поменять?
krapotkin
 Аватар для krapotkin
1956 / 1902 / 490
Регистрация: 14.04.2014
Сообщений: 9,302
12.11.2016, 14:06     Поиск компонента по имени #10
Цитата Сообщение от SHiipa Посмотреть сообщение
что то связаное с именами
работа с объектами под win и не-win кардинально отличается
под андроид объект будет жить пока на него есть хоть одна ссылка
посмотрите код TObject.Free там только begin end;
так что обнуляйте ссылки и делайте Parent:=nil; чтобы объект был разрушен

и это не меняет моего мнения, высказанного ранее
SHiipa
0 / 0 / 0
Регистрация: 10.07.2011
Сообщений: 147
12.11.2016, 15:07  [ТС]     Поиск компонента по имени #11
krapotkin я попробовал написать
Delphi
1
2
3
4
5
    if Assigned(Form2.FindComponent('shirina') as TLayout) then
    begin
       (Form2.FindComponent('shirina') as TLayout).Parent:=nil;
       (Form2.FindComponent('shirina') as TLayout).Destroy;
    end;
не помогло устранить ошибку, в чем я ошибся?
krapotkin
 Аватар для krapotkin
1956 / 1902 / 490
Регистрация: 14.04.2014
Сообщений: 9,302
13.11.2016, 09:50     Поиск компонента по имени #12
нет желания без кода гадать
вот как должно было быть
Delphi
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
TForm2= class(TForm)
...
  layW,layH:TLayout;
  createWHLayouts();
  destroyWHLayouts();
end;
 
procedure TForm2.CreateWHLayouts();
begin
  layW := TLayout.Create(self);
  layW.name := 'shirina';
  layW.parent := layContainer;
  layW.align := TAlignLayout.Top;
  layW.height := 45;
 
  layH := TLayout.Create(self);
  layH.name := 'vysita';
  layH.parent := layContainer;
  layH.align := TAlignLayout.Top;
  layH.height := 45;
  layH.position.Y := 46;
end;
 
procedure TForm2.DestroyWHLayouts();
begin
  layW.parent:=NIL;
  freeAndNil(layW);
  layH.parent:=NIL;
  freeAndNil(layH);
end;
SHiipa
0 / 0 / 0
Регистрация: 10.07.2011
Сообщений: 147
13.11.2016, 10:31  [ТС]     Поиск компонента по имени #13
попробовал сделать так все равно при повторном запуске на андроиде выкидывает ошибку
причем текст ошибки пустой. и указывает на 15960 строку
Кликните здесь для просмотра всего текста

Delphi
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
unit Unit1;
 
interface
 
uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Layouts,
  FMX.StdCtrls;
 
type
  TForm1 = class(TForm)
    layContainer: TLayout;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  layW,layH:TLayout;
implementation
 
{$R *.fmx}
 
procedure TForm1.Button1Click(Sender: TObject);
begin
   layW := TLayout.Create(self);
  layW.name := 'shirina';
  layW.parent := layContainer;
  layW.height := 45;
 
  layH := TLayout.Create(self);
  layH.name := 'vysita';
  layH.parent := layContainer;
  layH.height := 45;
  layH.position.Y := 46;
 
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  layW.parent:=NIL;
  freeAndNil(layW);
  layH.parent:=NIL;
  freeAndNil(layH);
end;
 
end.
Миниатюры
Поиск компонента по имени  
FIL
Модератор
 Аватар для FIL
3363 / 2501 / 476
Регистрация: 19.09.2012
Сообщений: 7,817
13.11.2016, 11:25     Поиск компонента по имени #14
Цитата Сообщение от SHiipa Посмотреть сообщение
на андроиде выкидывает ошибку
Этот кусок кода отвечает за изменение имени компонента и генерирует ошибку, если компонент с таким именем уже существует.

Попробуй вообще имена не задавать. В варианте krapotkin'а это не требуется.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.11.2016, 21:42     Поиск компонента по имени
Еще ссылки по теме:

Delphi FireMonkey Передать значение в обработчике события для динамически созданного компонента
Delphi FireMonkey Текст Header в элементе (Item) компонента ListView
Delphi FireMonkey Size динамического компонента

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
krapotkin
 Аватар для krapotkin
1956 / 1902 / 490
Регистрация: 14.04.2014
Сообщений: 9,302
13.11.2016, 21:42     Поиск компонента по имени #15
продублирую тут
так как мы создали
layX:=TLayout.Create(self); то нужно еще
RemoveComponent(layX);
либо можно было
layX:=TLayout.Create(nil);
Yandex
Объявления
13.11.2016, 21:42     Поиск компонента по имени
Ответ Создать тему
Опции темы

Текущее время: 14:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru