Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Принудительное создание TRRI-типа / 11 сообщений из 11, страница 1 из 1
02.03.2020, 16:22
    #39933087
Vizit0r
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Принудительное создание TRRI-типа
Имеем синоним типа
TCardinalDynArray = array of Cardinal;

В RTTI про него информации нет, что логично, ибо тип не отдельный, а синоним.

Но она нужна. Прям вот реально нужна.

Можно ли опциями компилятора, или еще как-то заставить компилятор добавить этот тип в RTTI, или придется извращаться с созданием-заполнением словарей для соответствия таких типов-синонимов реальным RTTI-типам? Притом что до компиляции узнать, какие типы будут добавлены, а какие нет - невозможно, т.е. тупо вручную.

Для PascalScript, если что.
...
Рейтинг: 0 / 0
02.03.2020, 16:37
    #39933099
Квейд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Принудительное создание TRRI-типа
Vizit0r
В RTTI про него информации нет


Точно?
...
Рейтинг: 0 / 0
02.03.2020, 16:37
    #39933100
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Принудительное создание TRRI-типа
Vizit0r,

Это не синоним типа. Это новый тип.
...
Рейтинг: 0 / 0
02.03.2020, 16:41
    #39933105
Vizit0r
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Принудительное создание TRRI-типа
точно, точно.

Ctx: TRttiContext;
...
for RttiType in ctx.GetTypes do
...

не найдет его. Вообще. Совсем.
...
Рейтинг: 0 / 0
02.03.2020, 16:44
    #39933107
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Принудительное создание TRRI-типа
Vizit0rИмеем синоним типа
TCardinalDynArray = array of Cardinal;

Чтобы не было синонимом надо писать так:
Код: sql
1.
TCardinalDynArray = type array of Cardinal;


Поддерживает ли это Скрипт - без понятия.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
02.03.2020, 16:47
    #39933111
Vizit0r
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Принудительное создание TRRI-типа
пробую так. Delphi 10.3.2.
Код: pascal
1.
  TPlayersArray = type array of TPlayerInfo;



[dcc32 Error] Stealth.Types.pas(107): E2029 Identifier expected but 'ARRAY' found

Код: pascal
1.
  TPlayersArray = type TArray<TPlayerInfo>;



[dcc32 Error] Stealth.Types.pas(107): E2574 Instantiated type can not be used for TYPE'd type declaration
...
Рейтинг: 0 / 0
02.03.2020, 16:54
    #39933120
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Принудительное создание TRRI-типа
А так?
Код: pascal
1.
2.
TPlayersArray_ = array of TPlayerInfo;
TPlayersArray = type TPlayersArray_
...
Рейтинг: 0 / 0
02.03.2020, 16:57
    #39933126
Vizit0r
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Принудительное создание TRRI-типа
о да, так взлетело!

Спасибо.
...
Рейтинг: 0 / 0
02.03.2020, 17:37
    #39933145
Квейд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Принудительное создание TRRI-типа
Dimitry Sibiryakov

Vizit0rИмеем синоним типа
TCardinalDynArray = array of Cardinal;

Чтобы не было синонимом надо писать так:
Код: sql
1.
TCardinalDynArray = type array of Cardinal;


Поддерживает ли это Скрипт - без понятия.
Это даже компилятор дельфи не поддердживает :))
...
Рейтинг: 0 / 0
02.03.2020, 20:08
    #39933192
Принудительное создание TRRI-типа
А кто нибудь знает, пофиксили-ли вызов функции через rtti\invoke ? Когда аргумент функции имел

Код: pascal
1.
X = type string\int\...;



И он не понимал как этот тип использовать, и выбрасывал в AV
...
Рейтинг: 0 / 0
03.03.2020, 11:54
    #39933419
Квейд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Принудительное создание TRRI-типа
ВсеРазумный
А кто нибудь знает, пофиксили-ли вызов функции через rtti\invoke ? Когда аргумент функции имел

Код: pascal
1.
X = type string\int\...;



И он не понимал как этот тип использовать, и выбрасывал в AV


Delphi XE7

Код: pascal
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.
unit Tasks;

interface

uses
  Winapi.Windows, Winapi.Messages,
  System.Classes, System.Types,
  System.Generics.Collections,
  System.Rtti, System.SysUtils, System.SyncObjs;

type
  TTaskRecord = packed record
    TaskName: string;
    TaskArgs: array of TValue;
  end;

  ETaskNotFound = class(Exception);

type
  TTaskThread = class(TThread)
  private class var
    FRttiContext: TRttiContext;
  private
    FTaskList: TThreadList<TTaskRecord>;
    FQueueEvent: TEvent;
    procedure StartTasking; {$IFNDEF DEBUG} inline; {$ENDIF}
    procedure StopTasking; {$IFNDEF DEBUG} inline; {$ENDIF}
    function IsTaskingFinished: Boolean;
  protected
    procedure BeforeExecute; virtual;
    procedure AfterExecute; virtual;
    procedure Execute; override;
    function HandleException: Boolean; virtual;
  public
    class constructor CreateContext;
    constructor Create; virtual;
    destructor Destroy; override;
    procedure CreateTask(const ATaskName: string; const ATaskArgs: array of TValue); overload;
  end;

implementation

uses
  Winapi.ActiveX;

resourcestring
  ERR_TASKEXCEPTION = 'TASK EXCEPTION HAS BEEN RAISED WIDTH MESSAGE: ''';

{ TTaskThread }

class constructor TTaskThread.CreateContext;
begin
  FRttiContext := TRttiContext.Create
end;

constructor TTaskThread.Create;
begin
  inherited Create(False);
  FQueueEvent := TEvent.Create(nil, True, False, '');
  FTaskList := TThreadList<TTaskRecord>.Create
end;

procedure TTaskThread.BeforeExecute;
begin
  CoInitializeEx(nil, COINIT_MULTITHREADED)
end;

procedure TTaskThread.AfterExecute;
begin
  CoUninitialize
end;

procedure TTaskThread.StartTasking;
begin
  TMonitor.Enter(Self);
  FQueueEvent.SetEvent;
  TMonitor.Exit(Self)
end;

procedure TTaskThread.CreateTask(const ATaskName: string; const ATaskArgs: array of TValue);
var
  TaskRecord: TTaskRecord;
  I: Integer;
begin
  with TaskRecord do
  begin
    SetLength(TaskArgs, Length(ATaskArgs));
    for I := 0 to High(ATaskArgs) do
      TaskArgs[I] := ATaskArgs[I];
    TaskName := ATaskName
  end;
  FTaskList.Add(TaskRecord);
  StartTasking
end;

procedure TTaskThread.StopTasking;
begin
  TMonitor.Enter(Self);
  FQueueEvent.ResetEvent;
  TMonitor.Exit(Self)
end;

procedure TTaskThread.Execute;
var
  Task: TTaskRecord;
  TaskExists: Boolean;
  TaskList: TList<TTaskRecord>;
  RttiType: TRttiType;
  RttiMethod: TRttiMethod;
begin
  try
    BeforeExecute;
    try
      while not Terminated do
      begin
        FQueueEvent.WaitFor;
        repeat
          TaskList := FTaskList.LockList;
          try
            TaskExists := TaskList.Count > 0;
            if TaskExists then
            begin
              Task := TaskList.First;
              TaskList.Delete(0)
            end;
          finally
            FTaskList.UnlockList
          end;
          if Terminated or not TaskExists then
            Break;
          with Task do
            try
              RttiType := FRttiContext.GetType(ClassType);
              RttiMethod := RttiType.GetMethod(TaskName);
              if Assigned(RttiMethod) then
                RttiMethod.Invoke(Self, TaskArgs)
              else
                raise ETaskNotFound.CreateFmt('TASK %s NOT FOUND', [TaskName])
            except
              if not HandleException then
                raise
            end
        until not TaskExists;
        StopTasking
      end
    finally
      AfterExecute
    end
  except
    OutputDebugString(PChar(Concat(ERR_TASKEXCEPTION, Exception(ExceptObject).Message, '''')))
  end
end;

function TTaskThread.HandleException: Boolean;
begin
  Result := True;
  OutputDebugString(PChar(Concat(ERR_TASKEXCEPTION, Exception(ExceptObject).Message, '''')))
end;

function TTaskThread.IsTaskingFinished: Boolean;
begin
  Result := Finished
end;

destructor TTaskThread.Destroy;
begin
  Terminate;
  FQueueEvent.SetEvent;
  while not TSpinWait.SpinUntil(IsTaskingFinished, INFINITE) do
    CheckSynchronize;
  inherited Destroy;
  FreeAndNil(FTaskList);
  FreeAndNil(FQueueEvent)
end;

end.



Код: pascal
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.
unit Unit11;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils,
  System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Tasks;

type
  TMyString = type string;

  TMainFormTasks = class(TTaskThread)
  public
    procedure TestMyString(const AText: TMyString);
  end;

  TMainForm = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    MainFormTasks: TMainFormTasks;
  end;

var
  MainForm: TMainForm;

implementation

{$R *.dfm}

{ TMainFormTasks }

procedure TMainFormTasks.TestMyString(const AText: TMyString);
begin
  Synchronize(procedure
    begin
      ShowMessage(AText)
    end);
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
  MainFormTasks := TMainFormTasks.Create;
  MainFormTasks.CreateTask('TestMyString', ['Test My String']);
end;

procedure TMainForm.FormDestroy(Sender: TObject);
begin
  MainFormTasks.Free
end;

end.



...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Принудительное создание TRRI-типа / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]