Суміш бульдога з носорогом, Різне, Програмування, статті

В одному з попередніх постів я згадував про переведення Delphi проекту на DevExpress. Оскільки однією з основних причин такого рішення була необхідність створення т.зв. Ribbon-інтерфейсу, то в проекті довелося міняти всі контроли. Самі розумієте, на тлі Ribbon-меню звичайні сірі кнопки, списки, радіо-Баттон і чек-бокси виглядають не дуже … Дуже швидко з’ясувалося, що переробити головне меню – не найскладніше. Компонент TdxBarConverter успішно вирішує це завдання (Потрібно лише легка “доробка напилком”). Але якщо проект містить декілька сотень контролів, які активно використовуються в коді, то про трудомісткість їх заміни в ручну краще і не говорити. На щастя існує кілька безкоштовних розширень IDE, що дозволяють автоматизувати цей процес. Я користуюся, як мені здається, кращим з безкоштовних рішень – набором GExperts. Однією з його можливостей є автоматична заміна одного контрола на інший. При цьому можна замінити не просто одиничний елемент, але і всі елементи на формі або у проекті. Звичайно, замінювати за допомогою даного інструменту, такі складні компоненти, як DBGrid не варто. Все ж у того ж DBGridEh і cxGrid абсолютно різна структура. Але з DBComboBox “ами і іншими” простими “контролем GExperts справляється непогано. Якби не одне” АЛЕ “… Враховуючи те, що котнтроли DevExpress просто перенасичені функціональністю, з творці вирішили спростити життя своїм клієнтам (а можливо і собі). Ряд властивостей більшості контролов був згрупований в окремі класи. Так скажімо, звернутися до списку значень TcxComboBox можна таким чином:

cxComboBox.Proiperties.Items …


в той час, як для VCL-евского TComboBox звернення буде виглядати так:

ComboBox1.Items …

Природно, що майстер заміни контролов не може розв’язати такі розбіжності і їх доводиться правити вручну … Навіть маючи перед собою два монітори, я швидко прийшов до висновку, що поелементне порівняння кожної форми – заняття досить обтяжлива. Рішення ж даної проблеми виявилося досить простим.


unit cxATRComboBox;
interface
uses
SysUtils, Classes, Controls, cxControls, cxContainer, cxEdit, cxTextEdit,
cxMaskEdit, cxDropDownEdit;
type
TcxATRComboBox = class(TcxComboBox)
private
FOnChange: TNotifyEvent;
FOnDropDown: TNotifyEvent;
function GetItems: Tstrings;
procedure SetItems(const Value: Tstrings);
function GetOnChange: TNotifyEvent;
procedure SetOnChange(const Value: TNotifyEvent);
function GetDropDown: TNotifyEvent;
procedure SetDropDown(const Value: TNotifyEvent);
{ Private declarations }
protected
{ Protected declarations }
public
{ Public declarations }
constructor Create(AOwner: TComponent); override;
published
{ Published declarations }
property Items: Tstrings read GetItems write SetItems;
property OnChange: TNotifyEvent read GetOnChange write SetOnChange;
property OnDropDown: TNotifyEvent read GetDropDown write SetDropDown;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents(“Dev Express My Own”, [TcxATRComboBox]);
end;
{ TcxATRComboBox }
constructor TcxATRComboBox.Create(AOwner: TComponent);
begin
inherited;
end;
function TcxATRComboBox.GetDropDown: TNotifyEvent;
begin
Result:= FOnDropDown;
end;
function TcxATRComboBox.GetItems: Tstrings;
begin
Result:= self.Properties.Items;
end;
function TcxATRComboBox.GetOnChange: TNotifyEvent;
begin
Result:= FOnChange;
end;
procedure TcxATRComboBox.SetDropDown(const Value: TNotifyEvent);
begin
self.Properties.OnPopup:=Value;
FOnDropDown:= Value;
end;
procedure TcxATRComboBox.SetItems(const Value: Tstrings);
begin
if Assigned(self.Properties.Items) then
self.Properties.Items.Assign(Value)
else
self.Properties.Items := Value;
end;
procedure TcxATRComboBox.SetOnChange(const Value: TNotifyEvent);
begin
self.Properties.OnChange:=Value;
FOnChange:= Value;
end;
end.

Як видно з коду, ми просто створюємо спадкоємця для кожного з “неприємних” контролів. У цих спадкоємців ми просто вводимо “відсутні” властивості і зчитуючи і записуючи їх значення посилаємося на аналогічні наявні в класі-батьку. Так у нас з’являється властивість Items, хоча фактично працюючи з ним, ми працюємо з властивістю Properties.Items. І майстер заміни компонентів задоволений таким відповідністю взаємозамінних класів і компілятор не лається … Класичний приклад того, як “краще день втратити, але за п’ять хвилин долетіти” (c).

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*