Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.12;
Скачать: CL | DM;

Вниз

Значение свойства из DFM   Найти похожие ветки 

 
Seldon ©   (2004-08-28 19:41) [0]

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


 
Vit@ly ©   (2004-08-28 20:16) [1]

Что есть

> некоторое свойство некоторого компонента

Свойство контрола?


 
Seldon ©   (2004-08-28 20:27) [2]


>  [1] Vit@ly ©   (28.08.04 20:16)
> Что есть
>
> > некоторое свойство некоторого компонента
>
> Свойство контрола?

Наследника TComponent


 
Vit@ly ©   (2004-08-28 20:35) [3]

Возможно я чего-то не понимаю
> свойство некоторого компонента в design-time

Но как мне кажется в design-time все имеет вои "имена"?


 
GuAV ©   (2004-08-28 20:46) [4]


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

Создать его по новой в Runtime вместе с формой и посмотреть. Орму потом не забыть прибить. Вообще-то они все из дезайнтайма попадают в RCDATA, оттуда TStream.ReadComponent читаются.


 
Seldon ©   (2004-08-28 21:11) [5]


>  [4] GuAV ©   (28.08.04 20:46)
>
> > Как в run-time узнать какое значение имело некоторое свойство
>
> > некоторого компонента в design-time?
>
> Создать его по новой в Runtime вместе с формой и посмотреть.
> Орму потом не забыть прибить. Вообще-то они все из дезайнтайма
> попадают в RCDATA, оттуда TStream.ReadComponent читаются.

А если создание формы занимает порядком времени? Нельзя ли не создавая по новой?


 
jack128 ©   (2004-08-28 21:41) [6]

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

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


 
Seldon ©   (2004-08-28 22:11) [7]

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


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

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


 
GuAV ©   (2004-08-28 22:13) [8]

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


 
TUser ©   (2004-08-28 22:24) [9]

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


 
jack128 ©   (2004-08-28 22:32) [10]

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

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


 
GuAV ©   (2004-08-28 22:33) [11]


> GuAV прав

да, я прав :)

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

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

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

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


 
jack128 ©   (2004-08-28 22:44) [12]

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


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

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

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

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


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

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


 
Seldon ©   (2004-08-28 23:19) [15]


> [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 в текстовом виде.


 
GuAV ©   (2004-08-28 23:22) [16]


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

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

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

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


 
GuAV ©   (2004-08-28 23:26) [17]

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

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


 
jack128 ©   (2004-08-28 23:57) [18]

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-29 00:45) [19]


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

Исправил.

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;


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

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

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


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

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

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


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

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


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


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

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


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


 
GuAV ©   (2004-08-29 01:16) [24]


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

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


 
Seldon ©   (2004-08-29 13:03) [25]

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

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



Страницы: 1 вся ветка

Текущий архив: 2004.09.12;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.025 c
1-1093417806
Рамиль
2004-08-25 11:10
2004.09.12
Перехват максимизации окна


14-1093095857
Nick Denry
2004-08-21 17:44
2004.09.12
Библиотека Qt


3-1092710262
Sirus
2004-08-17 06:37
2004.09.12
Соединение с Firebird тормозит на Windows XP...


3-1092738537
surkis
2004-08-17 14:28
2004.09.12
Службы и БД


3-1092810724
Belkova
2004-08-18 10:32
2004.09.12
Первичный ключ