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

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

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

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

Сообщение sign » 11.03.2011 07:37:58

Сделал новый компонент
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 05:33:27, всего редактировалось 1 раз.
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

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

Сообщение Maxizar » 11.03.2011 11:07:06

Я не совсем разобрал, дайте кусок кода... не надо весь компонент, а тот кусочек, который можно было засунуть в пустую форму и проделать тоже самое в рунтайм... чтоб можно было видеть что у вас не получается...
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

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

Сообщение sign » 11.03.2011 12:35:57

Код: Выделить всё
  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;
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

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

Сообщение Maxizar » 11.03.2011 13:06:41

Я сделал так:
Код: Выделить всё
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:
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

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

Сообщение sign » 11.03.2011 13:56:40

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

Как бы мне до этого "потом" добраться?
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

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

Сообщение Maxizar » 11.03.2011 14:17:11

Не понял??
вот скажем если сделать так:
Код: Выделить всё
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;

Получим вот это:
Изображение
Как хотим так и расположим...
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

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

Сообщение sign » 11.03.2011 15:21:40

У меня проблема с габаритами компонента
Код: Выделить всё
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;
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

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

Сообщение Maxizar » 11.03.2011 15:37:04

Вот теперь я понял. :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.

Итого получим следующее:
Изображение
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

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

Сообщение sign » 11.03.2011 15:40:36

Спасибо!
Последний раз редактировалось sign 11.03.2011 18:45:41, всего редактировалось 1 раз.
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

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

Сообщение Maxizar » 11.03.2011 16:15:11

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

PS. Походу я буду всем так напоминать :evil:
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

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

Сообщение sign » 11.03.2011 18:47:05

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

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

Сообщение Maxizar » 11.03.2011 19:11:06

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

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

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

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

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

Сообщение Vadim » 11.03.2011 19:32:52

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

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

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

Сообщение Maxizar » 11.03.2011 19:51:58

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

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

Сообщение sign » 12.03.2011 05:35:20

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

А!
Не догадался, что это нужно сделать в первой записи.
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 61

Рейтинг@Mail.ru
cron