Форум программистов, компьютерный форум, киберфорум
Delphi
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
10 / 10 / 7
Регистрация: 18.10.2015
Сообщений: 160

RTTI XE7

26.11.2015, 09:29. Показов 2399. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Хотелось бы узнать, есть ли обёртка по работе с RTTI к примеру

Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var 
 GuiRtti:TGuiRtti;
 GetDelim:Char;
 Text:string;
 ....
 
 GuiRtti := TGuiRtti.Create('System.Classes.TStrings', []); 
 if GuiRtti <> nil then
 begin
    GuiRtti.Invoke('Add', ['Текст']);
    GuiRtti.Value('Delimiter', [':']);
    GetDelim := GuiRtti.GetValue('Delimiter');
    
    GuiRtti.Value('Names', [0, 'Изменили текст']);
    Text := GuiRtti.GetValue('Names', [0]);
 end;


Добавлено через 10 минут
Была бы полезно если бы она сама ещё могла параметр конвертритровать в нужный тип, к примеру, если мы передаём в свойств parent цифры, то он бы попытался её конвертировать в класс TObject или TClass если это tkClassRef
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.11.2015, 09:29
Ответы с готовыми решениями:

Модуль RTTI.PAS
Приветствую! Кто-нибудь из вас использует Delphi 2010 ? У меня стоит семерка и мне Очень нужен модуль “RTTI.pas” А устанавливать...

Delphi XE7
Здравствуйте уважаемые пользователи данного форума у меня возникла проблема с копированием содержимого в буфер обмена и вставка из буфера...

Не устанавливается delphi xe7
Здравствуйте. Не ставиться дельфи хе7, пишет вот это вот: Ось win 7 64x. Такая же проблема на XE5 версии

13
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
26.11.2015, 11:01
Класс RTTI.TRttiContext являет собой интересующую тебя оболочку RTTI
0
10 / 10 / 7
Регистрация: 18.10.2015
Сообщений: 160
26.11.2015, 12:18  [ТС]
Цитата Сообщение от mss Посмотреть сообщение
Класс RTTI.TRttiContext являет собой интересующую тебя оболочку RTTI
Если бы да кабы, то бы и не задавал.

Я привёл код, там явно видно что через одну функцию (Value\GetValue) можно обратиться к индексированному свойству - обычному, а так же и к полю Field (хоть явно это не показано)

(По этому я и просил помочь найти готовое средство обёртки)

И не нужно где то в дебрях хранить Owner (TStrings) что бы потом составить по нему цепочку обращений для свойств. Вот вообщем, приведу пример, тока там ещё и обработка вызовов функций всунута

Кликните здесь для просмотра всего текста
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
      TRttiIT := TRttiType(selfOBJ);
      if TRttiIT <> nil then
        begin
        TMethod := TRttiIT.GetMethod(AName);
        if (TMethod = nil) and (ZW = 2) then
        begin
          selfOBJ := ZvalGetInt(ZOwnerSelf^^);
          if selfOBJ = 0 then Exit;
          
          Instance := TRttiType(selfOBJ);
 
          TPropertyIdx := RttiContext.GetType(Instance.ClassInfo).GetIndexedProperty(AName);
          if TPropertyIdx <> nil then
          begin
            NumParams := Length(TPropertyIdx.ReadMethod.GetParameters);
 
            SetLength(Args, NumParams);
            I := 0;
            for TParameter in TPropertyIdx.ReadMethod.GetParameters do
            begin
              ZValArrayKeyFind(Zargs^, I, tmp);
              Args[I] := ParEx(TParameter.ParamType, tmp^);
              inc(I);
            end;
 
            if (NumParams = Num) and TPropertyIdx.IsReadable then
              TestSetRet(return_value, TPropertyIdx.GetValue(Instance, Args))
            else if (NumParams = Num - 1) and TPropertyIdx.IsWritable then
            begin
              ZValArrayKeyFind(Zargs^, Num - 1, tmp);
              TPropertyIdx.SetValue(Instance, Args, ParEx(TPropertyIdx.PropertyType, tmp^));
            end;
          end
          else
          begin
            TProperty := RttiContext.GetType(Instance.ClassInfo).GetProperty(AName);
            if TProperty <> nil then
            begin
              if TProperty.IsWritable and (Num = 1) or (Num = 2) then
              begin
                if Num = 1 then
                begin
                  ZValArrayKeyFind(Zargs^, 0, tmp);
                  TProperty.SetValue(Instance, ParEx(TProperty.PropertyType, tmp^));
                end
                else if Num = 2 then
                begin
                  ZValArrayKeyFind(Zargs^, 0, tmp);
                  ZValArrayKeyFind(Zargs^, 1, tmp2);
 
                  TProperty.SetValue(Instance, ParEx(TProperty.PropertyType, tmp^, tmp2^, TSRMLS_DC))
                end;
              end
              else if TProperty.IsReadable then
                TestSetRet(return_value, TProperty.GetValue(Instance))
            end
            else
            begin
              TField := RttiContext.GetType(Instance.ClassInfo).GetField(AName);
              if TField <> nil then
              begin
                if Num = 1 then
                begin
                  ZValArrayKeyFind(Zargs^, 0, tmp);
                  TField.SetValue(Instance, ParEx(TField.FieldType, tmp^));
                end
                else
                  TestSetRet(return_value, TField.GetValue(Instance));
              end
            end;
          end;
        end
        else if TMethod <> nil then
        begin
          Args := Par(TMethod.GetParameters, Zargs^);
 
          if ZW = 2 then
            selfOBJ := ZvalGetInt(ZOwnerSelf^^);
 
          if TMethod.MethodKind in [mkConstructor, mkClassProcedure, mkClassFunction, mkClassConstructor, mkClassDestructor] then
            TestSetRet(return_value, TMethod.Invoke(TRttiIT.AsInstance.MetaclassType, Args))
          else if TRttiIT.AsInstance.MetaclassType.InheritsFrom(TApplication)
          then
            TestSetRet(return_value, TMethod.Invoke(Application, Args))
          else if (selfOBJ <> 0) and (ZW = 2) then
          begin
            Kind := RttiContext.GetType(TRttiType(selfOBJ).ClassInfo)
              .Handle.Kind;
            if Kind = tkClass then
              TestSetRet(return_value, TMethod.Invoke(TObject(selfOBJ), Args))
            else if Kind = tkClassRef then
              TestSetRet(return_value, TMethod.Invoke(TClass(selfOBJ), Args));
          end;
 
          NumParams := Length(TMethod.GetParameters);
 
          if NumParams <> 0 then
          begin
            for I := 0 to NumParams - 1 do
              if (pfVar in TMethod.GetParameters[I].Flags) or
                (pfOut in TMethod.GetParameters[I].Flags) then
              begin
                ZValArrayKeyFind(Zargs^, I, tmp);
                TestSetRet(tmp^, Args[I]);
              end;
          end;
 
        end;
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
26.11.2015, 12:50
Мне, например, так вполне хватает "оберток" в виде RTTI.TRttiContext (для быстрого доступа к любым зарегистрированным методам) и набора рег.процедур/ф-ций из состава TypInfo (для быстрого доступа к любым зарегистрированным полям и свойствам)
0
10 / 10 / 7
Регистрация: 18.10.2015
Сообщений: 160
26.11.2015, 13:17  [ТС]
Вы хотите сказать что тот длинный код можно заменить на пару строк ? не обращая внимания на свойства (индексированные) полей (Field) А так же конвертацию параметров ?
(которая между прочим ещё занимает плюсом 96 строк и 2872 символов)
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
26.11.2015, 14:05
я хочу сказать что универсальной на все случаи жизни оболочки не существует
0
10 / 10 / 7
Регистрация: 18.10.2015
Сообщений: 160
26.11.2015, 19:25  [ТС]
Цитата Сообщение от mss Посмотреть сообщение
я хочу сказать что универсальной на все случаи жизни оболочки не существует
А какие вообще существуют ?

Добавлено через 5 часов 1 минуту
Неужели нет обёрток по лёгкой работе с RTTI ?
0
10 / 10 / 7
Регистрация: 18.10.2015
Сообщений: 160
28.11.2015, 14:01  [ТС]
Раз уж так хорошо назвал тему, что самая первая в списке поисковика гугла.. то выложу хоть что - то.

Знаю для опытных может показаться это банальным, но всё - же.
Функция позволяет вызывать любой методов полученный с помощью GetMethod
Delphi
1
2
3
4
5
6
7
8
9
function InvokeMethod(Method:TRttiMethod; const Args: array of TValue):TValue;
begin
  if Method.Parent.Handle.Kind = tkClass then
    Result := Method.Invoke(TObject(Method.Parent.Handle.TypeData), Args)
  else if Method.Parent.Handle.Kind = tkClassRef then
    Result := Method.Invoke(Method.Parent.Handle.TypeData.ClassType, Args)
  else
    Result := nil;
end;
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
28.11.2015, 21:33
Малополезный шматок кода

Поиск нужного TRttiMethod потребует в разы большее кол-во телодвижений.

Но зато первым параметром можно будет передавать либо имя метода, либо его адрес, либо индекс VMT
0
10 / 10 / 7
Регистрация: 18.10.2015
Сообщений: 160
29.11.2015, 13:21  [ТС]
Цитата Сообщение от mss Посмотреть сообщение
Малополезный шматок кода
Знаю для опытных может показаться это банальным, но всё - же.
Цитата Сообщение от mss Посмотреть сообщение
Поиск нужного TRttiMethod потребует в разы большее кол-во телодвижений.
Почему в интернете нигде нету примера что можно от TRttiMethod сделать "Method.Parent.Handle...." этакое ?
Думаю в этом и полезность примера. А разработчики среды могли бы заранее всё это дела автоматизировать своими ручками, хотя бы в отельном методе, но не стали

Цитата Сообщение от mss Посмотреть сообщение
Но зато первым параметром можно будет передавать либо имя метода, либо его адрес, либо индекс VMT
+
Кликните здесь для просмотра всего текста

Это overload
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
function TGUIRtti.InvokeMethod(Method:TRttiMethod; const Args: array of TValue):TValue;
var
  LParams  : TRttiParameter;
  P : TRttiProperty;
begin
  Result := nil;
  if Length(Args) = Length(Method.GetParameters) then
  begin
    if Method.Parent.Handle.Kind = tkClass then
      Result := Method.Invoke(TObject(Method.Parent.Handle.TypeData), Args)
    else if Method.Parent.Handle.Kind = tkClassRef then
      Result := Method.Invoke(Method.Parent.Handle.TypeData.ClassType, Args)
  end else
    raise EInvocationError.Create('Parameter count mismatch  in '  + Method.ToString );
end;
             
function TGUIRtti.InvokeMethod(MethodName:string; const Args: array of TValue):TValue;
var
 LMethod  : TRttiMethod;
 LParams  : TArray<TRttiParameter>;
 found    : Boolean;
begin
  found := false;
  for LMethod in TType.GetMethods(MethodName) do
  begin
    if found then break;
 
    ...
  end;
  
  ...
  InvokeMethod(LMethod, Args);
  ...
end;


Добавлено через 4 часа 57 минут
Может кому будет интересно посмотреть на это творение...

- Вызываем конструктор с неизвестным именем, или более подходящий по параметрам
Delphi
1
InvokeMethod('', ['Test'], [mkConstructor]);
- Вызываем деструктор с неизвестным именем, или более подходящий по параметрам
Delphi
1
InvokeMethod('', [], [mkDestructor]);
- Вызываем обычный метод более подходящий по параметрам
Delphi
1
InvokeMethod('Bar', ['Text']);

Если параметры не совпадают с методами, то вызов не происходит, даже если метод есть

Кликните здесь для просмотра всего текста
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
{ TGUIRtti }
 
constructor TGUIRtti.Create(const ClassName: string; Args: TArray<TValue>);
begin
  TType := GuiFindType(ClassName);
  TConstructor := InvokeMethod('', Args, [mkConstructor])
end;
 
function TGUIRtti.InvokeMethod(Method:TRttiMethod; const Args: array of TValue):TValue;
begin
  Result := nil;
  if TType = nil then exit(Result);
  if Length(Args) = Length(Method.GetParameters) then
  begin
    if Method.Parent.Handle.Kind = tkClass then
      Result := Method.Invoke(TObject(Method.Parent.Handle.TypeData), Args)
    else if Method.Parent.Handle.Kind = tkClassRef then
      Result := Method.Invoke(Method.Parent.Handle.TypeData.ClassType, Args)
  end else
    ErrorInfo('Parameter count mismatch  in '  + Method.ToString);
end;
 
 
function TGUIRtti.InvokeMethod(MethodName:string; const Args: array of TValue; IsMethodKind:ArrMethodKind = nil):TValue;
var
  Parameter : TRttiParameter;
  Methods : TArray<TRttiMethod>;
  Method  : TRttiMethod;
  MethodKind : TMethodKind;
  IdxArgs, IdxNum : integer;
  IsMk:Boolean;
begin
  Result := nil;
 
  if TType = nil then exit(Result);
 
  MethodName := trim(MethodName);
  if (MethodName = '') and (IsMethodKind <> nil) then
    Methods := TType.GetMethods
  else if (MethodName <> '') then
    Methods := TType.GetMethods(MethodName)
  else
    exit(Result);
 
  for IdxNum := 0 to Length(Methods) - 1 do
  begin
    Method := Methods[IdxNum];
 
    IsMk := false;
    if IsMethodKind = nil then
      IsMk := true
    else for MethodKind in IsMethodKind do
      if MethodKind = Method.MethodKind then
      begin
        IsMk := true;
        Break;
      end;
 
    if IsMk and (Length(Args) = Length(Method.GetParameters)) then
    begin
      IdxArgs := 0;
      for Parameter in Method.GetParameters do
      begin
        if not (Args[IdxArgs].TypeInfo = Method.GetParameters[IdxArgs].ParamType.Handle) then
        begin
          Method := nil;
          Break;
        end;
        inc(IdxArgs);
      end;
    end else
      Method := nil;
 
    if Method <> nil then
      Break;
  end;
 
  if Method <> nil then
    Result := InvokeMethod(Method, Args)
end;
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
29.11.2015, 14:17
А где ты передаешь экземпляр (класса, метакласса, интерфейса или записи), метод которого должен быть вызван ?

Добавлено через 7 минут
На мой взгляд, вот так было бы удобнее:
Delphi
1
function TRTTIMethodInvoker.InvokeMethodOf<T>(Instance: <T>; AMethod: TValue; Params: array of TValue): TValue;
TRTTIMethodInvoker - некий класс, специално разработанный для вызова методов RTTI
Instance - экземпляр класса, метакласса, интерфейс или адрес записи, метод которого д.б. вызван
AMethod - имя, адрес или VMT-индекс метода
Parans - параметры
0
10 / 10 / 7
Регистрация: 18.10.2015
Сообщений: 160
30.11.2015, 02:24  [ТС]
Цитата Сообщение от mss Посмотреть сообщение
А где ты передаешь экземпляр (класса, метакласса, интерфейса или записи), метод которого должен быть вызван ?
Это автоматизированно, но крива в том примере... Вот что у меня сейчас получилась
Кликните здесь для просмотра всего текста
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
constructor TGUIRtti.Create(const ClassName: string; Args: TArray<TValue>);
begin
  TType := GuiFindType(ClassName);
  TConstructor := InvokeMethod('', Args, [mkConstructor])
end;
 
function TGUIRtti.InvokeMethod(Method: TRttiMethod;
  const Args: array of TValue): TValue;
begin
  Result := nil;
  if TType = nil then
    Exit(Result);
  if Length(Args) = Length(Method.GetParameters) then
  begin
    if Method.Parent.Handle = PTypeInfo(TypeInfo(TApplication)) then
      Result := Method.Invoke(Application, Args)
    else if Method.Parent.Handle = PTypeInfo(TypeInfo(TScreen)) then
      Result := Method.Invoke(Screen, Args)
    else if Method.IsConstructor or Method.IsDestructor or Method.IsClassMethod then
      Result := Method.Invoke(Method.Parent.AsInstance.MetaclassType, Args)
    else
      Result := Method.Invoke(TConstructor, Args)
  end else
    ErrorInfo('Parameter count mismatch  in ' + Method.ToString);
end;
 
function TGUIRtti.InvokeMethod(MethodName: string; const Args: array of TValue;
  IsMethodKind: ArrMethodKind = nil): TValue;
var
  Parameter: TRttiParameter;
  Methods: TArray<TRttiMethod>;
  Method: TRttiMethod;
  MethodKind: TMethodKind;
  IdxArgs, IdxNum, g: integer;
  IsMk: Boolean;
  args2: TArray<TValue>;
  fef:TValue;
begin
  Result := nil;
 
  if TType = nil then
    Exit(Result);
 
  MethodName := Trim(MethodName);
  if (MethodName = '') and (IsMethodKind <> nil) then
    Methods := TType.GetMethods
  else if (MethodName <> '') then
    Methods := TType.GetMethods(MethodName)
  else
    Exit(Result);
 
  for IdxNum := 0 to Length(Methods) - 1 do
  begin
    Method := Methods[IdxNum];
 
    IsMk := false;
    if IsMethodKind = nil then
      IsMk := true
    else
      for MethodKind in IsMethodKind do
        if MethodKind = Method.MethodKind then
        begin
          IsMk := true;
          Break;
        end;
 
    if IsMk and (Length(Args) = Length(Method.GetParameters)) then
    begin
      IdxArgs := 0;
      for Parameter in Method.GetParameters do
      begin
 
        if not(Args[IdxArgs].TypeInfo = Method.GetParameters[IdxArgs]
        .ParamType.Handle) then
        begin
          if (((Method.GetParameters[IdxArgs].ParamType.TypeKind = tkClass) or
            (Method.GetParameters[IdxArgs].ParamType.TypeKind = tkClassRef)) and
            (Args[IdxArgs].Kind <> tkUnknown)) then
          begin
            Method := nil;
          end;
        end;
        inc(IdxArgs);
        if Method = nil then
          Break;
      end;
 
    end
    else
      Method := nil;
 
    if Method <> nil then
      Break;
  end;
 
  if Method <> nil then
    Result := InvokeMethod(Method, Args)
end;
function TGUIRtti.GetValueTest(Obj: TRttiMember; const Args: array of TValue; _Type:Byte): TValue;
var
  TPropertyIdx: TRttiIndexedProperty;
  TProperty: TRttiProperty;
  TField: TRttiField;
 
  setter: TRttiMethod;
  argsV: TArray<TValue>;
  i: Integer;
begin
  Result := nil;
 
  if _Type = 0 then
  begin
    TPropertyIdx := TRttiIndexedProperty(Obj);
 
    if TPropertyIdx.ReadMethod <> nil then
    begin
      if Length(TPropertyIdx.ReadMethod.GetParameters) = Length(Args) then
      begin
        Exit(TPropertyIdx.ReadMethod.Invoke(TConstructor, Args));
      end;
    end;
 
    if TPropertyIdx.WriteMethod <> nil then
    begin
      if Length(TPropertyIdx.WriteMethod.GetParameters) = Length(Args) then
      begin
        Exit(TPropertyIdx.WriteMethod.Invoke(TConstructor, Args));
      end;
    end;
  end else if _Type = 1 then
  begin
    TProperty := TRttiProperty(Obj);
 
    if TProperty.IsReadable and (Length(Args) = 0) then
    begin
      if TProperty.Parent.Handle.Kind = tkClass then
        Exit(TProperty.GetValue(TConstructor.AsObject))
      else if TProperty.Parent.Handle.Kind = tkClassRef then
        Exit(TProperty.GetValue(TConstructor.AsClass));
    end;
 
    if TProperty.IsWritable and (Length(Args) = 1) then
    begin
      if TProperty.Parent.Handle.Kind = tkClass then
        TProperty.SetValue(TConstructor.AsObject, Args[0])
      else if TProperty.Parent.Handle.Kind = tkClassRef then
        TProperty.SetValue(TConstructor.AsClass, Args[0]);
    end;
  end else if _Type = 2 then
  begin
    TField := TRttiField(Obj);
 
    if Length(Args) = 0 then
    begin
      if TField.Parent.Handle.Kind = tkClass then
        Exit(TField.GetValue(TConstructor.AsObject))
      else if TField.Parent.Handle.Kind = tkClassRef then
        Exit(TField.GetValue(TConstructor.AsClass));
    end;
 
    if Length(Args) = 1 then
    begin
      if TField.Parent.Handle.Kind = tkClass then
        TField.SetValue(TConstructor.AsObject, Args[0])
      else if TField.Parent.Handle.Kind = tkClassRef then
        TField.SetValue(TConstructor.AsClass, Args[0]);
    end;
  end;
end;
 
function TGUIRtti.Value(prop: string; const Args: array of TValue): TValue;
var
  Test: TRttiMember;
begin
  Test := TRttiMember(TType.GetIndexedProperty(prop));
  if Test <> nil then
    exit(GetValueTest(Test, Args, 0));
 
  Test := TRttiMember(TType.GetProperty(prop));
  if Test <> nil then
    exit(GetValueTest(Test, Args, 1));
 
  Test := TRttiMember(TType.GetField(prop));
  if Test <> nil then
    exit(GetValueTest(Test, Args, 2));
end;


Вот пример работы
Кликните здесь для просмотра всего текста
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    Application := TGUIRtti.Create('System.Classes.TStringList', []);
    Application.InvokeMethod('Add', ['Add Text']);
    Application.InvokeMethod('Add', ['Add Text656j']);
 
    Writeln( Application.Value('Text', []).toString );
 
    Writeln( Application.Value('FCount', []).toString );
 
    Application.Value('FCount', [34]);
 
    Writeln( Application.Value('FCount', []).toString );
 
    Application.Value('Strings', [0, 'ergerg12']);
 
    Writeln(Application.Value('Strings', [0]).toString );
 
    Application.Value('Text', ['END! TEXT!']);
 
    Writeln( Application.Value('Text', []).toString );


А выдаст
Code
1
2
3
4
5
6
7
Add Text
Add Text656j
 
2
34
ergerg12
END! TEXT!


В любом случае надо ещё многое продумать
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
30.11.2015, 08:20
Цитата Сообщение от _Фролов_ Посмотреть сообщение
Это автоматизированно
У тебя объект, создаваемый в теле
Delphi
1
constructor TGUIRtti.Create
варится в собственном соку.

И нет возможности вызвать метод объекта, созданного вне контекста оболочки TGUIRtti
0
10 / 10 / 7
Регистрация: 18.10.2015
Сообщений: 160
30.11.2015, 08:47  [ТС]
Цитата Сообщение от mss Посмотреть сообщение
И нет возможности вызвать метод объекта, созданного вне контекста оболочки TGUIRtti
А это и не нужно, учитывая где и как он будет использоваться.
Сейчас мне удалось с помощью него создавать окна, и на них кнопки, с привязкой событий. Что уже неплохо

Добавлено через 9 минут
Цитата Сообщение от mss Посмотреть сообщение
И нет возможности вызвать метод объекта, созданного вне контекста оболочки TGUIRtti

Цитата Сообщение от _Фролов_ Посмотреть сообщение
В любом случае надо ещё многое продумать
Я не говорю что этого ещё не будет, тока для функционала
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.11.2015, 08:47
Помогаю со студенческими работами здесь

Значок exe в Delphi XE7
Как поменять значок из стандартного на свой в Delphi XE7??? O_o Загружаю картинку в Project - Options - Application но иконка меняется...

Как добавить TChart для XE7?
В списке инструментов отсутствует TChart. Как его добавить/где взять для х86 приложений. Delphi XE7

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

Delphi7 и RAD Studio XE7
Я сделал проект на Delphi 7 и отдал его доделать знакомому. Как оказалось он доделывал его на RAD Studio XE7. Собственно когда он...

DBLookUpCombobox delphi xe7 primary key
Есть простая таблица, например students ID_name - serial Name - varchar БД PostgreSQL ListSourse - datasource от FDQuery к таблице ...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru