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

Вниз

Сохранение свойств незарегистрированного компонента   Найти похожие ветки 

 
--= 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;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.02 c
5-1163074690
karton
2006-11-09 15:18
2007.11.11
TabControl внутри компонента


1-1183124792
Tack
2007-06-29 17:46
2007.11.11
Проблемы отрисовки TComboBox в режиме OwnerDrawVariable


2-1192131564
koss_
2007-10-11 23:39
2007.11.11
запрос работает в режиме только чтение


2-1192545392
Чародей
2007-10-16 18:36
2007.11.11
Combo и Access Violation


15-1190827861
Kolan
2007-09-26 21:31
2007.11.11
MVC — спрашивали? :)