powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Сериализация DFM-файл файла
29 сообщений из 29, показаны все 2 страниц
Сериализация DFM-файл файла
    #39868215
Linux_64
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Задача такова: Имеется DFM-файл-файл стандартной структуры Delphi, и в него нужно записать строку в виде "OnClick = NewForm1Click" перед словом "end". Как это сделать?

Образец 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.
object Form1: TForm1 
Left = 230 
Top = 186 
Width = 407 
Height = 137 
Caption = "Form1" 
Color = clBtnFace 
Font.Charset = DEFAULT_CHARSET 
Font.Color = clWindowText 
Font.Height = -13 
Font.Name = "MS Sans Serif" 
Font.Style = [] 
OldCreateOrder = False 
PixelsPerInch = 120 
TextHeight = 16 
object Memo1: TMemo 
Left = 208 
Top = 8 
Width = 185 
Height = 89 
Lines.Strings = ( 
"Memo1") 
TabOrder = 0 
end
...
Рейтинг: 0 / 0
Сериализация DFM-файл файла
    #39868227
Linux_64
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DefineProperty ? Как добавить в поток эту строку?, при чем эта строка должна относиться к этому объекту.....? Отесать если там Memo или ListBox, то строка должна относиться к его описанию, перед словом end
...
Рейтинг: 0 / 0
Сериализация DFM-файл файла
    #39868230
Linux_64
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня есть процедура для очистки строки 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.
procedure RemoveEventHandlers(SL:TStrings);
const
  Key1 = ' On';
  Key2 = ' = ';

var
  i, k1,k2 : Integer;
  S        : String;

begin
  for i := SL.Count-1 downto 0 do begin
    S := SL[i];

    k1 := pos(Key1, S);
    k2 := pos(Key2, S);

    if (k1 <> 0) AND (k2 > k1) then begin
      // remove it:
      SL.Delete(i);
    end;

  end;
end;


Но как ее присвоить?
...
Рейтинг: 0 / 0
Сериализация DFM-файл файла
    #39868231
Linux_64
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Осталось 1:12
Как вписать в DFM-файл -файл эту строку?
...
Рейтинг: 0 / 0
Сериализация DFM-файл файла
    #39868234
Linux_64
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если не пить пиво и не гулять по-девочкам, то мозг начинает работать...
...
Рейтинг: 0 / 0
Сериализация DFM-файл файла
    #39868235
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы не должны заниматься сериализацией компонентов.
Компоненты это умеют делать сами.
...
Рейтинг: 0 / 0
Сериализация DFM-файл файла
    #39868238
Linux_64
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DimaBr, Дима, это делается не по средствам среды. Как Делфи добавляет ссылку на обработчик событий в DFM-файл файл ,- "OnClick = NewForm1Click" , при чем добавляет ее в нужное место для нуд6ого компонента. Вам ведь известен мой проект?, да, он вам известен. Готовность 90%. Остался маленький обработчик событий, код которого , будет общим...
Короче , как мне вписать эту строку в DFM-файл ?
...
Рейтинг: 0 / 0
Сериализация DFM-файл файла
    #39868240
Linux_64
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DimaBr,
Не умеют,!!! Или не полностью. Почему тогда, при сохранении формы в поток со всеми его свойствами, - все сохраняется за исключением событий - методов ?
...
Рейтинг: 0 / 0
Сериализация DFM-файл файла
    #39868241
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сериализацией объектов занимается TWriter/TReader
Бессмысленно придумывать собственный механизм, если уже таковой есть.
Сначала придумайте как прочитать событие и показать его в дизайнере
...
Рейтинг: 0 / 0
Сериализация DFM-файл файла
    #39868242
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Linux_64Почему тогда, при сохранении формы в поток со всеми его свойствами, - все сохраняется за исключением событий - методов ?
Если события есть (назначены) и не сохраняются, то что мешает поставить бряку и посмотреть почему это происходит ?
...
Рейтинг: 0 / 0
Сериализация DFM-файл файла
    #39868245
Linux_64
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DimaBr, да, мой код не идеален. Над оригиналом трудились с десяток профи, А я всего лишь любитель...
Возможна ли альтернатива? Я компилировал файл Unit1.pas с Unit1.dfm, предварительно внеся в файл DFM-файл строку со ссылкой (указателем на метод) "OnClick = NewForm1Click" и после этого компилировал весь проект, в итоге обработчик события , а он прописан в pas-файле срабатывал, но эту строку я вносил вручную в DFM-файл-файл. Как мне это а№томотизировать?
...
Рейтинг: 0 / 0
Сериализация DFM-файл файла
    #39868248
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как автоматизировать ?
А как ваш инспектор отображает события ?Где эти события у вас хранятся ?
...
Рейтинг: 0 / 0
Сериализация DFM-файл файла
    #39868250
Linux_64
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мне просто нужно перед компиляцией внести нужную строку в нужное место, как правило перед end. Если это не только дерево TreeView, там сложнее, Если я добавил обработчик OnChahge для Мемо или OnClick для кнопки, то соответствующее описание попадает в DFM-файл, при чем обратите внимание!!!, перед словом end, нужного объекта, которому присваивается ссылка на обработчик
...
Рейтинг: 0 / 0
Сериализация DFM-файл файла
    #39868252
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Повторяю, компоненты сами знают как себя сохранить.
Не нужно это делать снаружи.
...
Рейтинг: 0 / 0
Сериализация DFM-файл файла
    #39868254
Linux_64
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Linux_64, в инспекторе присваивается ссылка - указатель на метод, если ссылка отсутствует, то присваивается свойству значение nil, в противном случае указывается адрес указателя, по сути это просто строка с адресом, она не привязывает обработчик к ссылке, а вот сама среда Делфи это делает посредством DFM-файл файла и определенной строки
...
Рейтинг: 0 / 0
Сериализация DFM-файл файла
    #39868256
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если метода ещё нет. Его только создали в дизайнере (в текстовом виде), куда указывает ссылка ?
...
Рейтинг: 0 / 0
Сериализация DFM-файл файла
    #39868260
Linux_64
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DimaBr, Отлично!, но где тогда строка "OnClick = NewForm1Click", перед словом end? - именно она указывает на связь между скажем кнопкой и обработчиком в коде модуля pas. Кнопка не знает, что ей присвоен указатель и что обработчик содержит кучу строк кода при нажатии на эту кнопку, нет привязки, нет ссылки на этот обработчик, нет ярлыка если хотите, но где моя строка в FFM?
...
Рейтинг: 0 / 0
Сериализация DFM-файл файла
    #39868261
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Откуда вообще берутся ссылки на метод, если у вас ДВА текстовых файла ?
...
Рейтинг: 0 / 0
Сериализация DFM-файл файла
    #39868267
Linux_64
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DimaBr, Дмитрий, я понятия не имею, как разработчики Боллэнд это сделали. Мне удалось выяснить, что строка "Button1Click" в инспекторе объектов это всего лишь строка для пользователя и флаг того, что ссылка создана , ссылка на обработчик
Procedure TForm1.Button1Click....
Так вот, строка Button1Click каким то образом попадает в DFM-файл файл. Элли события это тоже свойства компонента, то почему ее нет в файле?, там сохраняются только свойства не имеющие значения по- умолчанию... мы можем обмануть судьбу и решить задачу не так как это сделала Борлэнд ? . Как добавить строку в DFM-файл перед словом end, при условии, что она будет относиться к "своему" объекту.
...
Рейтинг: 0 / 0
Сериализация DFM-файл файла
    #39868270
Linux_64
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DimaBr, в смысле ?, какие два текстовых файла? - DFM файл и pas , что ещё?
...
Рейтинг: 0 / 0
Сериализация DFM-файл файла
    #39868273
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы похоже меня не слышите.
Вы в дизайнере кликаете на кнопке, при этом в коде создаётся процедура, а в инспекторе показывается что на событие OnClick привязана процедура ButtonClick.
До сохранения ещё далеко.
У вас это работает ?
Откуда в вашей NewForm1.OnClick = 004ECE40 ? Это что за адрес ? У вас есть DFM файл, вы его прочитали (каким то образом). Откуда взялся адрес процедуры ?
...
Рейтинг: 0 / 0
Сериализация DFM-файл файла
    #39868274
Linux_64
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Linux_64, О Боги....
Код: pascal
1.
2.
3.
4.
5.
6.
TM: TMethod;
Begin
TM.Data:= NewForm1;
TM.Code:= NewForm1.MethodAddress('NewForm1DblClick');
SetMethogProp(NewForm1, 'OnDblClick', TM);
End;


Посредством этого кода я присваиваю указатель на метод события OnDblClick, но
В файл сохраняются все свойства , которые я изменил или не трогал, но абсолютно нет намёка на событие.... где оно?
...
Рейтинг: 0 / 0
Сериализация DFM-файл файла
    #39868275
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То есть вы копилируете форму, создаёте её и получаете указатель на метод ?
А новый метод, который вы ручками напишите в коде, где указатель на него ?
Он существует только в текстовом виде, в скомпилированной форме его нет
...
Рейтинг: 0 / 0
Сериализация DFM-файл файла
    #39868277
Linux_64
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Linux_64, Да, у меня это работает, создаётся обработчик событий в редакторе кода со всеми параметрами, без проблем, так же эта строка с именем процедуры прпадает в описание класса формы, так же как это делает обычная Делфи. Хвала Богу, я додумался как в нужную строку редактора прописывать нужный обработчик со всеми его параметрами. Тем временем , в Инспектор объектов присутствует адрес указателя или виде строки, я могу это переключить в настройках инспектора. Дело все в том, что это просто строка с адресом . Когда в оригинале создаётся событие, то во первых создаётся обработчик в коде, при чем обратите внимание, это происходит перед конечным словом end. Добавляется строка-описание в класс формы, короче в раздел интерфейса, в инспектор д*бавляется строка с именем метода, но это всего лишь строка и наконец в DFM-файл - файл добавляется строчка типа OnClick = Button1Click
..... ????
Как ее добавить?
...
Рейтинг: 0 / 0
Сериализация DFM-файл файла
    #39868278
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторДело все в том, что это просто строка с адресом
Куда указывает этот адрес ? Если в NewForm ещё нет такого метода ?
...
Рейтинг: 0 / 0
Сериализация 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
29 сообщений из 29, показаны все 2 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Сериализация DFM-файл файла
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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