Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Значение свойства из DFM [D7]


Страницы:   1 2

Seldon ©   (2004-08-28 19:41:00) 

Как в run-time узнать какое значение имело некоторое свойство некоторого компонента в design-time?


Seldon   (2004-08-29 13:03:00) [1]

GuAV, jack128 - cпасибо, помогли.

Я в принципе тоже до кой чего дошёл. Только копать начал в сторону TReader'a. Идея - идти по ресурсу формы методами TReader'a пока не найду нужный компонент и нужное свойство. Половину вчера сделал. Но пототом сон взял своё :) Сейчас доделаю.


GuAV   (2004-08-29 01:16:00) [2]


>  борланд, что тоже сигнатуру пропускает, что ли?

при чтении компонента он её юзает, а не пропускает эти 80 байт. именно сигнатуры там четыре байта. это был ctrl+click :)


jack128   (2004-08-29 00:55:00) [3]

GuAV ©   (29.08.04 0:50) [20]
т.е. кривая сигнатура - ну и фиг с ней, дальше читается.


ясно. ясно.. Надо будет покопаться в исходниках VCL - борланд, что тоже сигнатуру пропускает, что ли?


jack128   (2004-08-29 00:54:00) [4]

Хе, ну понятно, ты пропустил header и сразу приступил к разбору данных. Но это не решает вопроса, почему не работает ObjectResourceToText


> //StringStream.CopyFrom(ResourceStream,
> ResourceStream.Size);
ну это описка, сам понимаешь..


GuAV   (2004-08-29 00:51:00) [5]

GuAV ©   (29.08.04 00:45) [19]
т.е. кривая сигнатура - ну и фиг с ней, дальше читается.
кстати, похоже Restorator читает именно так и у него та же проблема.
>   //StringStream.CopyFrom(ResourceStream, ResourceStream.Size);

Это на кой?
и в самое начало добавить
StringStream := nil
(это я умничаю :) )


GuAV   (2004-08-29 00:50:00) [6]

GuAV ©   (29.08.04 00:45) [19]
т.е. кривая сигнатура - ну и фиг с ней, дальше читается.
кстати, похоже Restorator читает именно так и у него та же проблема.
>   //StringStream.CopyFrom(ResourceStream, ResourceStream.Size);

Это на кой?
и в самое начало добавить
ResourceStream := nil
(это я умничаю :) )


GuAV   (2004-08-29 00:45:00) [7]


> Но результат выполнения этого кода удручает..

Исправил.

var
ResourceStream: TResourceStream;
StringStream: TStringStream;
begin
ResourceStream := TResourceStream.Create(hInstance, 'TForm1', RT_RCDATA);
StringStream := TStringStream.Create('');
try
  ResourceStream.Seek(0, 80);
  {ObjectResourceToText}ObjectBinaryToText(ResourceStream, StringStream);
  //StringStream.CopyFrom(ResourceStream, ResourceStream.Size);
  Memo1.Lines.Text := StringStream.DataString;
finally
  StringStream.Free;
  ResourceStream.Free;
end;
end;


jack128   (2004-08-28 23:57:00) [8]

ResHack на пятёрке нормально работает..
Кстати на счет хелпа..Из описания функции ObjectResourceToText я понял, что она нужна для этого:

var
 ResourceStream: TResourceStream;
 StringStream: TStringStream;
begin
 ResourceStream := TResourceStream.Create(hInstance, 'TForm1', RT_RCDATA);
 StringStream := TStringStream.Create('');
 try
   ResourceStream.Seek(0, 0);
   ObjectResourceToText(ResourceStream, StringStream);
   StringStream.CopyFrom(ResourceStream, ResourceStream.Size);
   Memo1.Lines.Text := StringStream.DataString;
 finally
   StringStream.Free;
   ResourceStream.Free;
 end;
end;

Но результат выполнения этого кода удручает..


GuAV   (2004-08-28 23:26:00) [9]

>  Restorator ведь показывает формы из RCDATA в текстовом
> виде.

Проверил - его часто у меня глючит. Д7.


GuAV   (2004-08-28 23:22:00) [10]


>  Restorator ведь показывает формы из RCDATA в текстовом
> виде.

Сказали же - решается.
"можно. Вручную распарсить дфм. задача решаемая. Посредством написания наследника TReader. "  (c)jack128

Попрлбуй связатся с автором restorator'а

зы я опять анкету подправил :)


Seldon   (2004-08-28 23:19:00) [11]


> [8] GuAV ©   (28.08.04 22:13)
> ...А проще всего "запомнить" в OnCreate.

Компонент дофига, притом в OnCreate неизвестно, для каких из них придётся восстанавливать начальные значения свойств.


> [13] GuAV ©   (28.08.04 22:52)
>> > По-подробней можно?
>
> внизу моей анкеты - тогда будет поподробнее :)

Ну не такой я и ленивый. :) Сразу конечно в хелп. Только "там каждый второй топик начинается со слов XXX is used internally by the Delphi environment for design-time streaming. Do not call XXX directly и дальше какая то непереводимая муть" (c)jack128

Видимо придётся создавать всё-таки форму и брать из неё. Но ж***й чую - можно прочитать напрямую. Restorator ведь показывает формы из RCDATA в текстовом виде.


jack128   (2004-08-28 23:00:00) [12]

GuAV ©   (28.08.04 22:52) [13]
вообще то это Seldon'y было.

> скажи, ещё не такое ты решал :)
такое-не такое, но исходники я перерыл конкретно (правда не в этом направлении, но все же)

> внизу моей анкеты - тогда будет поподробнее :)
угу. Написать наследника - это фактически и означает посыл к исходникам (до Ctrl+Alt+C я думаю, тут дело не дойдет ;-))
А F1 лично мне не очень помогает по этой теме - там каждый второй топик начинается со слов XXX is used internally by the Delphi environment for design-time streaming. Do not call XXX directly и дальше какая то непереводимая муть. в общем "F1 - интересно, Ctrl+Click - ещё интереснее" (с) GuAV


GuAV   (2004-08-28 22:52:00) [13]

jack128 ©   (28.08.04 22:44) [12]
скажи, ещё не такое ты решал :)

> По-подробней можно?

внизу моей анкеты - тогда будет поподробнее :)


jack128   (2004-08-28 22:44:00) [14]

мдя. задача решаемая. Посредством написания наследника TReader. Если ты этого хочешь - вперед и с песней. (потом о результатах расскажи  ;-))


GuAV   (2004-08-28 22:33:00) [15]


> GuAV прав

да, я прав :)

> Нельзя определить, какое св-во у компонента было 10 минут
> назад.

нельзя. но в сабже просят значение ИЗ DFM

> Назначай св-ва динамически, при создании формы, значения
> читай из ini/реестра.

Это вообще не сюда.


jack128   (2004-08-28 22:32:00) [16]

Seldon ©   (28.08.04 22:11) [7]
Нельзя ли используя тот же механизм самому прочитать нужные свойства нужных компонет

то ж механизм - это Stream.ReadComponent - а это означает создание формы. Можно конечно покопаться в TReader, но это уж сам, ибо задача по сути извращенская. см > GuAV ©   (28.08.04 22:13) [8][Ответить]


TUser   (2004-08-28 22:24:00) [17]

GuAV прав. Нельзя определить, какое св-во у компонента было 10 минут назад. Назначай св-ва динамически, при создании формы, значения читай из ini/реестра.


GuAV   (2004-08-28 22:13:00) [18]

...А проще всего "запомнить" в OnCreate.


Seldon   (2004-08-28 22:11:00) [19]

Я к чему клоню. Ведь при создании формы значения всех свойств читаются из RCDATA. Нельзя ли используя тот же механизм самому прочитать нужные свойства нужных компонет.


> оттуда TStream.ReadComponent читаются.

По-подробней можно?


jack128   (2004-08-28 21:41:00) [20]

Seldon ©   (28.08.04 21:11) [5]
Нельзя ли не создавая по новой?

можно. Вручную распарсить дфм - оно тебе надо?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо