Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 18.03.2024, 07:47
brotherirk brotherirk вне форума
Прохожий
 
Регистрация: 17.06.2022
Сообщения: 5
Версия Delphi: 10
Репутация: 10
По умолчанию Передать свойство как параметр в процедуру

как передать свойство объекта в свою процедуру для дальнейшего изменения?
Код:
...

 obj.proc(var AObject : Tobject);
begin
 if AObject is TMaskEdit then (Aobject as TMaskEdit).text:= '1';
end;
...
 obj.proc(MaskEdit1.text);

или лучше так:


Код:
obj.proc(var txt: TMaskedText);
 begin
 txt:= '1';
 end;
Админ: Пользуемся тегами при оформлении кода!

Последний раз редактировалось Admin, 18.03.2024 в 09:21.
Ответить с цитированием
  #2  
Старый 18.03.2024, 10:41
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,056
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

вот так не подойдет:
Код:
uses TypInfo;

procedure TForm1.test(prop : String);
begin
  SetPropValue(Edit1,prop,'aaaaa');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  test('Text');
end;
Ответить с цитированием
  #3  
Старый 18.03.2024, 10:46
brotherirk brotherirk вне форума
Прохожий
 
Регистрация: 17.06.2022
Сообщения: 5
Версия Delphi: 10
Репутация: 10
По умолчанию

а как ее использовать если передавать MaskEdit1.text?
нашел вот: https://translated.turbopages.org/pr...erty-in-delphi
но как в функцию передать параметром MaskEdit1.text?
Ответить с цитированием
  #4  
Старый 18.03.2024, 15:23
xchgeaxeax xchgeaxeax вне форума
Прохожий
 
Регистрация: 11.05.2023
Сообщения: 15
Версия Delphi: D7, Laz v2.2.6
Репутация: 10
По умолчанию

Цитата:
Сообщение от brotherirk
как передать свойство объекта в свою процедуру для дальнейшего изменения?
Если надо изменить свойство объекта, почему не передать в параметрах сам этот объект? Этому что-то мешает?

Код:
procedure ChangeText(Edit: TMaskEdit);
begin
  Edit.Text := 'aaaaaa';
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ChangeText(MaskEdit1);
end;
Ответить с цитированием
  #5  
Старый 18.03.2024, 18:34
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,056
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от brotherirk
а как ее использовать если передавать MaskEdit1.text?
нашел вот: https://translated.turbopages.org/pr...erty-in-delphi
но как в функцию передать параметром MaskEdit1.text?

Ну, там об использовании RTTI и говорится. Т.е. именно то, что в моем примере используется. Для MaskEdit1.text надо делать так:
Код:
uses TypInfo;

procedure TForm1.test(obj : TObject; prop : String; value : String);
begin
  SetPropValue(obj,prop,value);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  test(Edit1,'text','aaa');
  test(Label1,'caption','bbb');
end;
собственно, обертка test здесь и не сильно нужна в таком варианте. Просто если нужна более сложная логика, но которую можно написать общим кодом под разные компоненты, то тогда такая обертка может быть полезной (к SetPropValue есть парная функция GetPropValue для чтения значения св-ва по имени).

Цитата:
Если надо изменить свойство объекта, почему не передать в параметрах сам этот объект? Этому что-то мешает?

Ну, например, может мешать то, что в разных компонентах некоторые св-ва называются немного по разному (см пример с TEdit и TLabel). Тут все зависит от конкретной задачи.
Ответить с цитированием
  #6  
Старый 19.03.2024, 03:05
brotherirk brotherirk вне форума
Прохожий
 
Регистрация: 17.06.2022
Сообщения: 5
Версия Delphi: 10
Репутация: 10
По умолчанию

Да спасибо за уточнения, так и буду делать!
Ответить с цитированием
  #7  
Старый 19.03.2024, 06:24
brotherirk brotherirk вне форума
Прохожий
 
Регистрация: 17.06.2022
Сообщения: 5
Версия Delphi: 10
Репутация: 10
По умолчанию

но если есть идеи для конкретного случая:
но как в функцию передать параметром MaskEdit1.text и там изменить text?
то буду благодарен...
Ответить с цитированием
  #8  
Старый 19.03.2024, 20:42
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,056
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от brotherirk
но если есть идеи для конкретного случая:
но как в функцию передать параметром MaskEdit1.text и там изменить text?
то буду благодарен...

Ну, если очень хочется поизвращаться, то можно делать так:
1. Как параметр передаем строку 'MaskEdit1.text'
2. Внутри парсим на имя компонента и имя свойства - получаем 'MaskEdit1' и 'text'
3. Ищем компонент по имени через FindComponent
4. Через RTTI (см примеры выше - SetPropValue) меняем значение свойства.

Как то так.
Ответить с цитированием
  #9  
Старый 20.03.2024, 06:28
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,056
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Вот, приехал домой и накидал код:
Код:
uses
  TypInfo, StrUtils, System.Types;

procedure TForm1.SetControlProperty(prop : String; value : Variant);
var
  compName : String;
  propName : String;
  obj : TComponent;
  arr : TStringDynArray;
begin
  arr := SplitString(prop,'.');
  if Length(arr) <> 2 then
    raise Exception.CreateFmt('Wrong component-property format. Expected "{component name}.{property name}", but got "%s".',[prop]);

  compName := arr[0];
  propName := arr[1];

  obj := FindComponent(compName);
  if not assigned(obj) then
    raise Exception.CreateFmt('Component not found (%s).',[compName]);

  SetPropValue(obj,propName,value);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  SetControlProperty('Edit1.text','value1');
  SetControlProperty('Label1.caption','label caption value');
  SetControlProperty('MaskEdit1.text','mask value');
  SetControlProperty('SpinEdit1.value',121);

  SetControlProperty('Edit2.text','edit on panel');
  SetControlProperty('Edit3.text','edit in group box');
end;

Как понятно из кода, первые 3 компонента "лежат" на самой форме, а вот второй компонент - на панельке, 3й - в груп боксе.
Вроде как все работает...
Ответить с цитированием
  #10  
Старый 20.03.2024, 07:31
brotherirk brotherirk вне форума
Прохожий
 
Регистрация: 17.06.2022
Сообщения: 5
Версия Delphi: 10
Репутация: 10
По умолчанию

а вот передать строкой и распарсить это прямо интересная идея!
спасибо! попробую применить)
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 00:30.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter