Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

With Tpanel.Create(scroolbox).... [D6, WinXP]


Страницы:   1 2 3 4 5 6

Ragazor ©   (2005-09-09 11:37:00) 

Делается следующее, n количетво раз:
With Tpanel.Create(scroolbox) do .....

на созданной панели нужно создать таким же макаром 2 едита
With TEdit.Create(???)
Как это сделать?


Игорь Шевченко   (2005-09-19 16:38:00) [1]

Leonid Troyanovsky ©   (19.09.05 16:33) [114]


> Ну, а по-поводу как лучше на rsdn.ru\delphi было даже что-
> то
> вроде конкурса. Затолкали всех сторонники IInterface.


Что касается теории и пуризма, я конечно понимаю, тем более, что rsdn особой любовью к Delphi не блещет :)

Но зачем изобретать себе дополнительные трудности, уже перестаю понимать, делать всякие интерфейсы и прочее. Убрать форму из AutoCreate может каждый, два клика мышью :)

Я всегда использую эти переменный для тех форм, которые гарантировано будут в единственном экземпляре и создаются в момент инициализации приложения. Например, для главной формы и для всегда необходимых датамодулей.


Leonid Troyanovsky   (2005-09-19 16:33:00) [2]


> Игорь Шевченко ©   (19.09.05 15:40) [112]

> Я бы не сказал, что использование переменных есть bad design
> в смысле ООП.


Вообще, с глобальными FormX легко согрешить не только
начинающему, но и даже более продвинутому ООПрограммисту,
когда он впервые сталкивается с необходимостью, например,
использовать  Win32 API, скажем некий Enum* из объектного кода.
Ведь тот же MakeObjectInstance открывают для себя после (пары) шишек.

> Кроме того, Borland зачем-то сделал ведь такую конструкцию,
>  с самой первой версии она в Delphi существует - Application.
> CreateForm. Для DataModule'й, например, очень удобно - создаешь
> один раз, используешь по мере надобности в нужных местах.

Им, наверное, влом было чего-то менять в концепции главной
формы приложения ;)
 Да, и угодить они старались дезертирам бейсика, а не c++, IMHO.

Ну, а по-поводу как лучше на rsdn.ru\delphi было даже что-то
вроде конкурса. Затолкали всех сторонники IInterface.

--
Regards, LVT.


msguns   (2005-09-19 15:42:00) [3]

>Leonid Troyanovsky ©   (19.09.05 15:37) [111]
>Это, конечно, слова правильные, но не похожи "от TComponent,
ведь  далеко не все объекты приложения являются оными".

Да уж.. Иногда перечитаешь то, что написал по-другомуи ужаснешься ;))
Я хотел сказать кратко то, что подробно изложил в [110], ан не вышло ;((


Игорь Шевченко   (2005-09-19 15:40:00) [4]

Leonid Troyanovsky ©   (19.09.05 14:24) [106]


> Для начинающих наиболее распространен вариант с потерей
> ссылок
> при неоднократном создании формы.
> Да и, вообще, наличие оной переменной толкает их к смешению
> стилей
> и bad design (в смысле ООП).


Я бы не сказал, что использование переменных есть bad design в смысле ООП.

Кроме того, Borland зачем-то сделал ведь такую конструкцию, с самой первой версии она в Delphi существует - Application.CreateForm. Для DataModule'й, например, очень удобно - создаешь один раз, используешь по мере надобности в нужных местах.

С уважением,


Leonid Troyanovsky   (2005-09-19 15:37:00) [5]


> msguns ©   (19.09.05 15:23) [110]
> >TControl is TComponent.

> Сам же и подтверждаешь мои слова:
> любой контрол есть компонент, но не любой компонент есть
> контрол


Это, конечно, слова правильные, но не похожи "от TComponent,
ведь  далеко не все объекты приложения являются оными".

А уж TControl, в отличии от многих других объектов, is TComponent.

В остальном, смысл моих слов понят почти правильно ;)

--
Regards, LVT.


msguns   (2005-09-19 15:23:00) [6]

>Leonid Troyanovsky ©   (19.09.05 14:42) [108]
>TControl is TComponent.

Сам же и подтверждаешь мои слова:
любой контрол есть компонент, но не любой компонент есть контрол

Отсюда делаем вывод, что при поиске визуального контрола (читаем сабж про динамически создаваемые группы контролов нв контейнере (форме, фрэйме, панели..) предпочтительнее перебирать контролы, чем компоненты, т.к. последних может быть существенно больше.

Самое же главное отличие в том, что Components/ComponentCount адресует только "подотчетные" (т.е. у кого овнер - адресующийся объект) объекты, а Controls/ControlCount - содержащиеся внутри (Parent) объекты, что для поиска-перебора визуальных кнтролов внутри контейнера-носителя куда важнее.
Другими словами, соданные на панели эдиты могут иметь собственника форму и через TPanel.Component к ним не обратишься. А через Controls запросто.


Leonid Troyanovsky   (2005-09-19 14:53:00) [7]


> ananax   (19.09.05 14:35) [107]

> Глобальные переменные мне самому не нравятся ))))
> Но
> Action := caFree все равно не работает((( пишет


У формы есть событие OnClose, там нужная переменная и
фигурирует.

Внимательней надо, внимательней ;)

--
Regards, LVT.


Leonid Troyanovsky   (2005-09-19 14:42:00) [8]


> msguns ©   (19.09.05 13:27) [104]

> непонятно, почему при этом он "плясал" от TComponent, ведь
> далеко не все объекты приложения являются оными. Есть еще
> TControls, который, имхо, существеннее при анализе динамически
> создаваемых визуальных объектов, кроме того, подлежит "контейнеризации",
>


TControl is TComponent.
А контейнером для него может быть лишь TWinControl.

Т.е., это сужение предметной области.  
Поэтому, оно и "существеннее".
Например,  для динамически создаваемых контролов отсутствие Owner -
нормальное явление, а отсутствие Parent - экзотика.

--
Regards, LVT.


ananax   (2005-09-19 14:35:00) [9]


> msguns ©

Действительно стоящие замечания!
Глобальные переменные мне самому не нравятся ))))
Но
Action := caFree все равно не работает((( пишет
[Error] main.pas(74): Incompatible types: 'TBasicAction' and 'TCloseAction'


> Leonid Troyanovsky ©


Мда... про базовый класс - действительно интересно... надо почитать, как это делается.


Leonid Troyanovsky   (2005-09-19 14:24:00) [10]


> Игорь Шевченко ©   (19.09.05 13:28) [105]

> > Во избежании неприятностей никогда не следует  использовать

> > автоматически генерируемые переменные типа FormX: TFormX.

> Во избежание каких именно неприятностей ?


Для начинающих наиболее распространен вариант с потерей ссылок
при неоднократном создании формы.
Да и, вообще, наличие оной переменной толкает их к смешению стилей
и bad design (в смысле ООП).

--
Regards, LVT.


Игорь Шевченко   (2005-09-19 13:28:00) [11]

Leonid Troyanovsky ©   (19.09.05 13:24) [103]


> Во избежании неприятностей никогда не следует  использовать
>
> автоматически генерируемые переменные типа FormX: TFormX.
>


Во избежание каких именно неприятностей ?


msguns   (2005-09-19 13:27:00) [12]

>ananax  

Диджитмэн абсолютно верно объяснил как можно использовать объекты не по их именам. Только вот мне лично совершенно непонятно, почему при этом он "плясал" от TComponent, ведь далеко не все объекты приложения являются оными. Есть еще TControls, который, имхо, существеннее при анализе динамически создаваемых визуальныхобъектов, кроме того, подлежит "контейнеризации", т.е. позволяет перебирать, например, все эдиты, расположенные на панели.

Что же касается формы "по шаблону", то есть два весьма удобных способа:
1. Создание базового класса с визуальной конструкцией внешнего вида и инкапсуляцией в нем большинства методов
2. Использование вместо форм фрэймов, также сконструированных в  дизайне во вполне комфортабельных условиях ;) Собственно, для того и придуманы.


Leonid Troyanovsky   (2005-09-19 13:24:00) [13]


> ananax   (19.09.05 12:13) [98]

> > 1. Глобальные переменные
>
> А можно про это поподробнее? что не так?


Глобальных переменных быть не должно.
Неизбежное зло - это переменные, которые уже объявлены Борландом,
т.е., Screen, Application, Printer и т.д. Т.е., умножать их кол-во не стоит.

Во избежании неприятностей никогда не следует  использовать
автоматически генерируемые переменные типа FormX: TFormX.

Ну, а если, вдруг, понадобился, скажем список создаваемых
форм (или массив), то его можно сделать полем формы.
Хотя, лучше не создавать список, а каждый раз выделять из Screen.Forms
те, что имеют, например, искомый клас, т.е. Screen.Forms[i] is TFormX.

Кроме того, нужно быть весьма осторожным с регулярными процедурами,
типа NewWindow, особенно если они вдруг описаны в разделе интерфейса.

--
Regards, LVT.


Leonid Troyanovsky   (2005-09-19 13:10:00) [14]


> ananax   (19.09.05 12:13) [98]

> Так вся фишка была в том, чтобы их создавать динамически.
> ..
> если знаешь, как по "шаблону" создавать формы (не чайлды)
> пиши :)


Формы и так создаются по шаблону, записанному в ресурс
экзешника. Оный шаблон можно и просмотреть ObjectBinaryToText,
а можно и изменить путем ObjectTextToBinary.
RTFM:  VCL Reference
WriteComponent, Seek, ObjectBinaryToText, DataString, ObjectTextToBinary,
ReadComponent Example

--
Regards, LVT.


Leonid Troyanovsky   (2005-09-19 13:00:00) [15]


> ananax   (19.09.05 12:13) [98]

> те делаем так...

>    with GetParentComponent as TForm do
>    begin
>      action := caFree;
>    end;
> end;


Action := caFree делается в OnClose той самой формы.
Или, если уж на то пошло - в DoClose; override.

Кроме того, GetParentComponent здесь ни к чему.
По смыслу: в цепочке Parent'ов  найти контрол класса формы,
или, на худой конец, это Owner.

--
Regards, LVT.


msguns   (2005-09-19 13:00:00) [16]

>ananax   (19.09.05 12:15) [99]
>не работает (((((

И не должно.


ananax   (2005-09-19 12:15:00) [17]


> procedure TForm1.bnClick(Sender: TObject);
> begin
> with Sender as TButton do
> begin
>    with GetParentComponent as TForm do
>    begin
>      action := caFree;
>    end;
> end;
> end;

не работает (((((


ananax   (2005-09-19 12:13:00) [18]

Ага!
Все верно!

те делаем так...

procedure TForm1.bnClick(Sender: TObject);
begin
with Sender as TButton do
begin
   with GetParentComponent as TForm do
   begin
     action := caFree;
   end;
end;
end;


> 2. Формы удобно

Так вся фишка была в том, чтобы их создавать динамически...
если знаешь, как по "шаблону" создавать формы (не чайлды) пиши :)


> 1. Глобальные переменные

А можно про это поподробнее? что не так?


Leonid Troyanovsky   (2005-09-19 11:23:00) [19]


> ananax   (19.09.05 10:08) [96]

> Ругайте! Не стесняйтесь!


1. Глобальные переменные - MD, есть Screen, есть Forms.
2. Формы удобно проектировать в дизайнере (отдельный юнит),
убирая из autocreate. Если форм много, то их, видимо,  лучше
уничтожать при закрытии (action := caFree).
3. Ссылки в комбобоксе должны обновляться при уничтожении
(a propos?) формы, RTFM: Notification.

--
Regards, LVT.


ananax   (2005-09-19 10:08:00) [20]

ДА! Точно! DigitMan, ты просто монстр!

я сделал немного по другому, но смысл, видимо, тотже.
Вроде все работает, только вот хотелось сделать код краси'вее.

unit main;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   bnNew: TButton;
   cbList: TComboBox;
   edMsg: TEdit;
   bnSend: TButton;
   procedure bnNewClick(Sender: TObject);
   procedure bnClick(Sender: TObject);
   procedure bnSendClick(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 f: array[0..100] of TForm;
 i: Integer = 0;
implementation

{$R *.dfm}

procedure TForm1.bnClick(Sender: TObject);
begin
 with Sender as TButton do
 begin
    with GetParentComponent as TForm do
    begin
      Close;
    end;
 end;
end;

procedure NewWindow;
begin
f[i] := TForm.Create(Form1);
 //Само окно
 with f[i] do
 begin
  Name := 'f'+IntToStr(i);
  Caption := Name;
  Width := 200;
  Height := 200;
  Top := 100;
  Left := 100;
  Visible := True;
 end;
 //Кнопка закрытия
 with TButton.Create(f[i]) do
 begin
  Name := 'b'+IntToStr(i);
  Caption := 'Close';
  top := 130;
  left := 10;
  Visible := True;
  Parent := f[i];
  OnClick := Form1.bnClick;
 end;
 //Мемо для текста
 with TMemo.Create(f[i]) do
 begin
  Name := 'm'+ IntToStr(i);
  Text := '';
  top :=1;
  left :=1;
  width := 190;
  height := 120;
  Visible := True;
  Parent := f[i];
 end;
i := i+1;

end;

procedure TForm1.bnNewClick(Sender: TObject);
begin
NewWindow;
cbList.Items.Add(IntToStr(i-1));
end;

procedure TForm1.bnSendClick(Sender: TObject);
begin
if cbList.ItemIndex<>-1 then
with f[cbList.ItemIndex].FindComponent('m'+IntToStr(cbList.ItemIndex)) as TMemo do
begin
 Lines.Add(edMsg.Text);
end;
end;
end.

Ругайте! Не стесняйтесь!


Страницы:   1 2 3 4 5 6

Наверх

Титульная страница Поиск, карта сайта Написать письмо