Форум: "Основная";
Текущий архив: 2005.08.28;
Скачать: [xml.tar.bz2];
ВнизТиражирование фрэйма Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.037 c