Форум: "Основная";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];
ВнизЗначение свойства из 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;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.032 c