Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Компоненты";
Текущий архив: 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.53 MB
Время: 0.039 c
11-1176476126
D[u]fa
2007-04-13 18:55
2007.11.11
Str2Extended


2-1192950932
hT9
2007-10-21 11:15
2007.11.11
Listview повторы


8-1168953381
Agent[007]
2007-01-16 16:16
2007.11.11
Прозрачность текстур с помощью маски (OpenGL)


2-1192770109
031178
2007-10-19 09:01
2007.11.11
TTreeView


15-1191930668
Nucer
2007-10-09 15:51
2007.11.11
Как правильно писать программы?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский