Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.28;
Скачать: CL | DM;

Вниз

Тиражирование фрэйма   Найти похожие ветки 

 
msguns ©   (2005-08-08 15:35) [0]

Можно ли один и тот же фрэйм (контейнер с положенными на него в дизайне винконтролами) в рантайме положить на форму несколько раз (например в пэйджконтроле на разных страницах (шитах) ?
Если можно, то как ?

Спасибо за помощь


 
Slym ©   (2005-08-08 15:40) [1]

Динамическое создание


 
Slym ©   (2005-08-08 15:43) [2]

Да и глупо создавать несколько раз...
Есть ведь вместо TTabSheet можно пользовать TTabControl


 
Slym ©   (2005-08-08 15:44) [3]

Только обновлять данные при переходах по табам


 
Игорь Шевченко ©   (2005-08-08 15:51) [4]

Может, так поможет ?

unit main;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 ComCtrls, Frame;

type
 TForm1 = class(TForm)
   PageControl1: TPageControl;
   TabSheet1: TTabSheet;
   TabSheet2: TTabSheet;
   TabSheet3: TTabSheet;
   TestFrame1: TTestFrame;
   procedure PageControl1Change(Sender: TObject);
 end;

var
 Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.PageControl1Change(Sender: TObject);
begin
 TestFrame1.Parent := (Sender as TPageControl).ActivePage;
end;

end.


 
Slym ©   (2005-08-08 16:01) [5]

Игорь Шевченко ©   (08.08.05 15:51) [4]
А смысл? Есть ведь TTabControl


 
Alexander Panov ©   (2005-08-08 16:03) [6]

Slym ©   (08.08.05 16:01) [5]

Если человеку нужен фрейм, значит зачем-то это нужно, не так ли?


 
Slym ©   (2005-08-08 16:10) [7]

Alexander Panov ©   (08.08.05 16:03) [6]
Ну и ложЪ Фрейм но на TTabControl


 
msguns ©   (2005-08-08 16:12) [8]

Задача следующая:

Есть объект БД, имеющий детальную таблицу, состоящую из записей двух типов: приход и расход. Каждая детальная запись имеет 8 простых полей (я их отображаю в TEdit) и 2 Memo с длинными текстами. Записей деталей может быть сколь угодно.
Для отображения прихода-расхода "в динамике" у меня используются обычные гриды детальными датасетами. Но в них не видно мемо. Кроме того, специфика работы с таким объектов требует изменения деталей "за раз".
Для этого я создал форму, на которой отображаю один объект: на верней панеле-заголовке все, что касается самого объекта, на нижней в двух пэйджконтролах "Движение": приход и расход.
Когда форма создается, мне нужно по извлеченной из БД инфы об объекте посторить столько шитов, сколько записей в деталах (с разброской по приходу-расходу). Для удобного управления информацией деталей я по совету Мастера решил воспользоваться фрэймом, где визуально красиво (мне каэээться ;)) расположил контролы. Осталасб мелочь - создать столько шитов, сколько записей деталей и на каждый из них "положить" фрэйм.

Однако, при попытке создать фрйэм у меня вылетает AV с текстом о том, что фрэйм с таким именем уже есть на форме.
В дизайне фрэймов на форме, конечно, нет.

Вот, собственно, и все.


 
msguns ©   (2005-08-08 16:16) [9]

Игорь, я понял так, что фрэйм остается один, но при "листании" пэджконтрола мне надо лишь менять ему "прописку" и соответственно перезаполнять контролы, да ?
Это, конечно, тоже решение. Но у меня за один раз видится две понели (приход и расход). Как же все-таки быть ? Отказаться от фрэйма, прописать TPanel со всеми его контролами в секции Private и каждый раз создавать ее "ручками" ?


 
Slym ©   (2005-08-08 16:18) [10]

Некрасиво будет если "Записей деталей может быть сколь угодно." (т.е. до пупа от макушки в мм)


 
Игорь Шевченко ©   (2005-08-08 16:22) [11]

msguns ©   (08.08.05 16:16) [9]

Тогда так:

unit main;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 ComCtrls, Frame;

type
 TForm1 = class(TForm)
   PageControl1: TPageControl;
   TabSheet1: TTabSheet;
   TestFrame1: TTestFrame;
   procedure FormCreate(Sender: TObject);
 end;

var
 Form1: TForm1;

implementation

{$R *.DFM}

const
 NSheets: Integer = 3;

procedure TForm1.FormCreate(Sender: TObject);
var
 I: Integer;
 TabSheet: TTabSheet;
 AFrame: TTestFrame;
begin
 for I:=1 to NSheets do begin
   TabSheet := TTabSheet.Create (Self);
   TabSheet.PageControl := PageControl1;
   TabSheet.Caption := Format("Detail %d", [I]);
   AFrame := TTestFrame.Create (TabSheet);
   AFrame.Parent := TabSheet;
   AFrame.BoundsRect := TestFrame1.BoundsRect;
 end;
end;

end.


Ты бы сразу написал пост [9] - все ж бы понятнее было.


 
Lamer@fools.ua ©   (2005-08-08 16:23) [12]

>>msguns ©   (08.08.05 15:35)

А разве нельзя создать несколько экземпляров нужного наследника от TFrame в ран-тайме?


 
msguns ©   (2005-08-08 16:27) [13]

>Slym ©   (08.08.05 16:18) [10]
>Некрасиво будет если "Записей деталей может быть сколь угодно." (т.е. до пупа от макушки в мм)

Реально до 2-3 десятков (речь идет об архивных фондах документов и движении частей,- прибытии и убытии,- этих фондов, кол-во которых далеко не бесконечно).

Еще вопрос:
Вот это код:

procedure TfrmFondMove.CreateMovePanel(Prnt: TTabSheet; MR: PRecMoveInOut);
var
//  fr: TfraMoveDetail;
 ed: TEdit;
begin
 ed := TEdit.Create(nil);
 with ed do
  begin
   Parent := Prnt; Top := ..; Left := ...
  end;
 ed := TEdit.Create(nil);
 with ed do
  begin
   Parent := Prnt; Top := ..; Left := ...
  end;
 ...
end;


приводит к AV
Смысл в том, что мне не нужен указатель на объекты, а нужны собственно объекты, доступ к которым я буду получать в других местах приложения, используя св-во Controls контейнера (шита в данном случае) и к примеру поле Tag.
Понимаю, что где-то недопонимание, но где ? Почему конструктор при создании второго экземпляра объекта TEdit перекашивает ? Неужели все дело в переменной ed ?


 
имя   (2005-08-08 16:35) [14]

Удалено модератором


 
msguns ©   (2005-08-08 16:36) [15]

>Игорь Шевченко ©   (08.08.05 16:22) [11]

В оригинале:

procedure TfrmFondMove.FormCreate(Sender: TObject);
var
 i: integer;
 tsh: TTabSheet;

begin
 // Создать 3 шита
 for i := 0 to 4 do
   begin
    tsh := TTabSheet.Create(Self);
    tsh.PageControl := pgcFondMoveIn;
    CreateMovePanel(tsh,PRecMoveInOut(DMod.MoveRec.MoveIn));
   end;
end;

procedure TfrmFondMove.CreateMovePanel(Prnt: TTabSheet; MR: PRecMoveInOut);
var
 fr: TfraMoveDetail;
begin
 fr := TfraMoveDetail.Create(Self);
 fr.Parent := Prnt;
 fr.BoundsRect := frmFondMove.BoundsRect;
 Prnt.Caption := DateToStr(MR.MVDate);
end;


AV при создании первого же fr


 
Игорь Шевченко ©   (2005-08-08 16:42) [16]

msguns ©   (08.08.05 16:36) [15]

Сережа, ты посмотри внимательно мой код. Особенно момент создания Frame. Увидь, кто является Owner"ом для внось создаваемого фрейма.


 
имя   (2005-08-08 16:49) [17]

Удалено модератором


 
msguns ©   (2005-08-08 17:02) [18]

>Игорь Шевченко ©   (08.08.05 16:42) [16]
>.. момент создания Frame. Увидь, кто является Owner"ом для внось создаваемого фрейма.

В коде у меня

fr := TfraMoveDetail.Create(Prnt);

Ничего это не меняет. Даже поставил var перед шитом-параметром ;((

>Slym ©   (08.08.05 16:49) [17]

Постыдились.. Теперь, если не внапряг, пол существу.
Только без критики мониторов и "дубости" интерфейса. В реале это выглядит, как это ни странно, достаточно приятно. Из-за чего и отказался от TDBCtrlGrid в частности ;)


 
Игорь Шевченко ©   (2005-08-08 17:05) [19]


>  fr := TfraMoveDetail.Create(Self);
>  fr.Parent := Prnt;


Менять на

fr := TfraMoveDetail.Create(Prnt);
fr.Parent := Prnt;

Далее по тексту.


 
msguns ©   (2005-08-08 17:36) [20]

Умирало вот на этом:

fr.BoundsRect := frmFondMove.BoundsRect;

Объекта frmFondMove как бы нету. Самое интересное, что его действительно нету ;))
Просто, читая хэлп по фрэймам, обратил внимание на фразу like a TForm.., в код самого юнита не заглянув. Раньше не юзал фрэймы таким образом, вот и напоролся.
Надо полагать, что пока не "положишь" его в конкретный винконтрол, данный класс не экземплируется. Вот почему его нет и не может быть в списке автокреэйтов ;))

Спасибо, Игорь, что помог разобраться ;))


 
Игорь Шевченко ©   (2005-08-08 17:39) [21]

msguns ©   (08.08.05 17:36) [20]


> Надо полагать, что пока не "положишь" его в конкретный винконтрол,
> данный класс не экземплируется


Так дочернее же окно, в отличие от формы.


 
msguns ©   (2005-08-08 18:09) [22]

Игорь, если не затруднительно, прокомментируй [13]


 
Игорь Шевченко ©   (2005-08-08 18:35) [23]

msguns ©   (08.08.05 18:09) [22]

procedure TForm1.Button1Click(Sender: TObject);
var
 ed: TEdit;
begin
 ed := TEdit.Create(nil);
 with ed do
 begin
  Parent := Self; Top := 1; Left := 1;
 end;
ed := TEdit.Create(nil);
with ed do
 begin
  Parent := Self; Top := 1; Left := 150;
 end;
end;


У меня нет AV. Ищи отличия.


 
msguns ©   (2005-08-08 18:47) [24]

>Игорь Шевченко ©   (08.08.05 18:35) [23]

Спасибо, конечно, за совочек и ведерко, но..

В все равно не понятно. Разница только в "папке", т.е. в Parent. Чем "папа"-шит хуже "папы"-формы, ведь и та и другая проиходят от TWinControl, которая собственно и есть контейнер ?


 
Игорь Шевченко ©   (2005-08-09 10:06) [25]

msguns ©   (08.08.05 18:47) [24]

Вежливые люди, приводя кусок своего кода, сообщают, где именно и в какой момент появляется AV, чтобы потенциальные отвечающие не занимались гаданием на кофейной гуще.



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

Текущий архив: 2005.08.28;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.027 c
9-1114794185
Warchief
2005-04-29 21:03
2005.08.28
lightmap


14-1123461675
BoAlSe
2005-08-08 04:41
2005.08.28
Обидно, что уходят самые достойные


14-1123131073
БарЛог
2005-08-04 08:51
2005.08.28
Акуна матата


14-1122964964
kull
2005-08-02 10:42
2005.08.28
В спорах рождается истина?


1-1123581001
Чапаев
2005-08-09 13:50
2005.08.28
D2005 апдейты. Проблема с путями (???)