![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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
|
|||
|
|||
|
а вот передать строкой и распарсить это прямо интересная идея!
спасибо! попробую применить) |