Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Компоненты";
Текущий архив: 2005.12.11;
Скачать: [xml.tar.bz2];

Вниз

Вывод текста в собственном компоненте   Найти похожие ветки 

 
Max_005   (2005-04-18 12:43) [0]

Пишу компонент. Приведу часть его кода:

type
TMyComp = class(TGraphicControl)
private
  function GetCanvas: TCanvas;
  ...
protected
  procedure Paint; override;
  ...
public
  constructor Create(AOwner: TComponent); override;
  destructor Destroy; override;
  property Canvas: TCanvas read GetCanvas;
  ...


function TMSSkinUltraMenu.DestRect: TRect;
var
w, h, cw, ch: Integer;
xyaspect: Double;
begin
if FShowPictute = shwPictureUp then
  begin
  w := PictureUp.Width;
  h := PictureUp.Height;
  end;
if FShowPictute = shwPictureMove then
  begin
  w := PictureMove.Width;
  h := PictureMove.Height;
  end;
cw := ClientWidth;
ch := ClientHeight;
if Stretch or (Proportional and ((w > cw) or (h > ch))) then
begin
if Proportional and (w > 0) and (h > 0) then
begin
    xyaspect := w / h;
    if w > h then
    begin
      w := cw;
      h := Trunc(cw / xyaspect);
      if h > ch then  // woops, too big
      begin
        h := ch;
        w := Trunc(ch * xyaspect);
      end;
    end
    else
    begin
      h := ch;
      w := Trunc(ch * xyaspect);
      if w > cw then  // woops, too big
      begin
        w := cw;
        h := Trunc(cw / xyaspect);
      end;
    end;
  end
  else
  begin
    w := cw;
    h := ch;
  end;
end;

with Result do
begin
  Left := 0;
  Top := 0;
  Right := w;
  Bottom := h;
end;

if Center then
OffsetRect(Result, (cw - w) div 2, (ch - h) div 2);
end;

procedure TMyComp.Paint;
var
Save: Boolean;
begin
if csDesigning in ComponentState then
with inherited Canvas do
begin
Pen.Style := psDash;
Brush.Style := bsClear;
Rectangle(0, 0, Width, Height);
end;
Save := FDrawing;
FDrawing := True;
try
with inherited Canvas do
  begin
  if FShowPictute = shwPictureUp then
    begin
    StretchDraw(DestRect, PictureUp.Graphic);
    end;
  if FShowPictute = shwPictureMove then
    begin
    StretchDraw(DestRect, PictureMove.Graphic);
    end;
  end;

finally
FDrawing := Save;
end;
end;

function TMyComp.GetCanvas: TCanvas;
var
Bitmap: TBitmap;
begin
if FShowPictute = shwPictureUp then
  begin
    if PictureUp.Graphic = nil then
      begin
     Bitmap := TBitmap.Create;
       try
       Bitmap.Width := Width;
       Bitmap.Height := Height;
       PictureUp.Graphic := Bitmap;
       finally
       Bitmap.Free;
       end;
      end;
    if PictureUp.Graphic is TBitmap then
     Result := TBitmap(PictureUp.Graphic).Canvas
    else
     raise EInvalidOperation.Create(SImageCanvasNeedsBitmap);
  end;

if FShowPictute = shwPictureMove then
  begin
    if PictureMove.Graphic = nil then
      begin
     Bitmap := TBitmap.Create;
       try
       Bitmap.Width := Width;
       Bitmap.Height := Height;
       PictureMove.Graphic := Bitmap;
       finally
       Bitmap.Free;
       end;
      end;
    if PictureMove.Graphic is TBitmap then
     Result := TBitmap(PictureMove.Graphic).Canvas
    else
     raise EInvalidOperation.Create(SImageCanvasNeedsBitmap);
  end;
end;

Но у меня есть одна небольшая загвоздка... Как мне вывести текст в этом компоненте? И чтобы сам текст, цвет, шрифт текста задавались в свойствах? Помогите пожалуйста. Я в процедуре Paint написал:

Canvas.Font:=Font;
 Canvas.TextOut(Round((Width-Canvas.TextWidth(Caption))/2), Round((Height-Canvas.TextHeight(Caption))/2), Caption);

Но фон текста белый и перекрывает все... а еще он не по середине...


 
Max_005   (2005-04-18 13:59) [1]

???


 
MBo ©   (2005-04-18 14:30) [2]

хм... Я уже отвечал в эту ветку, но, видно, форум глюкнул...

>Но фон текста белый и перекрывает все
SetBkMode или Brush.Style

>еще он не по середине
убери round, деление замени на div 2 - вещественная арифметика здесь ни к чему, хотя на результат это не влияет. А расчет положения - вообще-то правильный, должно примерно по центру компонента рисоваться.
DrawText с фланами центрирования можно еще попробовать


 
Юрий Зотов ©   (2005-04-18 15:03) [3]

Похоже, Вам нужно что-то типа этого. Во всяком случае, это пример того, как выводится текст и как выносятся в свойства параметры его вывода.


type
 TMyComp = class(TGraphicControl)
 private
   function GetBrush: TBrush;
   function GetFont: TFont;
   function GetPen: TPen;
   procedure SetBrush(const Value: TBrush);
   procedure SetFont(const Value: TFont);
   procedure SetPen(const Value: TPen);
   procedure CMTextChanged(var Messsage: TMessage); message CM_TEXTCHANGED;
 protected
   procedure Paint; override;
   procedure GraphicsObjectChanged(Sender: TObject);
 public
   constructor Create(AOwner: TComponent); override;
 published
   property Brush: TBrush read GetBrush write SetBrush;
   property Pen: TPen read GetPen write SetPen;
   property Font: TFont read GetFont write SetFont;
   property Text;
 end;

implementation

{ TMyComp }

procedure TMyComp.CMTextChanged(var Messsage: TMessage);
begin
 inherited;
 Invalidate
end;

constructor TMyComp.Create(AOwner: TComponent);
begin
 inherited;
 Brush.OnChange := GraphicsObjectChanged;
 Pen.OnChange := GraphicsObjectChanged;
 Font.OnChange := GraphicsObjectChanged
end;

function TMyComp.GetBrush: TBrush;
begin
 Result := Canvas.Brush
end;

function TMyComp.GetFont: TFont;
begin
 Result := Canvas.Font
end;

function TMyComp.GetPen: TPen;
begin
 Result := Canvas.Pen
end;

procedure TMyComp.GraphicsObjectChanged(Sender: TObject);
begin
 Invalidate
end;

procedure TMyComp.Paint;
begin
 inherited;
 with Canvas do
   TextOut((Width - TextWidth(Text)) div 2, (Height - TextHeight(Text)) div 2, Text)
end;

procedure TMyComp.SetBrush(const Value: TBrush);
begin
 Canvas.Brush.Assign(Value)
end;

procedure TMyComp.SetFont(const Value: TFont);
begin
 Canvas.Font.Assign(Value)
end;

procedure TMyComp.SetPen(const Value: TPen);
begin
 Canvas.Pen.Assign(Value)
end;


 
Max_005   (2005-04-18 15:50) [4]

Спасибо Юрий Зотов! Вроде я разобрался... только одно мне не понятно, зачем свойство "Pen"? что оно определяет?


 
Юрий Зотов ©   (2005-04-18 15:54) [5]

Свойства пера. Если надо будет рисовать какие-то линии и т.п. - вот тут-то оно и пригодится.


 
Max_005   (2005-04-18 16:01) [6]

Юрий Зотов извени за надоедливость... Я теперь не понимаю зачем тогда свойство "Brush"? что оно определяет? а еще как мне сделать фон текста прозрачным? Помоги пожалуйста


 
Юрий Зотов ©   (2005-04-18 16:19) [7]

> Max_005   (18.04.05 16:01) [6]

А разве в справке ничего про Brush не написано?

Сделать фон прозрачным - посмотрите, как сделана прозрачность у TLabel.


 
Max_005   (2005-04-18 16:55) [8]

Я прежде чем задать этот вопрос, посмотрел уже как сделан Label, если честно что-то я не понял как... Вот прорисовка Label-а:

procedure TCustomLabel.Paint;
const
 Alignments: array[TAlignment] of Word = (DT_LEFT, DT_RIGHT, DT_CENTER);
 WordWraps: array[Boolean] of Word = (0, DT_WORDBREAK);
var
 Rect, CalcRect: TRect;
 DrawStyle: Longint;
begin
 with Canvas do
 begin
   if not Transparent then
   begin
     Brush.Color := Self.Color;
     Brush.Style := bsSolid;
     FillRect(ClientRect);
   end;
   Brush.Style := bsClear;
   Rect := ClientRect;
   { DoDrawText takes care of BiDi alignments }
   DrawStyle := DT_EXPANDTABS or WordWraps[FWordWrap] or Alignments[FAlignment];
   { Calculate vertical layout }
   if FLayout <> tlTop then
   begin
     CalcRect := Rect;
     DoDrawText(CalcRect, DrawStyle or DT_CALCRECT);
     if FLayout = tlBottom then OffsetRect(Rect, 0, Height - CalcRect.Bottom)
     else OffsetRect(Rect, 0, (Height - CalcRect.Bottom) div 2);
   end;
   DoDrawText(Rect, DrawStyle);
 end;
end;

Вот там есть если Transporent не true, а если true ничего нету...:(


 
Max_005   (2005-04-18 17:15) [9]

может еще гдето реализовано? в другом событии? ткните мне на это, а то я так не разберусь...:(


 
jack128 ©   (2005-04-18 17:23) [10]

Вот тут выводится текст метки.
Max_005   (18.04.05 16:55) [8]
DoDrawText(Rect, DrawStyle);

Смотри как устроена эта функция..


 
Юрий Зотов ©   (2005-04-18 17:24) [11]

А если True, то этот кусок кода просто НЕ исполняется. То есть, фон НЕ закрашивается, а текст рисуется прямо по существующему фону, каким бы он ни был. Только и всего.


 
Max_005   (2005-04-18 17:49) [12]

Я сейчас откапал в интернете функцию SetBkMode может ей лучше воспользоваться?


 
Max_005   (2005-04-18 18:19) [13]

Я сделал вот как:

procedure TMSSkinUltraMenu.Paint;
var
 Save: Boolean;
begin
if csDesigning in ComponentState then
with inherited Canvas do
 begin
 Pen.Style := psDash;
 Brush.Style := bsClear;
 Rectangle(0, 0, Width, Height);
 end;
Save := FDrawing;
FDrawing := True;
 try
 with inherited Canvas do
   begin
   if FShowPictute = shwPictureUp then
     begin
     StretchDraw(DestRect, PictureUp.Graphic);
     end;
   if FShowPictute = shwPictureMove then
     begin
     StretchDraw(DestRect, PictureMove.Graphic);
     end;
   end;

 Canvas.Brush.Style:=bsClear;
 Canvas.TextOut((Width-Canvas.TextWidth(Text)) div 2, (Height-Canvas.TextHeight(Text)) div 2, Text);

 finally
 FDrawing := Save;
 end;
end;

Прозрачность появилась... только теперь почему то не работают шрифты...:( а еще при наведении курсора на компонент у меня идет перерисовка, функция "Refresh" так вот при наведении курсора у меня текст почемуто еще рисуется вверху, слева... а как курсор вне зоны компонента идет тоже перерисовка... и надпись вторая(которая слева, сверху) исчезает... что это такое? текст то должен нигде не рисоваться...


 
Max_005   (2005-04-18 18:46) [14]

почему все это не работает? я наверно всем надоел тут... Я на самом деле компоненты никогда не писал... я новичек в этом деле... да и программировать недавно начал только... А этот компонент мне позарез как нужен... Может поможет ктонибудь или хотябы объяснит... Почему я когда задаю Canvas.Brush.Style:=bsClear; то шрифты которые задаются так:

published
property Font: TFont read GetFont write SetFont;
...
function TMSSkinUltraMenu.GetFont: TFont;
begin
Result := Canvas.Font
end;

procedure TMSSkinUltraMenu.SetFont(const Value: TFont);
begin
Canvas.Font.Assign(Value)
end;

не работают...:(


 
Юрий Зотов ©   (2005-04-18 19:40) [15]

> Max_005

Объяснять придется слишком много, на эту тему аж книжки написаны. Если хотите научиться писать компоненты, то стоит одну из них купить (Фаронова, или Веселова с Головановым). А для примера могу попробовать набросать скелет (работающий) Вашего компонента - но для этого надо знать, что он должен делать.


 
Max_005   (2005-04-18 19:55) [16]

Юрий Зотов, давай я тебе пришлю весь свой код компанента? там наверняка 2-3 строчки подписать чтобы было все нормально... А компонент у меня вот что делать должен: за основу взят Image(сам его код), но он переделан. добавил по аналогии еще одно свойство для изображения. Мне нужно чтобы при наведении курсора то которое изображение сейчас показывается изменилось на второе... а при нажатии по компоненту правой кнопкой расскрывался popup. Этот popup проставляется в свойстве ActiveMenu. но это наверно лучше увидить код...


 
Max_005   (2005-04-18 20:04) [17]

но забыл сказать самое главное... текст чтобы был поверх этих картинок всегда... я сначала сделал чтобы этот текст был нарисован на изображении... но теперь переделываю чтобы программно писался... вот и мучаюсь... не знаю как это сделать...:(


 
Юрий Зотов ©   (2005-04-18 20:26) [18]

> Max_005   (18.04.05 19:55) [16]

> давай я тебе пришлю весь свой код компанента?

Не стоит. Свой я напишу за час, а на разбор и переделку чужого кода могут потребоваться сутки.

> там наверняка 2-3 строчки подписать чтобы было все
> нормально...

Не уверен. Компоненты имеют свою специфику, поэтому если нет опыта написания компонентов, то запросто может оказаться, что он изначально неверно спроектирован и его проще переписать с нуля, чем переделывать. Такое - не редкость, даже когда компонент написан сильным программистом, но просто не имеющим опыта написания именно компонентов.

Давайте уж лучше уясним задачу.

Итак - компонент хранит 2 картинки. Когда курсор находится над компонентом, то показывается одна, когда за его пределами - вторая. Поверх каждой картинки рисуется свой текст и он показывается вместе с самой картинкой, на ее фоне. Компонент имеет свойство "popup-меню" и это меню должно выскакивать при щелчке по компоненту правой кнопкой мыши.

Все так, или что-то я понял неверно?


 
Max_005   (2005-04-18 21:36) [19]

Юрий Зотов пришли тогда на xkiller@pisem.net
А я сейчас еще в Библио-Глобус(книжный) съездил, купил Фаронова по разработке компонентов... Только что приехал. Я и ее почитаю еще :)


 
Юрий Зотов ©   (2005-04-19 01:23) [20]

> Max_005

Вот обещанный код (рассчитан на D7, но с небольшими переделками сможет работать в любой версии Delphi). Он делает все, что было оговорено в [18], но законченным компонентом я бы его все же не назвал - это скорее именно скелет, потому что у него маловато возможностей (только то, что было оговорено в [18]). Если Вы изучите это пример досконально и с книжкой Фаронова в руках, то, во-первых, поймете, как он работает, а, во-вторых, сумеете нарастить на него "мясо" самостоятельно.

Нужно сделать 2 пакета (run-time и design-time), в каждом по одному юниту. RT-пакет компилируются в любой каталог, доступный через Path. В секцию requires DT-пакета добавьте ссылку на RT-пакет.

============== Юнит RT-пакета ==============

unit MyComp;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls;

type
 TYzTextImage = class(TGraphicControl)
 private
   FPicture: TPicture;
   procedure SetPicture(const Value: TPicture);
   procedure PictureChanged(Sender: TObject);
   procedure CMFontChanged(var Message: TMessage); message CM_FONTCHANGED;
   procedure CMTextChanged(var Message: TMessage); message CM_TEXTCHANGED;
 protected
   procedure Paint; override;
 public
   constructor Create(AOwner: TComponent); override;
   destructor Destroy; override;
 published
   property Font;
   property ParentFont;
   property Picture: TPicture read FPicture write SetPicture;
   property Text;
 end;

 TYzDoubleTextImage = class(TCustomControl)
 private
   FTextImage1: TYzTextImage;
   FTextImage2: TYzTextImage;
   procedure SetTextImage1(const Value: TYzTextImage);
   procedure SetTextImage2(const Value: TYzTextImage);
   procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
   procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
 protected
   procedure Paint; override;
 public
   constructor Create(AOwner: TComponent); override;
   destructor Destroy; override;
 published
   property PopupMenu;
   property TextImage1: TYzTextImage read FTextImage1 write SetTextImage1;
   property TextImage2: TYzTextImage read FTextImage2 write SetTextImage2;
 end;

implementation

{ TYzTextImage }

procedure TYzTextImage.CMFontChanged(var Message: TMessage);
begin
 inherited;
 Invalidate
end;

procedure TYzTextImage.CMTextChanged(var Message: TMessage);
begin
 inherited;
 Invalidate
end;

constructor TYzTextImage.Create(AOwner: TComponent);
begin
 inherited;
 FPicture := TPicture.Create;
 FPicture.OnChange := PictureChanged;
end;

destructor TYzTextImage.Destroy;
begin
 FPicture.Free;
 inherited
end;

procedure TYzTextImage.Paint;
const
 Flags = DT_CENTER or DT_WORDBREAK;
var
 R: TRect;
begin
 with Canvas do
 begin
   Brush.Style := bsClear;
   if csDesigning in ComponentState then
  begin
    Pen.Style := psDash;
     Rectangle(0, 0, Width, Height)
  end;
   R := ClientRect;
   if FPicture.Graphic <> nil then
     StretchDraw(R, FPicture.Graphic)
   else
     FillRect(R);
   if Text <> "" then
   begin
     Font.Assign(Self.Font);
     DrawText(Handle, PChar(Text), Length(Text), R, Flags or DT_CALCRECT);
     OffsetRect(R, (Width - R.Right + R.Left) div 2, (Height - R.Bottom + R.Top) div 2);
     DrawText(Handle, PChar(Text), Length(Text), R, Flags)
   end
 end
end;

procedure TYzTextImage.PictureChanged(Sender: TObject);
begin
 Invalidate
end;

procedure TYzTextImage.SetPicture(const Value: TPicture);
begin
 FPicture.Assign(Value)
end;

{ TYzDoubleTextImage }

procedure TYzDoubleTextImage.CMMouseEnter(var Message: TMessage);
begin
 FTextImage1.Visible := True;
 FTextImage2.Visible := False;
 inherited
end;

procedure TYzDoubleTextImage.CMMouseLeave(var Message: TMessage);
begin
 FTextImage1.Visible := False;
 FTextImage2.Visible := True;
 inherited
end;

constructor TYzDoubleTextImage.Create(AOwner: TComponent);

 function CreateTextImage: TYzTextImage;
 begin
   Result := TYzTextImage.Create(Self);
   with Result do
   begin
     Parent := Self;
     Align := alClient;
     SetSubComponent(True)
   end
 end;

begin
 inherited;
 FTextImage1 := CreateTextImage;
 FTextImage1.Visible := False;
 FTextImage2 := CreateTextImage
end;

destructor TYzDoubleTextImage.Destroy;
begin
 FTextImage2.Free;
 FTextImage1.Free;
 inherited
end;

procedure TYzDoubleTextImage.Paint;
begin
 with Canvas do
 begin
   Brush.Style := bsClear;
   if csDesigning in ComponentState then
  begin
    Pen.Style := psDash;
     Rectangle(0, 0, Width, Height)
  end;
 end
end;

procedure TYzDoubleTextImage.SetTextImage1(const Value: TYzTextImage);
begin
 FTextImage1.Assign(Value)
end;

procedure TYzDoubleTextImage.SetTextImage2(const Value: TYzTextImage);
begin
 FTextImage2.Assign(Value)
end;

end.

============== Юнит DT-пакета ==============

unit MyCompReg;

interface

uses
 Classes, MyComp, DesignIntf, DesignEditors;

type
 TInternalSubComponentProperty = class(TComponentProperty)
   function GetAttributes: TPropertyAttributes; override;
   function GetValue: string; override;
 end;

procedure Register;

implementation

procedure Register;
begin
 RegisterComponents("Yz Examples", [TYzTextImage, TYzDoubleTextImage]);
 RegisterPropertyEditor(TYzTextImage.ClassInfo, TYzDoubleTextImage, "", TInternalSubComponentProperty)
end;

{ TInternalSubComponentProperty }

function TInternalSubComponentProperty.GetAttributes: TPropertyAttributes;
begin
 Result := inherited GetAttributes - [paMultiSelect, paValueList, paSortList, paRevertable] + [paReadOnly]
end;

function TInternalSubComponentProperty.GetValue: string;
begin
 Result := "(" + GetComponentReference.ClassName + ")"
end;

end.


 
Max_005   (2005-04-19 02:39) [21]

Юрий Зотов огромнейшее тебе СПАСИБО!!! только теперь у меня еще одна проблема появилась... Можно ли сделать вот как: при расскрывшемся меню на этом компоненте закрывать это меню и расскрывать другое меню на другом таком же компоненте при наведении на него курсора


 
Юрий Зотов ©   (2005-04-19 07:23) [22]

1. Если раскрывшееся меню тут же надо закрывать и вместо него показывать другое, то зачем его вообще открывать? Надо сразу показать другое.

2. Что за странный интерфейс? Что бы Вы сказали о конструкторе машины, если бы Вы сели в нее, тронулись с места, а она вдруг поехала бы не вперед, а вбок? Вот то же самое пользователи скажут и о таком интерфейсе.


 
Max_005   (2005-04-19 12:48) [23]

Не.. вы не так немного поняли. Если на форме два и больше будет таких коипонентов, то при наведении курсора на 2-й и т.д. чтобы уже на этих открывалось меню, если вообще меню было открыто хоть на какомнибудь таком коипоненте... Грубый пример как MainMenu, откроешь меню, и при наведении на другие пункты меню, там "Файл", "Редактировать", и т.д. оно само расскрывается...


 
Юрий Зотов ©   (2005-04-19 13:54) [24]

Этот вопрос уже в "основную", к разработке компонентов он не относится.


 
Max_005   (2005-04-19 14:21) [25]

Юрий Зотов а разве не надо в коде компонента писать это? чтобы меню раскрывалось на другом компоненте при наведении на него мышкой? Я тут попробовал сделать на сообщение "CM_MOUSEENTER", чтобы как курсор окажется на другом таком же компоненте то меню откроется... Но этого не происходит...:( такое ощущение что открывшийся popup перехватывает все сообщения... Вообще может все это можно сделать с MainMenu? Вобщем у меня окно программы нестандартного вида... поэтому у формы нет заголовка... А в этой форме нужно сделать меню. Я посмотрел множество примеров на http://www.delphiworld.narod.ru там есть хорошие примеры по переделыванию MainMenu, но проблема в том что у меня сами пункты меню не в ряд расположены... а по верхней границе формы, а там форма округлая... Вот я и подумал такой компонент сделать... Такое необычное меню... Поискал готовые компоненты такие, тоже не нашел... Нашел только одно, но из-за него сама Delphi глючить стала... и уже откомпилилированная программа с таким меню тоже глючит... Попробовал посмотреть ее исходняки, но я там ВООБЩЕ ничего не понял...:( Может вы знаете какойнибудь такой компонент? или подскажете как сделать переключающееся это меею?


 
Юрий Зотов ©   (2005-04-19 14:48) [26]

> такое ощущение что открывшийся popup перехватывает все
> сообщения...

Ну, все - не все, а сообщения ввода (мыши и клавиатуры) - точно перехватывает. А иначе как бы меню работало?

Вопрос - как программно закрыть TPopupMenu при уходе указателя мыши с компонента, на котором оно было открыто. Это - в основную или в WinAPI (скорее, в WinAPI). Предполагаю, что для этого потребуется мышиный хук.


 
Max_005   (2005-05-20 16:58) [27]

Подниму старую тему... См. Юрий Зотов (19.04.05 01:23) [20]
Все понятно кроме двух вещей:
1. Для чего свойство ParentFont в TYzTextImage.
2. И про Юнит DT-пакета. Мы тут регистрируем сой компонент, а зачем нужен еще какой-то тип?

type
TInternalSubComponentProperty = class(TComponentProperty)
  function GetAttributes: TPropertyAttributes; override;
  function GetValue: string; override;
end;

и еще мне не очень понятна эта строка:

RegisterPropertyEditor(TYzTextImage.ClassInfo, TYzDoubleTextImage, "", TInternalSubComponentProperty)

по ходу какие-то свойства регистрирует... зачем?


 
Юрий Зотов ©   (2005-05-20 17:35) [28]

> Max_005   (20.05.05 16:58) [27]

1. ParentFont - стандартное свойство контролов. Его описание есть в справке.

2. Это редактор свойства и его регистрация. В данном случае он не обязателен, я включил его лишь для того, чтобы в Инспекторе Объектов получить стандартное отображение значения свойства, являющегося ссылкой на внутренний компонент и сделать это свойство read-only.


 
Max_005   (2005-05-20 21:08) [29]

Юрий Зотов Т.е. для того чтобы свойства TextImage1 и TextImage2 нормально показывались? или какие свойства?


 
Юрий Зотов ©   (2005-05-20 21:51) [30]

Да, они.


 
Max_005   (2005-05-20 23:02) [31]

Значит когда какой-то компонент содержится в каком-то свойстве другого компонента... Надо так делать... Я правильно понял? :)


 
Юрий Зотов ©   (2005-05-20 23:54) [32]

> Max_005   (20.05.05 23:02) [31]

Не всегда. Это зависит от того, что мы хотим получить. В большинстве случаев вполне подходят стандартные редакторы свойств, которые подключаются автоматически. Но если нам по каким-причинам требуется изменить отображение свойства и/или способ его редактирования, то нужно писать и регистрировать свой редактор (как в данном случае).


 
Max_005   (2005-05-21 15:22) [33]

Понятно... А тип TInternalSubComponentProperty в других компонентах тоже так называть или нельзя одинаковые типы делать и надо называть подругому? И еще вот что... Как думаешь может лучше будет сделать вот как: тип TYzTextImage сделать в отдельном модуле, а другие компоненты которые его используют делать тоже в других модулях... т.е. один компонент один модуль... Мне кажется программа будет меньше места занимать...


 
Юрий Зотов ©   (2005-05-21 16:18) [34]

> Max_005   (21.05.05 15:22) [33]

Очень рекомендую:

http://www.findbook.ru/search/d0?ptype=1&pvalue=%C8%F1%EA%F3%F1%F1%F2%E2%EE+%F1%EE%E7%E4%E0%ED%E8%FF+%EA%EE%EC%EF%EE%ED% E5%ED%F2%EE%E2+Delphi&r=0&s=1&viewsize=15&startidx=0

или

http://www.findbook.ru/search/d0?ptype=1&pvalue=%D1%EE%E7%E4%E0%ED%E8%E5+%EA%EE%EC%EF%EE%ED%E5%ED%F2%EE%E2+%E2+%F1%F0%E5 %E4%E5+Delphi&r=0&s=1&viewsize=15&startidx=0

А то мы уже тут букварем начинаем заниматься. Форумы все же не для этого.


 
Max_005   (2005-05-21 16:31) [35]

Юрий Зотов Я купил книгу Фаронова... Все же нужна эта помощь... Я думаю это последний мой вопрос по этой теме :)


 
Юрий Зотов ©   (2005-05-21 16:51) [36]

Купили - это, конечно, хорошо - но все же недостаточно. Ее ведь еще и прочитать нужно. И даже не просто прочитать, а разобраться.

По редакторам свойств - см. раздел 11.1. Какое имя давать классу редактора и нужен ли он вообще - это в 11.1.5. Просто разберитесь с параметрами RegisterPropertyEditor - какой за что отвечает, каким он может быть и что при этом произойдет.

По поводу "Мне кажется программа будет меньше места занимать" - а почему Вам так кажется? Какие есть соображения?


 
Max_005   (2005-05-21 17:39) [37]

Вот например, в одном модуле будет много компонентов... А какаянибудь программа будет использовать только один компонент из этого модуля... Она ведь включит в программу весь модуль, и там будут ненужные компоненты... Ведь так? А можно сделать каждый компонент в своем модуле... Подключится модуль этого компонента, и все ничего лишнего...:)


 
Max_005   (2005-05-21 17:51) [38]

Или тут все по умному сделано... Когда программа компилируется из модулей берется только нужная часть, а остальная как бы откидывается...


 
Просто Джо ©   (2005-05-21 17:59) [39]


> Когда программа компилируется из модулей берется только
> нужная часть,


Да, это свойство компиляторов Паскаля.


 
Юрий Зотов ©   (2005-05-21 18:00) [40]

> Max_005   (21.05.05 17:39) [37]

Не включит. Delphi имеет интеллектуальный линковщик и код, который в программе не используется, в нее и не включается.

Ваши слова будут справедливы в случае, когда модуль содержит ссылки на файлы ресурсов или код в секциях initialization и finalization. Такие ресурсы и код (а также все, что из этого кода вызывается) включаются в программу вместе с самим модулем.



Страницы: 1 2 вся ветка

Форум: "Компоненты";
Текущий архив: 2005.12.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.6 MB
Время: 0.044 c
4-1128498242
Juice
2005-10-05 11:44
2005.12.11
Как сэмулировать нажатие клавиш Ctrl+F


2-1132514607
Nikos
2005-11-20 22:23
2005.12.11
Непонятная ошибка при завершении программы.


14-1132691975
Gero
2005-11-22 23:39
2005.12.11
Процесс, создаваемый CreateOleObject


14-1132635587
Экспериментатор
2005-11-22 07:59
2005.12.11
Чем форматировать исходники, чтобы в божий вид привести


2-1132926394
Graf
2005-11-25 16:46
2005.12.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
Английский Французский Немецкий Итальянский Португальский Русский Испанский