powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Сериализация DFM-файл файла
4 сообщений из 29, страница 2 из 2
Сериализация DFM-файл файла
    #39868281
Linux_64
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DimaBr, так, надо соображать на трезвую голову. Мозг не работает. Завтра с утра продолжим, может кто-нибудь что ещё посоветует. Адрес указывает в никуда..., хотя может он и верный, но он не делает никакой привязки обработчика в модуле .pas, это просто TM.Code... только в виде строки. Все свойства добавляются в файл DFM-файл, так же как и в оригинале, но нет методов....
Ладно, утро вечера мудрёнее... Может что-нибудь придумаем. Спасибо за помощь!
Доброй ночи !
...
Рейтинг: 0 / 0
Сериализация DFM-файл файла
    #39868282
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторАдрес указывает в никуда...,
Если адрес в никуда, то почему должно что-то записываться ?
...
Рейтинг: 0 / 0
Сериализация DFM-файл файла
    #39868314
Linux_64
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вернёмся к нашим баранам...
Присваиваются значения свойств для любой категории типов, кроме tkMethod.
Если вручную создать обработчик в коде pas для события OnDblClick и до компиляции внести вручную изменение в dfm строку OnDblClick = NewForm1DblClick , то компиляция проходит успешно, создаётся .dcu и теперь если скомпилировать весь проект, то при двойном клике на форме обработчик срабатывает. Все в порядке, но как это автоматизировать? Каким образом среда Делфи вносит в dfm файл эту строку? Вот как от неё избавиться я знаю, а как добавить?
Вырезка из кода:
Код: 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.
// Раздел interface в Инспекторе объектов
type
  Donbass = (DNR, LNR);
  // Структуру будем хранить не в стеке, а в динамической памяти
  PMain = ^TMain; // PMain - Указатель на структуру
  TMain = record // TMain - Имя структуры (записи)
    Kind: Donbass; // Категория типа: DNR или LNR
    N: Integer; // Отступ текста слева (в символах)
    FObject: TObject; // Текущий объект
    PInfo: PPropInfo; // Текущее свойство
    LastStr: String[75];
  case Donbass of
    DNR: (Info: PPropInfo; ShowChildren: Boolean); // Поле для свойств
    LNR: (Value: LongInt; Name: ShortString); // Поле для значении
  end;
    
// Раздел implementation

// Установка новых значений свойств
procedure TFormInsp.SetPropRTTI;
var
 P: PMain; // Указатель на текущий объект-свойство
 X: Integer;
 NewInt: Integer; // Новое значение для целых чисел
 NewReal: Real; // Новое значение для дробных чисел
 S: string; // Строка в редакторе Edit
 TM: TMethod;
begin
 if Modified then // При внесении изменения в поле Edit
 Begin
  S:= (Parent as TInspector).EditZero.Text; // Текущая строка в редакторе Edit
  with (Parent as TInspector) do
  P:= Pointer(Items.Objects[ItemIndex]); // Текущая строка инспектора
  If P^.Kind = DNR then
   Case P^.Info^.PropType^.Kind of
    // Целые числа
    tkInteger:
        Begin
         Val(Text, NewInt, X);
         if x = 0 then
          begin // Установим новое значение
           SetOrdProp(P^.FObject, P^.Info, NewInt);
          end
         else
          begin
           if S<>'' then
            begin
             try
              raise EIntErrorRTTI.Create('Ошибка при присваивании значения "'+S+'" целочисленному типу');
             except
              on E: Exception do
              begin
               ShowFormError(E, 'SetOrdProp(P^.FObject, P^.Info, NewInt);', ModName);
              end;
             end;
            end
           else
            begin
             try
              raise EIntErrorRTTI.Create('Ошибка при присваивании пустого значения целочисленному типу');
             except
              on E: Exception do
              begin
               ShowFormError(E, 'SetOrdProp(P^.FObject, P^.Info, NewInt);', ModName);
              end;
             end;
            end;
          end;
        End;
    // Числа с плавающей точкой
    tkFloat:
        Begin
         Val(Text, NewReal, X);
         if x = 0 then
          begin // Установим новое значение
           SetFloatProp(P^.FObject, P^.Info, NewReal);
          end
         else
          begin
           try
            raise EFloatErrorRTTI.Create('Ошибка при присваивании значения "'+S+'" вещественному типу');
           except
            on E: Exception do
            begin
             ShowFormError(E, 'SetFloatProp(P^.FObject, P^.Info, NewReal);', ModName);
            end;
           end;
          end;
        End;
    // Перечисление
    tkEnumeration:
        Begin
         x:= GetEnumValue(P^.Info^.PropType^, Text);
         if x <> -1 then
          begin // Установим новое значение
           SetOrdProp(P^.FObject, P^.Info, X);
          end
         else
          begin
           try
            raise EEnumErrorRTTI.Create('Ошибка при присваивании значения "'+S+'" перечисляемому типу.');
           except
            on E: Exception do
            begin
             ShowFormError(E, 'SetOrdProp(P^.FObject, P^.Info, X);', ModName);
            end;
           end;
          end;
        End;
    // Строки
    tkString, tkLString, tkWString:
        begin
         try // Установим новое значение
          if Length(Text)<255 then
          begin
           SetStrProp(P^.FObject, P^.Info, Text);
          end
          else
          begin
           raise EStringErrorRTTI.Create('Длинна строки превышает 255 символов.');
          end;
         except
          on E: Exception do
          begin
           ShowFormError(E, 'SetStrProp(P^.FObject, P^.Info, Text);', ModName);
          end;
         end;
        end;
        // Символы
    tkChar:
        begin
         try
          if S<>'' then
          begin
           SetOrdProp(P^.FObject, P^.Info, StrToInt(S));
          end
          else
          begin
           raise ECharErrorRTTI.Create('Ошибка при присваивании пустого значения символьному типу.');
          end;
         except
          on E: Exception do
          begin
           ShowFormError(E, 'SetOrdProp(P^.FObject, P^.Info, StrToInt(S));', ModName);
          end;
         end;
        end;
       //
   end
  else
  begin
   MessageBeep(0);
  end;
 end;
  { Вот здесь по-логике должно происходить присваивание, но его нет
  if P^.Info^.PropType^.Kind = tkMethod then
  begin
   TM.Data:= NewForm1; // Я явно указываю объект для проверки
   TM.Code:= NewForm1.MethodAddress('NewForm1DblClick');
   SetMethodProp(NewForm1, 'OnDblClick', TM); // Явно указываю свойство
   // Этот код должен добавить в DFM-файл строку OnDblClick = NewForm1DblClick ,
   // но этого не происходит
  end; }
end;
...
Рейтинг: 0 / 0
Сериализация DFM-файл файла
    #39868326
Linux_64
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это ж надо дожиться до того, что вечером ты спаиваешь девушку не для того, что бы затащить ее в постель, а что бы она поскорее уснула, а ты тихонько включил ее комп, установил Делфи и бредил о каких то там методах...
...
Рейтинг: 0 / 0
4 сообщений из 29, страница 2 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Сериализация DFM-файл файла
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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