|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Передать свойство как параметр в процедуру
как передать свойство объекта в свою процедуру для дальнейшего изменения?
Код:
... 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
|
|||
|
|||
вот так не подойдет:
Код:
uses TypInfo; procedure TForm1.test(prop : String); begin SetPropValue(Edit1,prop,'aaaaa'); end; procedure TForm1.Button1Click(Sender: TObject); begin test('Text'); end; |
#3
|
|||
|
|||
а как ее использовать если передавать MaskEdit1.text?
нашел вот: https://translated.turbopages.org/pr...erty-in-delphi но как в функцию передать параметром MaskEdit1.text? |
#4
|
|||
|
|||
Цитата:
Код:
procedure ChangeText(Edit: TMaskEdit); begin Edit.Text := 'aaaaaa'; end; procedure TForm1.Button1Click(Sender: TObject); begin ChangeText(MaskEdit1); end; |
#5
|
|||
|
|||
Цитата:
Ну, там об использовании 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; Цитата:
Ну, например, может мешать то, что в разных компонентах некоторые св-ва называются немного по разному (см пример с TEdit и TLabel). Тут все зависит от конкретной задачи. |
#6
|
|||
|
|||
Да спасибо за уточнения, так и буду делать!
|
#7
|
|||
|
|||
но если есть идеи для конкретного случая:
но как в функцию передать параметром MaskEdit1.text и там изменить text? то буду благодарен... |
#8
|
|||
|
|||
Цитата:
Ну, если очень хочется поизвращаться, то можно делать так: 1. Как параметр передаем строку 'MaskEdit1.text' 2. Внутри парсим на имя компонента и имя свойства - получаем 'MaskEdit1' и 'text' 3. Ищем компонент по имени через FindComponent 4. Через RTTI (см примеры выше - SetPropValue) меняем значение свойства. Как то так. |
#9
|
|||
|
|||
Вот, приехал домой и накидал код:
Код:
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
|
|||
|
|||
а вот передать строкой и распарсить это прямо интересная идея!
спасибо! попробую применить) |