Форум: "Компоненты";
Текущий архив: 2007.11.11;
Скачать: [xml.tar.bz2];
ВнизСохранение свойств незарегистрированного компонента Найти похожие ветки
← →
--= Eagle =-- © (2006-11-06 17:55) [0]Доброго времени суток!
Есть такой вопрос: есть панельки, которые создаются на главной компоненте в дизайн-тайме, но они не зарегистрированы и регистрировать их нельзя. У форм довольно много свойств, в т. ч. PopupMenu. Если бы нужно было сохранить пару-тройку свойств я бы не заморачиваясь сделал бы это через псевдосвойства основной компоненты, но нужно сохранять почти все свойства панелек. Что посоветуете?
← →
Ketmar © (2006-11-06 18:23) [1]прекратить насиловать анус и положить их на форму нормальным способом.
← →
--= Eagle =-- © (2006-11-06 18:29) [2]Ketmar, увы, не канает. Нужно... И не от меня это зависит :(
← →
--= Eagle =-- © (2006-11-06 18:32) [3]Вопчем, походу, панелька должна-таки сохраняться "вручную"...
← →
Ketmar © (2006-11-06 18:33) [4]тогда сохраняй. она, как-никак, от TPersistent унаследована. механизмы записи/чтения дадены.
← →
--= Eagle =-- © (2006-11-06 19:29) [5]Хмм... может есть тогда какая-то возможность пройти по всем паблишед-методам класса?
← →
Ketmar © (2006-11-06 19:30) [6]нет. потому что published-методов не бывает.
← →
--= Eagle =-- © (2006-11-07 10:37) [7]Ketmar, оки, не методам, пропертям (хотя и метод никто не мешает в паблишед вынести)... закрутился под вечер, ничего уже не соображаю толком... Идеи-то есть?
← →
DimaBr (2006-11-07 12:10) [8]> --= Eagle =--
> Что посоветуете?
> Ketmar
> прекратить насиловать анус и положить их на форму нормальным способом.
Хотите сохранять, разберитесь с GetChildren
← →
--= Eagle =-- © (2006-11-07 12:25) [9]В смысле, попробовать при загрузке формы не разрешить самой делфе обработать мою панельку, а сделать это самому, такая идея?
← →
DimaBr (2006-11-07 13:27) [10]В смысле указать в компоненте, какие ещё компоненты (вложенные) следует сохранять в ресурс.
← →
--= Eagle =-- © (2006-11-07 13:41) [11]Это я могу сделать, но мне это делать нельзя. Вопрос в другом - можно ли в таком случае _не_ дать делфе загрузить эти вложенные панельки, т.к. они создаются самим компонентом (а Делфа захочет их положить на форму), но сохранить все настройки этих панелек так, чтобы я их потом мог также легко восстановить?
← →
DimaBr (2006-11-07 14:09) [12]Вы изменяете свойства панелек в дизайнере ? Каким образом представленны эти панели как свойства или через редактор ?
← →
--= Eagle =-- © (2006-11-07 14:34) [13]В дизайнере: Designer.SelectComponent(SomePanel) и можно изменять их свойства
← →
DimaBr (2006-11-07 14:39) [14]То есть хранятся панельки в виде списка, в принципе это я уже понял
http://forum.sources.ru/index.php?showtopic=159196
Количество панелек фиксированно ?
← →
--= Eagle =-- © (2006-11-07 14:43) [15]да, оно
нет, их можно добавлять/удалять в любом количестве и ещё и разными способами :D
← →
--= Eagle =-- © (2006-11-07 14:45) [16]Пока делаю через DefineProperty и перечисляю всё что мне нужно будет сохранить, но это же, конечно, не выход... :(
← →
DimaBr (2006-11-07 14:47) [17]В таком случае GetChildren, GetChildren и ещё раз GetChildren
← →
--= Eagle =-- © (2006-11-07 16:57) [18]Что-то не получается... :(
Вобщем, я сделал такую вот вещь:procedure TMyComponent.GetChildren(Proc: TGetChildProc; Root: TComponent);
var
I: Integer;
Control: TControl;
begin
// inherited GetChildren(Proc, Root);
for I := 0 to ControlCount - 1 do
begin
Control := Controls[I];
if (Control.Owner = Root) and (not (Control is TMyPanel)) then Proc(Control);
end;
{...}
end;
В результате в TMyComponent уже должны сохраняться TMyPanel и их свойства, и они не будут загружаются Делфой. Уже теплее, но это ещё не всё. Осталось загрузить свойства этой TMyPanel... Как бы это сделать?
← →
--= Eagle =-- © (2006-11-07 17:07) [19]т.е. я имею ввиду, что установить проперти TMyPanel-ов в те значения, которые сохранены в форме
← →
Ketmar © (2006-11-07 17:41) [20]бр-р-р. не пробовал вообще VCL переписать? тоже занятие интересное.
ну вот не понимаю я, зачем делать то, что уже сделано.
← →
--= Eagle =-- © (2006-11-07 17:52) [21]Дааа... на счёт не будут загружаться я маненько обшибся... Вобщем, сделал так:
for I := 0 to ControlCount - 1 do
begin
Control := Controls[I];
if (Control.Owner = Self {Root}) then
if (not (Control is TMyPanel)) or (csWriting in ComponentState) then
begin
Beep;
Proc(Control);
end;
end;
Вобщем, при загрузке оно действительно не бипает, но всё же хочет загрузить компоненту, но говорит что та не зарегана, и что её можно Cancel, Ignore или Ignore all... Странно это всё...
← →
--= Eagle =-- © (2006-11-07 17:57) [22]Ketmar, ну что ты предлагаешь? Зарегать эти панельки? Нельзя! Они зависят от главного компонента и НЕ могут быть положены на форму... Какие ещё будут советы? Пока всего кода, что я "переписывал" VCL - меньше 100 строк...
← →
Ketmar © (2006-11-07 18:16) [23]я вообще ничего не предлагаю, потому что описание задачи засекречено. я только сильно подозреваю, что там изначально что-то сделано через странное место.
← →
--= Eagle =-- © (2006-11-07 18:21) [24]Ketmar, спроси что тебе нужно знать - и я отвечу, если сам это знаю. Я к данному компоненту прикручиваю только сохранение состояния его панелек и компонентов, которые на них лежат. Вот практически и всё.
P.S. Oпубликовать исходники, естессно, не получится...
← →
Ketmar © (2006-11-07 18:23) [25]>[24] --= Eagle =--(c) 7-Nov-2006, 18:21
>Ketmar, спроси что тебе нужно знать - и я отвечу
очень хочу знать, как работает головной мозг. подробно. полностью.
← →
--= Eagle =-- © (2006-11-07 18:37) [26]Ketmar, а мож харэ флудить-то, а? >-:[
← →
Percent (2006-11-07 19:11) [27]Зарегать эти панельки? Нельзя! Они зависят от главного компонента и НЕ могут быть положены на форму...
Пусть себе зависят, какое это имеет значение?
Насчет того, что панельки "не могут быть положены" на любой другой компонент кроме главного компонента: обрабатывай SetParent(), в котором проверяй родителя, и, если он не "главный", то выдавай предупреждение (в design-time) и удаляй панельку.
То есть, регистрируй панельки - и в добрый путь!
← →
Юрий Зотов © (2006-11-07 20:57) [28]> --= Eagle =--
Положите на форму обычную панель, а на нее - обычную кнопку. Вторую обычную кнопку положите прямо на форму. Просмотрите форму в виде текста и обратите внимание, что кнопки сохраняются в DFM по-разному.
Вам нужно добиться того же. Как это сделать - см. [17]. Еще можно в коде VCL посмотреть, как перекрыты GetChildren (а также GetParentComponent и другие соответствующие методы), например, у TMenu и TMenuItem (или у TDataSet и TField). Ключ к решению именно здесь.
А что касается "регистрировать их нельзя" - посмотрите RegisterNoIcon. Именно так регистрируются, например, TMenuItem, все TxxxField и другие подобные компоненты.
Другой способ - DefineProperties. Но не надо вручную перечислять все, что сохраняется, можно просто вызывать Read/WriteComponent.
← →
Ketmar © (2006-11-07 22:44) [29]>[26] --= Eagle =--(c) 7-Nov-2006, 18:37
>Ketmar, а мож харэ флудить-то, а? >-:[
может. если б я первый начал...
← →
DimaBr (2006-11-08 09:27) [30]
unit TestPanel;
interface
uses Classes,ExtCtrls,SysUtils, Controls;
type
TMyChildPanel = class(TCustomPanel)
protected
procedure SetParent(AParent: TWinControl);override;
end;
TMyPanel = class(TCustomPanel)
protected
procedure GetChildren(Proc: TGetChildProc; Root: TComponent); override;
end;
implementation
procedure TMyPanel.GetChildren( Proc: TGetChildProc; Root: TComponent );
var i: Integer;
begin
for i := 0 to ControlCount -1 do
if Controls[i] is TMyChildPanel then Proc( Controls[i] );
end;
{ TMyChildPanel }
procedure TMyChildPanel.SetParent(AParent: TWinControl);
begin
if (AParent is TMyPanel) or (AParent = nil)
then inherited
else raise Exception.Create("Error Parent Control !");
end;
initialization
RegisterClasses([TMyChildPanel]);
end.
unit TestReg;
interface
uses Classes, TestPanel,DesignEditors,DesignIntf;
type
TMyEditor = class(TComponentEditor)
procedure ExecuteVerb(Index: integer); override;
function GetVerb(Index: integer): string; override;
function GetVerbCount: integer; override;
end;
procedure Register;
implementation
{ TMyEditor }
procedure TMyEditor.ExecuteVerb(Index: integer);
begin
case Index of
0: Designer.CreateComponent(TMyChildPanel,TMyPanel(Component),0,0,100,100);
else inherited ExecuteVerb(Index);
end;
end;
function TMyEditor.GetVerb(Index: integer): string;
begin
case Index of
0: Result := "Add Panel";
else Result := inherited GetVerb(Index)
end;
end;
function TMyEditor.GetVerbCount: integer;
begin
Result := inherited GetVerbCount+1;
end;
procedure Register;
begin
RegisterComponents("Standard",[TMyPanel]);
RegisterComponentEditor(TMyPanel,TMyEditor);
end;
end.
← →
DimaBr (2006-11-08 11:19) [31]Если сохранять нужно не только панели, а всё остальное что брошено на Главную панель, тогда GetChildren вообще не нужен и код сокращается до
TMyChildPanel = class(TCustomPanel)
protected
procedure SetParent(AParent: TWinControl);override;
end;
TMyPanel = class(TCustomPanel)
end;
Страницы: 1 вся ветка
Форум: "Компоненты";
Текущий архив: 2007.11.11;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.05 c