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

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

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

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

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


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

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

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

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

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


Поддерживает ли это Скрипт - без понятия.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Принудительное создание TRRI-типа
    #39933111
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пробую так. 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
Принудительное создание TRRI-типа
    #39933120
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А так?
Код: pascal
1.
2.
TPlayersArray_ = array of TPlayerInfo;
TPlayersArray = type TPlayersArray_
...
Рейтинг: 0 / 0
Принудительное создание TRRI-типа
    #39933126
Vizit0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
о да, так взлетело!

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

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

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


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

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



И он не понимал как этот тип использовать, и выбрасывал в AV
...
Рейтинг: 0 / 0
Принудительное создание TRRI-типа
    #39933419
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВсеРазумный
А кто нибудь знает, пофиксили-ли вызов функции через 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
11 сообщений из 11, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Принудительное создание TRRI-типа
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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