![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Тиражирование фрэйма [D6]
msguns © (2005-08-08 15:35:00)Можно ли один и тот же фрэйм (контейнер с положенными на него в дизайне винконтролами) в рантайме положить на форму несколько раз (например в пэйджконтроле на разных страницах (шитах) ?
Если можно, то как ?
Спасибо за помощь
Игорь Шевченко (2005-08-09 10:06:00) [1]msguns © (08.08.05 18:47) [24]
Вежливые люди, приводя кусок своего кода, сообщают, где именно и в какой момент появляется AV, чтобы потенциальные отвечающие не занимались гаданием на кофейной гуще.
msguns (2005-08-08 18:47:00) [2]>Игорь Шевченко © (08.08.05 18:35) [23]
Спасибо, конечно, за совочек и ведерко, но..
В все равно не понятно. Разница только в "папке", т.е. в Parent. Чем "папа"-шит хуже "папы"-формы, ведь и та и другая проиходят от TWinControl, которая собственно и есть контейнер ?
Игорь Шевченко (2005-08-08 18:35:00) [3]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:09:00) [4]Игорь, если не затруднительно, прокомментируй [13]
Игорь Шевченко (2005-08-08 17:39:00) [5]msguns © (08.08.05 17:36) [20]
> Надо полагать, что пока не "положишь" его в конкретный винконтрол,
> данный класс не экземплируется
Так дочернее же окно, в отличие от формы.
msguns (2005-08-08 17:36:00) [6]Умирало вот на этом:
fr.BoundsRect := frmFondMove.BoundsRect;
Объекта frmFondMove как бы нету. Самое интересное, что его действительно нету ;))
Просто, читая хэлп по фрэймам, обратил внимание на фразу like a TForm.., в код самого юнита не заглянув. Раньше не юзал фрэймы таким образом, вот и напоролся.
Надо полагать, что пока не "положишь" его в конкретный винконтрол, данный класс не экземплируется. Вот почему его нет и не может быть в списке автокреэйтов ;))
Спасибо, Игорь, что помог разобраться ;))
Игорь Шевченко (2005-08-08 17:05:00) [7]
> fr := TfraMoveDetail.Create(Self);
> fr.Parent := Prnt;
Менять на
fr := TfraMoveDetail.Create(Prnt);
fr.Parent := Prnt;
Далее по тексту.
msguns (2005-08-08 17:02:00) [8]>Игорь Шевченко © (08.08.05 16:42) [16]
>.. момент создания Frame. Увидь, кто является Owner'ом для внось создаваемого фрейма.
В коде у меня
fr := TfraMoveDetail.Create( Prnt);
Ничего это не меняет. Даже поставил var перед шитом-параметром ;((
>Slym © (08.08.05 16:49) [17]
Постыдились.. Теперь, если не внапряг, пол существу.
Только без критики мониторов и "дубости" интерфейса. В реале это выглядит, как это ни странно, достаточно приятно. Из-за чего и отказался от TDBCtrlGrid в частности ;)
(2005-08-08 16:49:00) [9]Удалено модератором
Игорь Шевченко (2005-08-08 16:42:00) [10]msguns © (08.08.05 16:36) [15]
Сережа, ты посмотри внимательно мой код. Особенно момент создания Frame. Увидь, кто является Owner'ом для внось создаваемого фрейма.
msguns (2005-08-08 16:36:00) [11]>Игорь Шевченко © (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:35:00) [12]Удалено модератором
msguns (2005-08-08 16:27:00) [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 ?
Lamer@fools.ua (2005-08-08 16:23:00) [14]>> msguns © (08.08.05 15:35)
А разве нельзя создать несколько экземпляров нужного наследника от TFrame в ран-тайме?
Игорь Шевченко (2005-08-08 16:22:00) [15]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] - все ж бы понятнее было.
Slym (2005-08-08 16:18:00) [16]Некрасиво будет если "Записей деталей может быть сколь угодно." (т.е. до пупа от макушки в мм)
msguns (2005-08-08 16:16:00) [17]Игорь, я понял так, что фрэйм остается один, но при "листании" пэджконтрола мне надо лишь менять ему "прописку" и соответственно перезаполнять контролы, да ?
Это, конечно, тоже решение. Но у меня за один раз видится двепонели (приход и расход). Как же все-таки быть ? Отказаться от фрэйма, прописать TPanel со всеми его контролами в секции Private и каждый раз создавать ее "ручками" ?
msguns (2005-08-08 16:12:00) [18]Задача следующая:
Есть объект БД, имеющий детальную таблицу, состоящую из записей двух типов: приход и расход. Каждая детальная запись имеет 8 простых полей (я их отображаю в TEdit) и 2 Memo с длинными текстами. Записей деталей может быть сколь угодно.
Для отображения прихода-расхода "в динамике" у меня используются обычные гриды детальными датасетами. Но в них не видно мемо. Кроме того, специфика работы с таким объектов требует изменения деталей "за раз".
Для этого я создал форму, на которой отображаю один объект: на верней панеле-заголовке все, что касается самого объекта, на нижней в двух пэйджконтролах "Движение": приход и расход.
Когда форма создается, мне нужно по извлеченной из БД инфы об объекте посторить столько шитов, сколько записей в деталах (с разброской по приходу-расходу). Для удобного управления информацией деталей я по совету Мастера решил воспользоваться фрэймом, где визуально красиво (мне каэээться ;)) расположил контролы. Осталасб мелочь - создать столько шитов, сколько записей деталей и на каждый из них "положить" фрэйм.
Однако, при попытке создать фрйэм у меня вылетает AV с текстом о том, что фрэйм с таким именем уже есть на форме.
В дизайне фрэймов на форме, конечно, нет.
Вот, собственно, и все.
Slym (2005-08-08 16:10:00) [19]Alexander Panov © (08.08.05 16:03) [6]
Ну и ложЪ Фрейм но на TTabControl
Alexander Panov (2005-08-08 16:03:00) [20]Slym © (08.08.05 16:01) [5]
Если человеку нужен фрейм, значит зачем-то это нужно, не так ли?