| | | | |
Полный текст материала
Другие публикации автора: George Judkin
Цитата или краткий комментарий: «... Как можно изменять существующие компоненты, при этом избежать их регистрации в палитре компонент, но сохранить частичную возможность использования при визуальном проектировании форм ...» |
Важно:- Страница предназначена для обсуждения материала, его содержания, полезности, соответствия действительности и так далее. Смысл не в разборке, а в приближении к истине :о) и пользе для всех.
- Любые другие сообщения или вопросы, а так же личные эмоции в адрес авторов и полемика, не относящаяся к теме обсуждаемого материала, будут удаляться без предупреждения авторов, дабы не мешать жителям нормально общаться.
- При голосовании учитывайте уровень, на который расчитан материал. "Интересность и полезность" имеет смысл оценивать относительно того, кому именно предназначался материал.
- Размер одного сообщений не должен превышать 5К. Если Вам нужно сказать больше, сделайте это за два раза. Или, что в данной ситуации правильнее, напишите свою статью.
Всегда легче осудить сделанное, нежели сделать самому. Поэтому, пожалуйста, соблюдайте правила Королевства и уважайте друг друга.
Добавить свое мнение.
| | Содержит полезные и(или) интересные сведения | [1] | 18 | 100% | | | | Ничего особенно нового и интересного | [2] | 0 | 0% | | | | Написано неверно (обязательно укажите почему) | [3] | 0 | 0% | | Всего проголосовали: 18 | | | Все понятно, материал читается легко | [1] | 18 | 100% | | | | Есть неясности в изложении | [2] | 0 | 0% | | | | Непонятно написано, трудно читается | [3] | 0 | 0% | | Всего проголосовали: 18 |
[Наследование] [Секции private/public/protected/published]
Отслеживать это обсуждение
Всего сообщений: 7231-03-2016 02:20>>>Geo
Верно.
>>>Алексей Акулов
Молодец.
TMyTreeNode() - жесткое приведение типов в рамках одного модуля достаточно безопасно.
Просто запомни, что как только ты потеряешь из виду
NodeClass := TMyTreeNode;
Например, при переходе через границу формы/модуля
Нужно проверять используя Is/As
{
Проверяет тип Cls объекта Obj и возвращает ссылку Ref на него.
может использоваться как замена паре is as .
if aSomeObject is TMyObject then
begin
aMyObject := aSomeObject as TMyObject;
// do something with aMyObject
end;
При использовании IsAs примет вид:
if IsAs(aSomeObject, TMyObject, aMyObject) then
begin
// do something with aMyObject
end;
}
function IsAs(const Obj: TObject; const Cls: TClass; out Ref{: Pointer}): Boolean; {$IFDEF HAS_INLINE} inline; {$ENDIF}
function IsAs(const Obj: TObject; const Cls: TClass; out Ref{: Pointer}): Boolean;
begin
Result := (Obj <> nil) and (Obj is Cls);
if Result then
TObject(Ref) := Obj;
end;
В последнее время испытываю сложности в отправке сообщений.
Предлагают контактировать с администратором.
Судя по сообщениям в соседних ветках, не я один. :-) |
|
31-03-2016 00:12>>>Geo
А ну понял. Спасибо за разъяснения. В принципе именно так я себе и объяснил код Алексея Гаврилова.
Только немножко недодумал как нужно модифицировать свой код, чтоб заработало. Модифицировал код следующим образом и всё вроде заработало:
unit Unit1;
interface
uses
Winapi.Windows, Vcl.Forms, System.SysUtils, System.Classes,
Vcl.Controls, Vcl.Buttons, Vcl.ComCtrls;
type
TMyTreeNode = class(TTreeNode)
protected
FID : Integer;
procedure SetID(Value : Integer);
public
property ID : Integer read FID write SetID;
end;
TFormMain = class(TForm)
TreeView1: TTreeView;
procedure FormCreate(Sender: TObject);
procedure TreeView1CreateNodeClass(Sender: TCustomTreeView; var NodeClass: TTreeNodeClass);
private
public
end;
var
FormMain: TFormMain;
implementation
procedure TFormMain.TreeView1CreateNodeClass(Sender: TCustomTreeView; var NodeClass: TTreeNodeClass);
begin
NodeClass := TMyTreeNode;
end;
procedure TFormMain.FormCreate(Sender: TObject);
var TN : TMyTreeNode;
begin
TN := TMyTreeNode(TreeView1.Items.AddChild(nil, 'Root, PID=0'));
TN.ID := 1;
TN.Text := TN.Text + ', ID='+IntToStr(TN.ID);
TN := TMyTreeNode(TreeView1.Items.AddChild(TN, 'Sibling, PID=1'));
TN.ID := 2;
TN.Text := TN.Text + ', ID='+IntToStr(TN.ID);
end;
procedure TMyTreeNode.SetID(Value: Integer);
begin
FID := Value;
end;
end. |
|
30-03-2016 16:14сообщение от автора материала Методом, описанным в статье, ваша проблема не решается. Дело в том, что вы в своем коде не создаете экземпляры класса TTreeNode, их создает TTreeView в своем коде. Соответственно, ему на все ваши подмены глубоко начхать.
Пока Алексей Гаврилов не появился, попробую прокомментировать его код. Как я понял, у TCustomTreeView имеется событие, которое вызывается при создании нового узла. При этом в качестве параметра передается тип данных — класс-наследник TTreeNode — для создаваемого узла. Если написать обработчик этого события, то можно подменить значение на свой вариант типа TTreeNode. |
|
30-03-2016 08:46>>>Алексей Гаврилов
а прокомментировать код можно? Что-то я не догоняю пока. Как этим кодом вы обеспечиваете совместимость типов базового TTreeNode (который возвращается методом TreeView1.Items.AddChild) и модифицированного Unit1.TTreeNode?? |
|
30-03-2016 06:09>>>Алексей Акулов
TCustomTreeView = class(TWinControl)
protected
property OnCreateNodeClass: TTVCreateNodeClassEvent read FOnCreateNodeClass write FOnCreateNodeClass;
type
TMyTreeNode = class(TTreeNode)
protected
FID : Integer;
procedure SetID(Value : Integer);
public
property ID : Integer read FID write SetID;
end;
procedure TForm1.TreeView1CreateNodeClass(Sender: TCustomTreeView; var NodeClass: TTreeNodeClass);
begin
NodeClass := TMyTreeNode;
end;
>>> |
|
30-03-2016 02:58Всем привет!
Хорошая, понятная статья. Методом приходилось пользоваться. Но вот столкнулся с такой проблемкой:
при заполнении TTreeView очень хотелось хранить ID каждого Item'а (это в упрощённом варианте, а вообще - расширить стандартный набор свойств стандартного TTreeNode), при этом нет нужды/желания регистрировать новый компонент.
Вот накидал примерно то, что требуется сделать в проекте:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Buttons, Vcl.StdCtrls, Vcl.ComCtrls;
type
TTreeNode = class(Vcl.ComCtrls.TTreeNode)
protected
FID : Integer;
procedure SetID(Value : Integer);
public
property ID : Integer read FID write SetID;
end;
TFormMain = class(TForm)
TreeView1: TTreeView;
procedure FormCreate(Sender: TObject);
private
public
end;
var
FormMain: TFormMain;
implementation
procedure TFormMain.FormCreate(Sender: TObject);
var TN : TTreeNode;
begin
TN := TreeView1.Items.AddChild(nil, 'Root, ID=1, PID=0');
TN.ID := 1;
end;
procedure TTreeNode.SetID(Value: Integer);
begin
FID := Value;
end;
end.
ну и вопрос понятен - как обойти? |
|
28-01-2012 01:19сообщение от автора материала >>> И как этим пользоваться?
Везде, где действует данное объявление, если в коде стоит TMenuItem, будет использоваться данный класс, а не стандартный из юнита Menus.
>>> У меня не получается даже скомпилировать
Приведите текст сообщения об ошибке, которое выдает компилятор, и участок кода, в котором эта ошибка возникает. |
|
27-01-2012 21:15Не понял, предполагается ли это изначально, но я часто использую прием в подобных ситуациях:
type
TMenuItem = class(Menus.TMenuItem)
private
FNewProp : SomeType;
public
property NewProp : SomeType Read FNewProp write FNewProp;
end;
даже и не знаю, как можно было бы сделать по другому.
==============================
И как этим пользоваться? У меня не получается даже скомпилировать. Про хелперы знаю, но этот прием мне нравится больше |
|
09-06-2011 00:30сообщение от автора материала >>> Кстати, в книге Марко Кэнту такой custom-класс называется "interceptor class"
Маленькая поправка: "Interposer class". Информация взята из презентации "Delphi Tips and Tricks" Марко Кэнту и Кэри Дженсона на "CodeRage 5".
Ссылки на презентацию (оригинальную и переведенную на русский язык) можно взять в блоге Всеволода Леонова
Имхо, "класс-перехватчик" тоже подходит по смыслу, но "класс-вклиниватель" подходит несколько больше ;-) |
|
21-01-2011 14:29В книжке Майкла Физерса "Эффективная работа с унаследованным кодом" подобный приём называется "швом".
>>> Шов - это место, где можно изменить поведение программы, не правя код программы в этом месте.
У каждого шва есть разрешающая точка - это место, где можно выбрать один из вариантов поведения.
Швы делятся на препроцессорные (не применимо в Delphi, реализуются подменой функции макросами препроцессора), компоновочные (сюда относится "метод Geo" - это когда выбор функции выполняется за счёт подмены скомпилированных полуфабрикатов) и объектные (это когда в объекте вводится новый метод с именем = старой функции).
В случае с методом Geo разрешающей точкой будет порядок модулей в uses.
Как несложно догадаться, в книжке предлагается использовать эти приёмы, чтобы внедрить тесты в старый код, написанный без прицела на тестирование. |
|
10-10-2009 16:21сообщение от автора материала В страхе, что придется доказывать свой приоритет ( :D ), решил поискать в своих архивах самую раннюю дату использования этого метода.
С Delphi начал работать в 1996 (если память мне не изменяет). Но основная работа шла на рабочем компе. Сейчас к сожалению эти архивы утеряны (выход из строя винчестера). Осталось только то, что делал дома (либо исследование каких-то примочек, либо мелкие проекты для себя). Выполнил у себя поиск и обнаружил, что самая ранняя зафиксированная дата использования данного приема -- 31.12.1996 (ни фига себе, встретил новый год :-)).
Думаю, что есть шанс пободаться даже с самим Марко Кэнту, не говоря уж про "Крылья Ветра" :D |
|
10-10-2009 04:50Я читал. Собирался даже написать им как на самом деле этот метод называется. :) |
|
10-10-2009 04:45
08-01-2009 12:21Кстати, в книге Марко Кэнту такой custom-класс называется "interceptor class". |
|
23-12-2008 01:28сообщение от автора материала to Python:
Это, как бы, не совсем то же самое. Тут все еще более просто и очевидно. Тем более, вовсю использовалось Борландом, когда дельфийские функции и функции WinAPI имеют одинаковые названия, то вызов апишных предваряется именем модуля (сейчас это Windows). |
|
22-12-2008 14:11
22-12-2008 13:42Подобный метод подходит не только для компонентов, но и для процедур. Например, есть общеизвестная процедура Writeln. Она превосходно работает для файлов, но... увы, для консольных приложений она некорректно выводит русский текст. Причина очевидна - консоль работает в кодировке OEM, тогда как исходный код пишется в кодировке ANSI. Преобразование можно выполнять функцией:
function ToOem(const S:string):string;
begin
SetLength(Result,Length(S));
CharToOemBuff(PChar(S),PChar(Result),Length(S));
end;
Но писать каждый раз Writeln(ToOem('Привет!')); не очень удобно. Функцию можно перекрыть таким образом:
procedure Writeln(const S:string);
begin
System.Writeln(ToOem(S));
end;
Это, конечно, плохой пример, так как мы теряем больше, чем находим - Writeln умеет значительно больше, чем наша функция, но в принципе, этот метод работает и может применяться для других целей. |
|
22-12-2008 10:19сообщение от автора материала to Мухтар:
Тогда прочитайте. Хотя бы введение. И вы поймете, почему она так называется. Советую так же обратить внимание на то, что это название в самой статье взято в кавычки. Наверное, это не просто так ;-) |
|
22-12-2008 09:46 Статью не читал. Но называть статью "Шаманский метод Geo" как минимум смешно. Звучит как "метод Лобановского". |
|
22-12-2008 04:33сообщение от автора материала >>> В общем идея "локальных" компонентов проекта (или группы проектов) достаточно очевидна, странно что она до сих пор не реализована.
Мой личный жизненный опыт (пусть и не самый большой) показывает, что труднее всего заметить наиболее очевидные вещи ;-) |
|
22-12-2008 03:48Речь не об этом. Опции проекта в части используемых пакетов - это частично опции проекта, а частично опции среды. Перенесите проект на другую установку Delphi c другими установленными компонентами, и опции придётся настраивать заново. А если проект содержит собственные компоненты, придётся устанавливать их в палитру так что они по умолчанию станут видны всем проектам, и в этих проектах также придётся настраивать опции чтобы не видеть эти компоненты.
В общем идея "локальных" компонентов проекта (или группы проектов) достаточно очевидна, странно что она до сих пор не реализована.
|
|
22-12-2008 03:24Сейчас нет delphi под рукой, но разве в опциях проекта нельзя выставить галочки для тех bpl которые нужны? или я не о том говорю (я не до конца понял сообщение mr.Апреля) |
|
22-12-2008 01:06сообщение от автора материала >>> В общем имхо надо попинать разработчиков Codegear чтобы они довели до ума то, что у них уже есть
Если Вы сможете допинать разработчиков Delphi, что они добавят возможность кастомизировать палитру под конкретный проект, то я (да наверное и не только я) скажу Вам огромное спасибо ;-) |
|
20-12-2008 15:10Автор хочет связать компонент с конкретным проектом, а не с глобальной палитрой, что конечно во многих случаях разумно.
Попробуем без шаманства (экспериментировал с Delphi 2006):
1)Создаём новый Project Group (File/New/Other/Other Files/Project Group
2)Добавляем в Project Group новый пакет (я не стал его переименовывать и оставил название Package1)
3)Добавляем в Package1 новый модуль, копипастим в него код компонента TMyLabel из статьи и сохраняем под именем MyLabels.pas
4)Компилируем (build) Package1
5)Добавляем в Project Group новое VCL-приложение (Project1)
6)Открываем опции Project1, Packages/Add, находим наш Package1.bpl и добавляем его.
7)На странице Samples палитры находим наш TMyLabel, кидаем на форму, компилируем Project1, всё замечательно работает.
Но теперь начинаются неприятности - TMyLabel стал виден ВСЕМ проектам. Конечно можно исключить наш Package1 из Default Project Options, но это повлияет только на новые проекты, создаваемые в этой конкретной установке Delphi и проблему отвязать компонент от глобальной палитры и привязать к конкретной Project Group не решает.
В общем имхо надо попинать разработчиков Codegear чтобы они довели до ума то, что у них уже есть.
|
|
18-12-2008 01:00сообщение от автора материала >>> Есть предложение: если в ответе на Круглом Столе приводится код, использующий этот метод, приводить ссылку на эту статью
Ну, я и так, конечно же, привожу ;-) А вот ходят ли по приведенной ссылке авторы вопросов... |
|
17-12-2008 14:00Есть предложение: если в ответе на Круглом Столе приводится код, использующий этот метод, приводить ссылку на эту статью, дабы не вводить в ступор тех, кто видит этот приём в первый раз. Причины ступора:
1. Непонятно.
2. Боязно использовать.
Кроме того, возможны неожиданности в других модулях, ипользующих модуль с переопределённым компонентом. Человек должен чётко представлять механизм и возможные побочные эффекты. Если внесённые изменения могут быть нежелательны в других местах, перекрывающий класс лучше выносить в отдельный модуль и подключать через uses, тогда он будет действовать только в целевом модуле. |
|
18-07-2008 06:34Пользовался, пользуюсь и буду пользоваться.
За что автору (и королевству, разумеется) большое спасибо.
Не понял, предполагается ли это изначально, но я часто использую прием в подобных ситуациях:
type
TMenuItem = class(Menus.TMenuItem)
private
FNewProp : SomeType;
public
property NewProp : SomeType Read FNewProp write FNewProp;
end;
даже и не знаю, как можно было бы сделать по другому. |
|
10-07-2008 08:26
10-07-2008 01:53сообщение от автора материала to bik:
Как правильно заметил Sega-Zero, обсуждение вопросов публикации и авторских прав в данной теме является оффтопиком. Мне есть что Вам ответить, но делать здесь я это не буду. Если Вам действительно интересен данный вопрос, то можете написать мне мейлом через мой профиль. Или попросить Королеву создать новую тему на Базарной Площади. |
|
10-07-2008 00:48Все очень просто и казалось бы нативно, но я об этом не догадывался. Спасибо за расширение кругозора. Все гениальное просто.
А насчет установки компонентов в палитру: я тоже не люблю забивать ее разным мусором. Да и с переносом проектов на другой комп потом проблемы. В палитру следует устанавливать компоненты, которые используются в разных проектах, например, подменяя стандартные, или имеется главный основной проект, использующий эти компоненты. А так я почти все новое создаю в рантайме. Геморой, конечно есть, но не хронический. |
|
09-07-2008 15:20Поздравляю, Гео! Отличная статья, даже не думал раньше о такой фиче :))
+1 к хедеру материала |
|
09-07-2008 11:57Хрен знает что, господа!
А на кой ляд вы вообще здесь статьи и прочее пишете, если это не может быть перепечатано и скопировано? Маразм какой-то. Спрячьте в сундук и никто ваши умные мысли использовать не будет.
Я понимаю, что печатается все для того, чтобы другие люди могли не ходить по тем же тропкам. И не последнее место занимают самолюбие и профессиональная гордость авторов. Таки не надо ныть, как хлюпикам в дестком саду, у которых сломали песочный домик. Вообще заняли жуткое место на сайте под всякого рода разговоры на "завалинке", которые уместно вести старым бабкам, которым делать нечего. Противно даже читать все это. |
|
09-07-2008 06:36господа модераторы и просто юзеры (: вам не кажется, что перепечатка статей на других сайтах к обсуждению этой статьи как то слабо относится?:) Давайте создадим тему на БП и там будем это обсуждать;) А то оффтоп жуткий просто (кошмар, и мне об этом приходится напоминать модераторам? :о)) |
|
09-07-2008 03:19>>>некая новостная панель нашего хостера
А я почему то подумал про третье зеркало Королевства.
>>>... современные мысли носятся вокруг особенностей реализации (ActiveX, .NET и т.п.) ...
Пусть носятся, особенно вокруг да около, IMHO реальная классика актуальнее! :) Или только у меня одного Delphi7 (и 6) осталась? :) |
|
09-07-2008 01:37сообщение от автора материала >>> А ещё её опубликовали на http://dotnetpanel.org
Это, как я понял, некая новостная панель нашего хостера. Обратите внимание на ссылку внизу страницы, кто предоставляет хостинг Королевству.
С таким же успехом можно обвинить subscribe.ru :D На самом деле есть и еще упоминания, но, в основном, это ссылки.
>>> как Ваш современный взгляд и мысли профессионала на эту тему
Здесь маленький нюанс. Дело в том, что мои мысли, возможно, уже далеко несовременные. Так как современные мысли носятся вокруг особенностей реализации (ActiveX, .NET и т.п.). Ну и еще... вообще-то я не являюсь профессиональным программистом :D |
|
08-07-2008 22:25А ещё её опубликовали на http://dotnetpanel.org! Но без нарушений копирайта :)
загадочное имя у этого сайта при дословном переводе
>>>... вернутся к работе над начатой серией статей ...
Тем серия и хороша что можно выкладывать кусочками, а не отдавать всю и сразу!
Очень жду кусочек про "зачем вообще объединять свой код в классы" и остальное как Ваш современный взгляд и мысли профессионала на эту тему. А то Кнопка уже до дыр зачитан. |
|
08-07-2008 01:37сообщение от автора материала Нашел еще в одном месте свою статью. Удивляет то, то дали правильную ссылку на оригинальную публикацию, но текст передрали у "Интерфейса" (видно по названию и еще кое-каким характерным приметам). В общем, сейчас с человеком списались и, вроде как, договорились. |
|
08-07-2008 00:50Когдая там свою статью обнаружил, то Елена Филиппова сказала, что у Королевства есть договоренность с CITForum о публикации у них "королевских" материалов
На самом деле договорённость была только о публикации нескольких конкретных статей, но CIT'овцы поняли это разрешение слишком широко, а Елена не хочет с ними ссориться и переубеждать их. Но статьи они действительно убирают, если автор настаивает - мне удалось заставить их убрать мои статьи.
Но к CITFoum'у приведённый Сергеем Осколковым адрес, похоже, не имеет никакого отношения. Просто случайное совпадение. Это сайт некоей фирмочки "1СИТ - 1-й центр информационных технологий" из Красноармейска, которой тоже силёнок явно не хватает, чтобы наполнять свой сайт оригинальными материалами.
У них на сайте есть форум. Как показывает практика, обычно о плагиате эффективнее писать прямо в форум - конечно, в большинстве случаев банят, но от греха подальше предпочитают убирать статьи или выполнять другие требования автора, потому что огласка такой некрасивой деятельности никому не нужна. |
|
07-07-2008 08:31Geo, я думаю, что это другой сайт. На citforum как раз указывают автора и происхождение статьи.
Почему не открывается адрес, не знаю, у меня открывается. (( |
|
07-07-2008 08:24сообщение от автора материала Сергей!
У меня приведенный адрес открываться не хочет, но, судя по анализу адреса, это одно из зеркал CITForum. Когдая там свою статью обнаружил, то Елена Филиппова сказала, что у Королевства есть договоренность с CITForum о публикации у них "королевских" материалов. То, что Вам не ответил на мейл, странно. Потому что мне ответили очень быстро. И все мои просьбы по публикации были удовлетворены. Видимо, Вы писали не на тот адрес.
Я сейчас порылся в своих почтовых архивах через WEB-интерфейс, но нужного мейла не нашел. Попробую еще дома на локальном клиенте полискать нужный адрес. |
|
07-07-2008 08:11
07-07-2008 08:07
07-07-2008 06:42Ivax:
но ссылка ведет на главную страницу :)
Мои статьи по моему требованию оттуда уже убраны. Вместе с комментариями, разумеется. |
|
07-07-2008 06:28
07-07-2008 03:50сообщение от автора материала >>> Тут есть один нюанс
Есть. Но есть и другой нюанс: перепечатку все равно не остановить. Интересный материал все равно будут таскать. Так что я придерживаюсь в этом вопросе стандартных правил вежливости: перепечатывайте на здоровье, но выполняйте при этом несколько требовнаий:
1. Не искажайте материал.
2. Указывайте автора.
3. Публикуйте ссылку на Королевство и оригинальную публикацию.
Из трех пунктов был выпролнен только третий. После моего письма выполнены и первые два пункта. Посему претензий в этом вопросе к "Интерфейсу" у меня больше нет. |
|
07-07-2008 03:42авторские права на мои статьи принадлежат мне самому
Тут есть один нюанс: передавая свою статью на публикацию в Королевство, вы соглашаетесь с нашими правилами, в т.ч.: "Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта (выделено мной - А.Г.)" (эта фраза есть внизу на каждой странице). Но так как вы, Юрий, входите в команду Королевства, будем считать, что в данном случае администрация сайта тоже дала своё разрешение ;) |
|
07-07-2008 03:05сообщение от автора материала Мне несколько проще: авторские права на мои статьи принадлежат мне самому, а я никогда не возражал против их перепечаток с указанием ссылки на оригинал и автора.
В общем, от "Интерфейс" я отклик уже получил. Очень оперативно. Претензии по поводу искажений и отсутствия авторства удовлетворены, статья поправленя в соответствии с замечаниями, извинения принесены и приняты. Так что претензий к "Интерфейс" у меня болоьше нет. Разве что они не смогли название поставить в кавычках (а это важно). Ну, да бог с ними ;-) |
|
07-07-2008 02:48В общем, написал на "Интерфейс" письмо, в котором вежливо высказался по поводу неуместности, с моей точки зрения, некоторых их действий. Перепечатка статей -- это уже дело вполне привычное. Но вот неуказание автора и искажение названия -- это уже не очень хорошо. Посмотрим, что из этого получится ;-)
Я тоже написал, тоже жду. В моём случае, правда, есть нюанс - они скопировали ту статью, которая вошла в книгу, и право на её публикацию теперь принадлежит издательству. О чём есть соответствующий договор, оформленный по всем правилам. Не знаю, напугает ли их это, попробую ещё позвонить, поговорить лично.
Ещё написал комментарий к своей статье, размещённой там, в которой изложил своё мнение по поводу такого копирования: http://www.interface.ru/iservices/messages.asp?forumId=587&fromId=16336
Предлагаю всем авторам, чьи статьи также оказались скопированными без разрешения, оставить аналогичное сообщение в комментариях к своим статьям. Вот неполный список того, что скопировано с Королевства:
http://www.interface.ru/home.asp?artId=16505
http://www.interface.ru/home.asp?artId=16705
http://www.interface.ru/home.asp?artId=16504
http://www.interface.ru/home.asp?artId=16430
http://www.interface.ru/home.asp?artId=16429
http://www.interface.ru/home.asp?artId=16369 |
|
07-07-2008 02:43
07-07-2008 01:49сообщение от автора материала В общем, написал на "Интерфейс" письмо, в котором вежливо высказался по поводу неуместности, с моей точки зрения, некоторых их действий. Перепечатка статей -- это уже дело вполне привычное. Но вот неуказание автора и искажение названия -- это уже не очень хорошо. Посмотрим, что из этого получится ;-)
to Ivax:
Спасибо за отзыв. Но Вы же теперь меня обязываете вернутся к работе над начатой серией статей по разработке компонент ;-) |
|
06-07-2008 14:56Вопрос о преимуществах модификации стандартных компонент перед использованием сторонних компонент, перед использованием обработчиков событий, позволяющих зачастую изменять внешний вид стандартных компонент в достаточно широком диапазоне, а также зачем вообще объединять свой код в классы, а не ограничиться применением стандартных классов, выходит за рамки данной статьи.
Надеюсь это будет столь же интересная статья и не одна. Буду ждать :) |
|
04-07-2008 11:18
04-07-2008 10:13сообщение от автора материала Я тоже заметил эту статью. Причем еще и название исказили. Не стал ругаться только потому, что там есть ссылка на оригинальную статью на Королевстве Delphi. Кому будет интересно, пойдет по ссылке и все прочитает. |
|
04-07-2008 09:46А статья-то в народ пошла!
Ага, причём, как обычно, без указания имени автора. На фразу "Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта" внимания явно не обратили - не знаю, как к автору, но к администрации сайта за разрешением никто не обращался. Небольшой поиск показал, что там ещё несколько скопированных таким же образом статей с Королевства, тоже без указания автора. Вроде, "Интерфейс" - фирма известная, с хорошей репутацией, а тут вдруг ведёт себя так непорядочно. Кризис у них, что ли, на честное заполнение сайта средств перестало хватать? |
|
04-07-2008 06:57
03-07-2008 04:16А название статьи порадовало:) Давно ждал от вас этой статьи:)
Эт точно! :) Теперь, говоря "Шаманский метод Geo", можно будет подкрепить слова ссылкой |
|
03-07-2008 04:00>>> Могу только добавить, что там автор предлагает использовать такого рода прием для фикса багов
Так получилось, что этот трюк вошёл в серию постов о возможных фиксах компонент в связи с выходом D2007 - non-breaking release. Там же рядом лежат ещё два способа (более грязных) для достижения той же цели (имеется ввиду фикс прогрессбара) - подмена класса и замена виртуальных методов. |
|
03-07-2008 02:14сообщение от автора материала >>> Однако, есть небольшой недостаток в таком подходе - описание "нового" компонента находится в интерфейсной части модуля.
А что в этом плохого? Я как-то не считаю, что в модуле формы ы интерфейсной части не должно быть ничего, кроме объявления класса формы ;) |
|
03-07-2008 01:55Да, хорошая статья, особенно для новичков. Однако, есть небольшой недостаток в таком подходе - описание "нового" компонента находится в интерфейсной части модуля.
PS Предлагаю все, что еще небыло напечатано на КД, называть "методом Geo" ;-) |
|
03-07-2008 01:29сообщение от автора материала to Александр Алексеев:
Лишнее подтверждение того, что идея лежит на поверхности.
Могу только добавить, что там автор предлагает использовать такого рода прием для фикса багов, я же -- жуткая сволочь -- предлагаю к массовому использованию как штатный прием при разработке своих проектов :D |
|
02-07-2008 12:40
01-07-2008 06:49Да, забыл сказать, что статья мне очень понравилась. Предполагал, что подобное сделать возможно, но никогда не экспериментировал. Спасибо, возьму на вооружение :) |
|
01-07-2008 06:35сообщение от автора материала >>> Ну почему же? Очень даже можно.
Во-первых, то, что сказал Александр Алексеев. Во-вторых, речь идет не о повторе в новом классе функционала оригинального класса, а об использовани оригинального класса: это несколько разные вещи. В-третьих, подозреваю, что не все модификации можно отключить флажком: имейте в виду, что можно не только рисование рамочки добавлять, но и вносить более существенные изменения.
А что касается простенького примера из статьи, то в нем всего лишь надо выставить BorderColor равным значению Color, чтобы внешний вид совпал с оригинальным ;-) Правда, это не сработает (или сработает?), если Transparent = true. |
|
01-07-2008 06:34И как же это вы собираетесь переключать IsStandart во время проектирования и загрузки формы?
Да даже элементарных Label1.IsSnandart:=true при создании формы. А можно вообще использовать Label1.Tag =0 - стандартное поведение, <>0 - рисуем рамочку. Можно вообще по значению Tag рисовать разные рамочки и не только их |
|
01-07-2008 06:13И как же это вы собираетесь переключать IsStandart во время проектирования и загрузки формы? |
|
01-07-2008 05:42>>> Как использовать на одной форме модифицированный и не модифицированный TLabel?
Никак. Только если что-то создавать в run-time.
Ну почему же? Очень даже можно. Ну, правда, еще более модифицированный - добавляется мааааленький флажочек :)procedure TLabel.Paint;
begin
inherited;
if IsStandart then exit;
with Canvas do
begin
Brush.Color:=BorderColor;
FrameRect(ClientRect);
end;
end; |
|
01-07-2008 05:20сообщение от автора материала >>> Честно говоря, мне кажется, лучше создавать свои компоненты и добавлять их в палитру.
Это хорошо, если Вы постоянно занимаетесь развитием одного и того же проекта. Тогда это будет не просто лучше, это будет правильный вариант.
А у меня, например, долгосрочных серьезных проектов нет. Зато уйма мелких программок (утилиты для себя, игрушки для детей и т.п.). При этом практически в любом проекте либо доабатываются существующие классы, либо создаются новые. Зачастую, изменения незначительны, но я принципиальный сторонник инкапсуляции функционала в классы, но принципиальный противник использования универсальных компонент, которые делают то, что нужно в конкретной задаче, и еще уйму того, что в конкретной задаче не нужно. Вы представляете, как бы раздулась моя палитра?
>>> Такие махинации с подменой VCL-классов ни к чему хорошему не приведут и запутают программистов при совместной разработке.
Могут запутать, если уровень программистов низок (компонентонаформокидатели) и если информационное обеспечение работ не продумано.
>>> Как использовать на одной форме модифицированный и не модифицированный TLabel?
Никак. Только если что-то создавать в run-time. Данное ограничение прописано в статье.
>>> Поэтому сразу появляется желание вынести модифицированный TLabel в отдельный модуль. Как я понимаю, в этом случае метод перестает работать.
Ничуть не перестает. Про это тоже написано в статье. Вариант предложен Юрием Спектором (ака Ins).
>>> Если взвесить все плюсы и минусы, то мне кажется лучше использовать свои компонент зарегестрированный в палитре.
Не получится взвесить все плюсы и минусы один раз на все случаи жизни. Их нужно взвешивать для конкретной задачи. Моменты, которые обязательно нужно учесть в процессе взвешивыания, упомянуты в статье. |
|
01-07-2008 04:10Честно говоря, мне кажется, лучше создавать свои компоненты и добавлять их в палитру. Такие махинации с подменой VCL-классов ни к чему хорошему не приведут и запутают программистов при совместной разработке. Возникает ряд вопросов: Как использовать на одной форме модифицированный и не модифицированный TLabel? Во вторых, к примеру, я не сторонник описания с десятка классов в одном модуле. Поэтому сразу появляется желание вынести модифицированный TLabel в отдельный модуль. Как я понимаю, в этом случае метод перестает работать. Если взвесить все плюсы и минусы, то мне кажется лучше использовать свои компонент зарегестрированный в палитре. |
|
01-07-2008 01:37сообщение от автора материала >>> Но компоненты, созданные в рантайме с явным указанием модуля будут старыми
Это, конечно, правильное замечание. Но, поскольку речь в статье идет именно о визуальном проектировании, то решил не уточнять этот момент каждый раз. И так размер раздулся. Думал будет совсем чуть-чуть, а когда, закончив, увидел в Ворде шесть страниц, то был изрядно удивлен ;-)
>>> ПМСМ ни чего шаманского. Вполне нормальный метод.
Ну, я же сказал, что название исторически сложившееся. Я и себя в названии метода выпячивать не стал бы ;-) |
|
01-07-2008 00:52З.Ы. А название статьи порадовало:) Давно ждал от вас этой статьи:)
Ага. Интересная история у меня с этим названием произошла:
Переписывался по аське с одним знакомым, обсуждали какую-то реализацию, и тут я упомянул про "метод Geo". "Что это за метод?" - не понял он. Объяснил на пальцах, этот способ он знал (он достаточно опытный программист), следом вопрос - "А кто такой Geo?" Оказалось, и про Королевство он знал, просто не принимал участие в обсуждениях. Но название ему понравилось :D Согласитесь, это короче, чем "использование одинаковых имён с указанием конкретного модуля". |
|
01-07-2008 00:38ПМСМ ни чего шаманского. Вполне нормальный метод. |
|
30-06-2008 23:47Не получится на одной форме использовать и оригинальные, и модифицированные компоненты. Только что-то одно.
Это немного неверное утверждение :о) Те, что были созданы дизайнером форм - безусловно станут таковыми. Но компоненты, созданные в рантайме с явным указанием модуля будут старыми. Иногда это то, что доктор прописал (:
З.Ы. А название статьи порадовало:) Давно ждал от вас этой статьи:) |
|
|
|