Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.038 c
1-1123565156
megabyte-ceercop
2005-08-09 09:25
2005.08.28
X11 Xlib.h


14-1123006579
Creep
2005-08-02 22:16
2005.08.28
Забыл пароль свой. Проверяю


3-1121852712
wild_arg
2005-07-20 13:45
2005.08.28
мульти-ДатаСет


14-1123231868
bizonwar
2005-08-05 12:51
2005.08.28
MSScriptControl


4-1120582829
q1w2e3
2005-07-05 21:00
2005.08.28
Фильтр ввода на API





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский