![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Значение свойства из DFM [D7]
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]
Нельзя ли не создавая по новой?
можно. Вручную распарсить дфм - оно тебе надо?