Форум программистов, компьютерный форум, киберфорум
Наши страницы

Delphi: FireMonkey

Войти
Регистрация
Восстановить пароль
 
SHiipa
0 / 0 / 0
Регистрация: 10.07.2011
Сообщений: 158
#1

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

12.11.2016, 08:05. Просмотров 474. Ответов 14
Метки нет (Все метки)

На форме создан [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 ?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.11.2016, 08:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Поиск компонента по имени (Delphi FireMonkey):

Поиск класса по имени - Delphi
Всем доброго времени суток. Помогите, пожалуйста, решить одну проблему. У меня есть класс TMyClass и куча различных потомков...

Поиск компонента для Rad Studio XE7 - работа со сканером - Delphi
какие есть компоненты для работы со сканером, камерой (Для стандартного VCL приложения)

Поиск компонента по имени - Delphi
название компонента храниться в бд - на пример edit1 вопрос такой - если бы компонент не создавался в runtime то я бы просто написал ...

Динамическое изменение имени компонента - C++ Builder
Доброго времени суток! Помогите решить проблему: возникла необходимость изменять свойство нескольких однотипных компонентов сразу, но...

Динамическое определение имени компонента - VBA
Здравствуйте товарищи гуру! Я в VBA первый день(а сдавать курсовую мне после завтра) и не могу понять как динамически определять имя...

Из имени компонента сделать строку ... - Delphi
Вопрос, наверное, глупый, но как имя компонента сделать строковой переменной? А то мне надо из имени вытащить номер, но не получается ...

14
FIL
Модератор
3375 / 2513 / 478
Регистрация: 19.09.2012
Сообщений: 7,845
12.11.2016, 10:18 #2
У тебя владельцем 'vysita' является 'shirina', а ты его ищешь на форме почему-то.
0
SHiipa
0 / 0 / 0
Регистрация: 10.07.2011
Сообщений: 158
12.11.2016, 10:27  [ТС] #3
значит FindComponent ищет только по форме?. а как его можно найти в моем случае
0
FIL
Модератор
3375 / 2513 / 478
Регистрация: 19.09.2012
Сообщений: 7,845
12.11.2016, 11:51 #4
Функция FindComponent ищет не по форме, а среди принадлежащих вызывающему ее объекту компонентов.
Если сделаешь владельцем форму, то найдешь через FindComponent формы.
0
SHiipa
0 / 0 / 0
Регистрация: 10.07.2011
Сообщений: 158
12.11.2016, 11:55  [ТС] #5
Владельца тут менять нельзя нужно как то подругому найти
0
krapotkin
2667 / 2543 / 644
Регистрация: 14.04.2014
Сообщений: 12,274
Записей в блоге: 7
12.11.2016, 12:17 #6
я фигею, сначала мы создаем компонент и выкидываем ссылку на него за ненужностью
а потом старательно ищем ее и не можем найти...
что мешает сохранять все, что вы насоздавали?
и не вижу смысла в использовании простых процедур, когда вокруг ООП. сделайте их методами класса
и храните в полях класса все нужные вам ссылки
0
FIL
Модератор
3375 / 2513 / 478
Регистрация: 19.09.2012
Сообщений: 7,845
12.11.2016, 12:30 #7
Цитата Сообщение от SHiipa Посмотреть сообщение
Владельца тут менять нельзя
Ну тогда ищи через FindComponent компонента 'shirina', который является владельцем 'vysita'.
1
SHiipa
0 / 0 / 0
Регистрация: 10.07.2011
Сообщений: 158
12.11.2016, 13:42  [ТС] #8
krapotkin код на компьютере работает нормально но при компиляции под андроид при повторном запуске выдает ошибку что то связаное с именами в памяти я таким образом хочу добится полной очистки памяти выделенной под дочерние элементы компонента 'shirina'

FIL а можно код
0
FIL
Модератор
3375 / 2513 / 478
Регистрация: 19.09.2012
Сообщений: 7,845
12.11.2016, 13:59 #9
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от SHiipa Посмотреть сообщение
а можно код
Delphi
1
((Form2.FindComponent('shirina') as TLayout).FindComponent('vysita') as TLayout)
Добавлено через 31 секунду
И кстати, что мешает владельца поменять?
1
krapotkin
2667 / 2543 / 644
Регистрация: 14.04.2014
Сообщений: 12,274
Записей в блоге: 7
12.11.2016, 14:06 #10
Цитата Сообщение от SHiipa Посмотреть сообщение
что то связаное с именами
работа с объектами под win и не-win кардинально отличается
под андроид объект будет жить пока на него есть хоть одна ссылка
посмотрите код TObject.Free там только begin end;
так что обнуляйте ссылки и делайте Parent:=nil; чтобы объект был разрушен

и это не меняет моего мнения, высказанного ранее
0
SHiipa
0 / 0 / 0
Регистрация: 10.07.2011
Сообщений: 158
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;
не помогло устранить ошибку, в чем я ошибся?
0
krapotkin
2667 / 2543 / 644
Регистрация: 14.04.2014
Сообщений: 12,274
Записей в блоге: 7
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;
0
SHiipa
0 / 0 / 0
Регистрация: 10.07.2011
Сообщений: 158
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.
0
Миниатюры
Поиск компонента по имени  
FIL
Модератор
3375 / 2513 / 478
Регистрация: 19.09.2012
Сообщений: 7,845
13.11.2016, 11:25 #14
Цитата Сообщение от SHiipa Посмотреть сообщение
на андроиде выкидывает ошибку
Этот кусок кода отвечает за изменение имени компонента и генерирует ошибку, если компонент с таким именем уже существует.

Попробуй вообще имена не задавать. В варианте krapotkin'а это не требуется.
0
krapotkin
2667 / 2543 / 644
Регистрация: 14.04.2014
Сообщений: 12,274
Записей в блоге: 7
13.11.2016, 21:42 #15
продублирую тут
так как мы создали
layX:=TLayout.Create(self); то нужно еще
RemoveComponent(layX);
либо можно было
layX:=TLayout.Create(nil);
0
13.11.2016, 21:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.11.2016, 21:42
Привет! Вот еще темы с ответами:

Поиск файлов по части имени \ имени - Delphi
var SR: TSearchRec; Folder: String; begin Folder := 'D:\'; Folder := IncludeTrailingPathDelimiter(Folder); if...

Получить Type компонента по его имени - C#
вобщем химичу я со стандартными компонентами, пытаюсь получить Type, ну к примеру кнопки, и не получается, вот как делаю string ClassName...

MS Access Выбор имени компонента через ComboBox - Delphi БД
как правильно сделать??? ......... var strFieldOtchet1:string; ................................ case ComboBox1.ItemIndex of ...

Разработка компонента. Указание имени шаблона отображения - Joomla
Добрый вечер. Изучаю создание компонента под joomla, сейчас нахожусь на этапе создании шаблона отображения. Все шаблоны имеют примерно...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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