Параметры компонента при создании [Решено]

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

sign
энтузиаст
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Параметры компонента при создании [Решено]

Сообщение sign »

Сделал новый компонент
TScheme = class(TTabControl)

В конструкторе создаю компонент типа TStatusBar, вставляю его.

Код: Выделить всё

  sT := TStatusBar.Create(Self);
  InsertControl(sT);

Затем создаю компонент типа TPanel

Код: Выделить всё

  sP := TPanel.Create(Self);
  sP.Top := 30;
  sP.Height := Height - sP.Top - 30;
  InsertControl(sP);

Число 30 стоит не потому, что именно это значение нужно, а потому, что высота заголовка для имени вкладки = 0 и значение sT.Height в данный момент = 0

Как определить значения размеров на данном этапе создания компонентов, а если это невозможно, то в каком месте эти размеры устанавливаются?

Спасибо.
Последний раз редактировалось sign 12.03.2011 04:33:27, всего редактировалось 1 раз.
Maxizar
постоялец
Сообщения: 385
Зарегистрирован: 20.03.2010 18:48:14

Re: Параметры компонента при создании

Сообщение Maxizar »

Я не совсем разобрал, дайте кусок кода... не надо весь компонент, а тот кусочек, который можно было засунуть в пустую форму и проделать тоже самое в рунтайм... чтоб можно было видеть что у вас не получается...
sign
энтузиаст
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: Параметры компонента при создании

Сообщение sign »

Код: Выделить всё

  TScheme = class(TTabControl)
  public
    constructor Create(TheOwner: TComponent); override;
  end;

...
constructor TScheme.Create(TheOwner: TComponent);
var sT: TStatusBar;
    sP: TPanel;
begin
  Inherited Create(TheOwner);
  Tabs.Add('Проверка');
  sT := TStatusBar.Create(Self);
  InsertControl(sT);
  sP := TPanel.Create(Self);
  sP.Left := 10;
  sP.Top := 30;
  sP.Height := Height - sP.Top - 30;
  InsertControl(sP);
end;
Maxizar
постоялец
Сообщения: 385
Зарегистрирован: 20.03.2010 18:48:14

Re: Параметры компонента при создании

Сообщение Maxizar »

Я сделал так:

Код: Выделить всё

unit Unit1; 

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ComCtrls, ExtCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

   { TScheme }

   TScheme = class(TTabControl)
  public
    constructor Create(TheOwner: TComponent); override;
  end;

var
  Form1: TForm1;

implementation

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var TS:TScheme;
begin
    TS:=TScheme.Create(Form1);
    TS.Parent:=Form1;
    TS.Visible:=True;
    caption:=IntToStr(TS.TabHeight)
end;

{$R *.lfm}

{ TScheme }

constructor TScheme.Create(TheOwner: TComponent);
var sT: TStatusBar;
    sP: TPanel;
begin
  Inherited Create(TheOwner);
  Tabs.Add('Проверка');

  sT := TStatusBar.Create(Self);
  sT.Parent:=Self;
  //InsertControl(sT);

  sP := TPanel.Create(Self);
  sP.Parent:=Self;
  //sP.Align:=alClient;
  sP.Left := Self.DisplayRect.Left;
  sP.Top  := Self.DisplayRect.Top;
  //Self.TabHeight:=50;
  //sP.Height := Height - sP.Top - Self.TabHeight;
  //InsertControl(sP);
end;


end.


Как видно, я сделал через параметр DisplayRect, который отвечает за область страницы.. а не таба... Что касается табов и их высоты, ну хз. Может не доделали или в этом есть какой то смысл.. Так же если Вы обратили внимание, можно играться с параметрами:

Код: Выделить всё

sP.Align:=alClient;

При условии, что у sP родителем яв-ся сам компонент:

Код: Выделить всё

sP.Parent:=Self;

У меня все было корректно. Удачи. :wink:
sign
энтузиаст
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: Параметры компонента при создании

Сообщение sign »

Спасибо за ответ.
Но, вы описали немного иную ситуацию.
Мне не нужно габариты Self. С ними всё в порядке.
Мне нужны размеры тех элементов, которые я вставляю в компонент, в тот момент, когда я их вставляю, чтобы позиционировать их относительно друг друга.
И тут мне облом, поскольку габариты вставляемых компонентов оказываются на данном этапе недоступны. Width и Height устанавливаются где-то потом.

Как бы мне до этого "потом" добраться?
Maxizar
постоялец
Сообщения: 385
Зарегистрирован: 20.03.2010 18:48:14

Re: Параметры компонента при создании

Сообщение Maxizar »

Не понял??
вот скажем если сделать так:

Код: Выделить всё

constructor TScheme.Create(TheOwner: TComponent);
var sT: TStatusBar;
    sP: TPanel;
    sP1: TPanel;
begin
  Inherited Create(TheOwner);
  Tabs.Add('Проверка');


  sT := TStatusBar.Create(Self);
  sT.Parent:=Self;

  sP := TPanel.Create(Self);
  sP.Parent:=Self;
  sP1 := TPanel.Create(Self);
  sP1.Parent:=Self;

  sP.Left  := Self.DisplayRect.Left;
  sP.Top   := Self.DisplayRect.Top;
  sP.Width := 40;
  sP1.Left := Self.DisplayRect.Left+sP.Width;
  sP1.Top  := Self.DisplayRect.Top;
  sP1.Width := 40;
end;

Мы получим что и задумали:
Изображение
Мы все знаем... или вы что-то не допоняли.. либо что-то не договариваете.

Или вот так:

Код: Выделить всё

constructor TScheme.Create(TheOwner: TComponent);
var sT: TStatusBar;
    sP: TPanel;
    sP1: TPanel;
begin
  Inherited Create(TheOwner);
  Tabs.Add('Проверка');


  sT := TStatusBar.Create(Self);
  sT.Parent:=Self;

  sP := TPanel.Create(Self);
  sP.Parent:=Self;
  sP1 := TPanel.Create(Self);
  sP1.Parent:=Self;

  sP.Left  := Self.DisplayRect.Left;
  sP.Top   := Self.DisplayRect.Top;
  sP.Width := 80;
  sP.Height:= 10;
  sP1.Left := Self.DisplayRect.Left+sP.Width;
  sP1.Top  := Self.DisplayRect.Top;
  sP1.Width := 40;

end;

Получим вот это:
Изображение
Как хотим так и расположим...
sign
энтузиаст
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: Параметры компонента при создании

Сообщение sign »

У меня проблема с габаритами компонента

Код: Выделить всё

sT := TStatusBar.Create(Self);


Код: Выделить всё

constructor TScheme.Create(TheOwner: TComponent);
var sT: TStatusBar;
    sP: TPanel;
    sP1: TPanel;
begin
  Inherited Create(TheOwner);
  Tabs.Add('Проверка');


  sT := TStatusBar.Create(Self);
  sT.Parent:=Self;

  sP := TPanel.Create(Self);
  sP.Parent:=Self;
  sP1 := TPanel.Create(Self);
  sP1.Parent:=Self;

  sP.Left  := Self.DisplayRect.Left;
  sP.Top   := Self.DisplayRect.Top;
  sP.Width := 80;
  sP.Height:= 10;
  sP1.Left := Self.DisplayRect.Left+sP.Width;
  sP1.Top  := Self.DisplayRect.Bottom - sP1.Height - sT.Height;
  sP1.Width := 40;

end;
Maxizar
постоялец
Сообщения: 385
Зарегистрирован: 20.03.2010 18:48:14

Re: Параметры компонента при создании

Сообщение Maxizar »

Вот теперь я понял. :idea:
Если Вы обратитесь к сво-ву:

Код: Выделить всё

sT.Height;

Где:

Код: Выделить всё

sT : TStatusBar;

В исходниках LCL, то Вы должны были увидеть следующие:

Код: Выделить всё

property Height: Integer read FHeight write SetHeight; // no default value - controls usually have differnt sizes

Что говорит нам, что размер данного обьекта зависит от ОС и набора виджетов (прослойки) QT, GTK, Win...
И размер будет известен при прорисовке, потому что будет его рисовать система, а не LCL.
По этому мое IMHO:
перенести данные компоненты в класс, в область private:

Код: Выделить всё

   TScheme = class(TTabControl)
  private
    sT : TStatusBar;
    sP : TPanel;
    sP1: TPanel;

  public
    constructor Create(TheOwner: TComponent); override;
    procedure Paint; override;
  end;   

в конструкторе можете сделать, разметку и все такое св-в и размеров, у которых нет таких ограничений
а в Paint; дописать, для тех которые имеют такие ограничения:

Код: Выделить всё

procedure TScheme.Paint;
begin
  inherited Paint;
  sP1.Top   := Self.DisplayRect.Bottom-sP1.Height-(sT.Height);
end;

Весь код приложения:

Код: Выделить всё

unit Unit1; 

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ComCtrls, ExtCtrls;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    StatusBar1: TStatusBar;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

   { TScheme }

   TScheme = class(TTabControl)
  private
    sT : TStatusBar;
    sP : TPanel;
    sP1: TPanel;

  public
    constructor Create(TheOwner: TComponent); override;
    procedure Paint; override;
  end;

var
  Form1: TForm1;

implementation

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var TS:TScheme;
begin
    TS:=TScheme.Create(Form1);
    TS.Parent:=Form1;
    TS.Visible:=True;
     caption:=IntToStr(StatusBar1.Height)
end;

{$R *.lfm}

{ TScheme }

constructor TScheme.Create(TheOwner: TComponent);
begin
  Inherited Create(TheOwner);
  Tabs.Add('Проверка');


  sT := TStatusBar.Create(Self);
  sT.Parent:=Self;
  sT.Align:=alBottom;

  sP := TPanel.Create(Self);
  sP.Parent:=Self;
  sP1 := TPanel.Create(Self);
  sP1.Parent:=Self;

  sP.Left  := Self.DisplayRect.Left;
  sP.Top   := Self.DisplayRect.Top;
  sP.Width := 80;
  sP.Height:= 10;

  sP1.Width := 40;
  sP1.Height:= 60;
  sP1.Left  := Self.DisplayRect.Right-sP1.Width;
end;

procedure TScheme.Paint;
begin
  inherited Paint;
  sP1.Top   := Self.DisplayRect.Bottom-sP1.Height-(sT.Height);
end;
end.

Итого получим следующее:
Изображение
sign
энтузиаст
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: Параметры компонента при создании [Решено]

Сообщение sign »

Спасибо!
Последний раз редактировалось sign 11.03.2011 17:45:41, всего редактировалось 1 раз.
Maxizar
постоялец
Сообщения: 385
Зарегистрирован: 20.03.2010 18:48:14

Re: Параметры компонента при создании

Сообщение Maxizar »

sign Если ответ получен, и проблема решена, если не трудно, добавьте [Решено], в название темы, это же поможет более опытным формучанам, не заходить в тему, и не пытаться ее прочитать, решить, ответить и т.д., ведь она решена... а затратить время скажем на исправление какой-нибудь ошибки в Lazarus...

PS. Походу я буду всем так напоминать :evil:
sign
энтузиаст
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: Параметры компонента при создании [Решено]

Сообщение sign »

Как это сделать?
Maxizar
постоялец
Сообщения: 385
Зарегистрирован: 20.03.2010 18:48:14

Re: Параметры компонента при создании

Сообщение Maxizar »

sign писал(а):Как это сделать?

:oops: Да извините. Просто забыл написать.
Чтобы переименовать название темы, необходимо быть либо автором либо модератором (но последним очень сложно за всем уследить). Но так как автор - это Вы. То для переименования темы, необходимо войти в эту тему, и нажать кнопку править в первой записи (посте). Данный пост будет вашим, ведь Вы же автор Темы :). После того как вы нажали, вы должны будите увидеть окно, которое видели в момент создания темы.... там будет окошко с названием темы... вот там и нужно дописать волшебное слово [Решено], кто то пишет в начале, я предпочитаю писать вконце. После этого - название темы будет обновлено и на форуме и на сайте мы увидим, что тема была разрешена.
Вот например, я как автор темы про Wave File Generator, нажав кнопку править в самом первом посте увижу вот это:
Изображение
Где мы и видим Название(заголовок) всей темы: :D

Ну а зачем, это нужно: :!:
Вот представьте себе ситуацию, знающие люди такие как Павел Ишенин, или Сергей Горелкин.. сделали всю работу, до обеда.. или даже успели чуть больше... помогли старушке перейти дорогу, подложили начальнику лишнею ложку сахара в кофе, успели понравится девушке… поиграли с домашним котенком… и зайдя на форум или главный сайт, решили кому нибудь помочь… и вдруг они видят что 20 последних постов с добавочной надписью [Решено]… А ведь Им так хочется помочь… тогда они заходят на БагТрекер, и решают (исправляют) один из багов… А мы с Вами утречком, качаем новую сборку лазаруса… в котором, как минимум на 1 баг меньше, а все благодоря тому что эти люди не тратили свое время на прочтение темы, которую получилось решить, без их вмешательства.

PS. У меня все. :D
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Параметры компонента при создании

Сообщение Vadim »

Maxizar писал(а):подложили начальнику лишнею ложку сахара в кофе

Стрихнина. :D
Maxizar
постоялец
Сообщения: 385
Зарегистрирован: 20.03.2010 18:48:14

Re: Параметры компонента при создании

Сообщение Maxizar »

Ну можно и Стрихнина нитрат.. Это уже от любви к начальству зависит :mrgreen:
Ну я же правильно, сказал... Я не говорю, чтобы эти ребята расслабились, Их помощь неоценима, вот скажем в одной из тем Mr.Smart, просто кинул ссылку на вики, и я прозрел и получил ответ на свой вопрос или скажем Odyssei подправит мой код или укажет на то, куда я и не посмотрел бы… Или даже взять тебя Vadim и alexs где я не мог разобраться почему не собирается FPC из SVN, Вы наша последняя надежда, Если не Вы то кто?. :wink:
По этому я считаю что мы (новички) обязаны Вам помочь, хотя бы тем, чтобы сказать, что вопрос уже Решен. :D
sign
энтузиаст
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: Параметры компонента при создании

Сообщение sign »

Maxizar писал(а):и нажать кнопку править в первой записи (посте).

А!
Не догадался, что это нужно сделать в первой записи.
Ответить