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

Вниз

Динамическое создание компонентов   Найти похожие ветки 

 
Sergey_b   (2006-09-01 08:44) [0]

Здравствуйте все.
Следующий вопрос:
var
 i: integer;
 Page: TTabSheet;
 Tree: TTreeView;
 But: TButton;
begin
 i:= 0;
 with IBQuery1 do
   begin
     Close;
     SQL.Clear;
     SQL.Add("select NMK_CLASSIF_TYPE_NOTE, NMK_CLASSIF_TYPE_REF from NMK_CLASSIF_TYPE");
     Open;
     First;
   end;
 repeat
   Page:= TTabSheet.Create (Form1.PageControl1);
   Page.PageControl := Form1.PageControl1;
   Page.Caption := IBQuery1.FieldByName("NMK_CLASSIF_TYPE_NOTE").AsString;
   Tree:= TTreeView.Create(Page);
   Tree.Parent := Page;
   Tree.Name:="Tree"+inttostr(i);
   Tree.Visible := true;
   i:= i + 1;
   But:= TButton.Create(form1.PageControl1.ActivePage);
   But.Parent:= form1.PageControl1.ActivePage;
   IBQuery1.Next;
 until IBQuery1.Eof;
процедура берет название страниц из БД и создает их (страницы) динамически... На странице должен быть компонент TTreeView. Странички делаются, а деревья - нет, хотя, кажется и деревья делаются, но их не видно на страницах.
Уважаемые знатоки, подскажите решение


 
Плохиш ©   (2006-09-01 10:56) [1]

Tree.Align := alClient ?


 
Ega23 ©   (2006-09-01 10:57) [2]

Либо [1], либо явно размеры задавай (Top, Left, Width, Height)


 
Sergey_b   (2006-09-01 10:58) [3]

Нет. А есть разница?


 
Sergey_b   (2006-09-01 10:59) [4]


> Ega23 ©   (01.09.06 10:57) [2]
> Либо [1], либо явно размеры задавай (Top, Left, Width, Height)

задавать размеры все равно не работает


 
Sergey_b   (2006-09-01 11:04) [5]


> Плохиш ©   (01.09.06 10:56) [1]
> Tree.Align := alClient ?

Даже не компилируется - пишет, что alClient не знает. Почему?...


 
Плохиш ©   (2006-09-01 11:05) [6]


> Sergey_b   (01.09.06 10:59) [4]

Скопировал твой код в программу, всё работает.

PS. Кстати, представляешь, что будет, если IBQuery1 не вернёт записей?


 
Плохиш ©   (2006-09-01 11:08) [7]


> Sergey_b   (01.09.06 11:04) [5]

Значит ты нам что-то не договариваешь.


 
Sergey_b   (2006-09-01 11:14) [8]


> > Sergey_b   (01.09.06 10:59) [4]
>
> Скопировал твой код в программу, всё работает.
>

PS. Кстати, представляешь, что будет, если IBQuery1 не вернёт записей?
Ну, с этим-то не сложно разобраться.
А вот, почему у меня этот код не работает - (длинный набор хорошо структурированной ненормативной лексики). Для проверки попробовал то же самое:

procedure TForm1.Button1Click(Sender: TObject);
var
 i, n: integer;
 Tree: TTreeView;
 Tab: TTabSheet;
begin
 i:=0;
 Query1.Close;
 Query1.SQL.Clear;
 Query1.SQL.Add("select * from clients");
 Query1.Open;
 Query1.First;
   for i:=0 to Query1.RecordCount - 1 do
   begin
     Tab:= TTabSheet.Create(PageControl1);
     tab.PageControl:=PageControl1;
    Tab.Caption:="tab"+inttostr(i);

    Tree:= TTreeView.Create(PageControl1);
    tree.Parent:=tab;
    Tree.Name:="Tree"+inttostr(i);
     Query1.Next;
   end;
 PageControl1.ActivePage.PageIndex:=0;

end;
- работает. Отличий нет. А вот первое - нет.
Хотя, не знаю, может это имеет какое-то значение...
Создаются компоненты на главной форме, а процедура создания находится в другом модуле. Может это?


 
Ega23 ©   (2006-09-01 11:18) [9]

Вообще-то делается
While not DataSet.Eof do
  begin
    ..................
   DataSet.Next;
  end;


 
Sergey_b   (2006-09-01 11:19) [10]


> Плохиш ©   (01.09.06 11:08) [7]
>
> > Sergey_b   (01.09.06 11:04) [5]
>
> Значит ты нам что-то не договариваешь.

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


 
Плохиш ©   (2006-09-01 11:22) [11]


> Sergey_b   (01.09.06 11:14) [8]
> Создаются компоненты на главной форме, а процедура создания
> находится в другом модуле. Может это?

Врёшь. Судя по приведённому коду, ты создаёшь страницы в PageControl1, лежащем на текушем экземпляре формы TForm1.


 
Sergey_b   (2006-09-01 11:46) [12]


> Врёшь. Судя по приведённому коду, ты создаёшь страницы в
> PageControl1, лежащем на текушем экземпляре формы TForm1.
>

PageControl1 лежит на форме - да, а процедура создания страниц - в другом модуле.


 
Ega23 ©   (2006-09-01 12:21) [13]


> PageControl1 лежит на форме - да, а процедура создания страниц
> - в другом модуле.


Это изврат. Это личный состав находится в казарме в Вологда, а оружие на складе во Владивостоке.


 
Sergey_b   (2006-09-01 13:03) [14]

Счас попробую без изврата. Но...
Почему не работает с извратом?


 
Sergey_b   (2006-09-01 13:09) [15]


> Sergey_b   (01.09.06 13:03) [14]
> Счас попробую без изврата. Но...
> Почему не работает с извратом?

Попробовал...
Не работает.


 
Плохиш ©   (2006-09-01 13:23) [16]


> Sergey_b   (01.09.06 13:03) [14]
> Счас попробую без изврата. Но...
> Почему не работает с извратом?


> Sergey_b   (01.09.06 13:09) [15]
> Попробовал...
> Не работает

У тебя ошибка в программе. А телепатор включать жалко, сломается, потом не отремонтируешь.


 
Sergey_b   (2006-09-01 13:31) [17]


> У тебя ошибка в программе. А телепатор включать жалко, сломается,
>  потом не отремонтируешь.

А что такое телепатор?
Ок. Полный код:
unit shellUnit;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls, Menus, IBDatabase, ComCtrls, DB, IBCustomDataSet, IBQuery;

const
WM_MYICONNOTIFY = WM_USER + 123;

type
 TForm1 = class(TForm)
   PopupMenu1: TPopupMenu;
   RestoreItem: TMenuItem;
   N1: TMenuItem;
   FileExitItem1: TMenuItem;
   HideItem: TMenuItem;
   IBDatabase1: TIBDatabase;
   IBQuery1: TIBQuery;
   PageControl1: TPageControl;
   IBTransaction1: TIBTransaction;
   procedure FormCreate(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
   procedure RestoreItemClick(Sender: TObject);
   procedure HideItemClick(Sender: TObject);
   procedure FileExitItem1Click(Sender: TObject);
 private
   { Private declarations }
   ShownOnce: Boolean;
 public
   { Public declarations }
   procedure WMICON(var msg: TMessage); message WM_MYICONNOTIFY;
   procedure WMSYSCOMMAND(var msg: TMessage);message WM_SYSCOMMAND;
   procedure RestoreMainForm;
   procedure HideMainForm;
   procedure CreateTrayIcon(n:Integer);
   procedure DeleteTrayIcon(n:Integer);

   procedure CreatePage;

 end;

var
 Form1: TForm1;

implementation

{$R *.DFM}
uses ComObj,  activex, ShellApi, shlobj, registry;

procedure TForm1.WMICON(var msg: TMessage);
var P : TPoint;
begin
case msg.LParam of
WM_LBUTTONDOWN:
 begin
  GetCursorPos(p);
  SetForegroundWindow(Application.MainForm.Handle);
  PopupMenu1.Popup(P.X, P.Y);
 end;
WM_LBUTTONDBLCLK : RestoreItemClick(Self);
end;
end;

procedure TForm1.WMSYSCOMMAND(var msg: TMessage);
begin
inherited;
if (Msg.wParam=SC_MINIMIZE) then HideItemClick(Self);
end;

procedure TForm1.HideMainForm;
begin
 Application.ShowMainForm := False;
 ShowWindow(Application.Handle, SW_HIDE);
 ShowWindow(Application.MainForm.Handle, SW_HIDE);
end;

procedure TForm1.RestoreMainForm;
var i,j : Integer;
begin
 Application.ShowMainForm := True;
 ShowWindow(Application.Handle, SW_RESTORE);
 ShowWindow(Application.MainForm.Handle, SW_RESTORE);
 if not ShownOnce then
 begin
   for I := 0 to Application.MainForm.ComponentCount -1 do
     if Application.MainForm.Components[I] is TWinControl then
       with Application.MainForm.Components[I] as TWinControl do
         if Visible then
         begin
           ShowWindow(Handle, SW_SHOWDEFAULT);
           for J := 0 to ComponentCount -1 do
             if Components[J] is TWinControl then
               ShowWindow((Components[J] as TWinControl).Handle, SW_SHOWDEFAULT);
         end;
   ShownOnce := True;
 end;

end;

procedure TForm1.CreateTrayIcon(n:Integer);
var nidata : TNotifyIconData;
begin
with nidata do
 begin
  cbSize := SizeOf(TNotifyIconData);
  Wnd := Self.Handle;
  uID := 1;
  uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
  uCallBackMessage := WM_MYICONNOTIFY;
  hIcon := Application.Icon.Handle;
  StrPCopy(szTip,Application.Title);
 end;
 Shell_NotifyIcon(NIM_ADD, @nidata);
end;

procedure TForm1.DeleteTrayIcon(n:Integer);
var nidata : TNotifyIconData;
begin
with nidata do
 begin
  cbSize := SizeOf(TNotifyIconData);
  Wnd := Self.Handle;
  uID := 1;
 end;
 Shell_NotifyIcon(NIM_DELETE, @nidata);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
ShownOnce:= False;
CreateTrayIcon(1);
HideItem.Enabled := False;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
DeleteTrayIcon(1);
end;

procedure TForm1.RestoreItemClick(Sender: TObject);
begin
RestoreMainForm;
DeleteTrayIcon(1);
RestoreItem.Enabled := False;
HideItem.Enabled := True;
CreatePage;
end;

procedure TForm1.HideItemClick(Sender: TObject);
begin
HideMainForm;
CreateTrayIcon(1);
HideItem.Enabled := False;
RestoreItem.Enabled := True;
end;

procedure TForm1.FileExitItem1Click(Sender: TObject);
begin
Close;
end;

procedure TForm1.CreatePage;
var
 Page: TTabSheet;
 Tree: TTreeView;
 i: integer;
begin
 i:= 0;
 with IBQuery1 do
   begin
     Close;
     SQL.Clear;
     SQL.Add("select NMK_CLASSIF_TYPE_NOTE, NMK_CLASSIF_TYPE_REF from NMK_CLASSIF_TYPE");
     Open;
     First;
   end;
 repeat

   Page:= TTabSheet.Create (Form1.PageControl1);
   Page.PageControl := Form1.PageControl1;
   Page.Caption := IBQuery1.FieldByName("NMK_CLASSIF_TYPE_NOTE").AsString;
   Tree:= TTreeView.Create( Page );
   Tree.Parent := Page;
   Tree.Name := "Tree"+inttostr(i);
   Tree.Align := alLeft;
   Tree.Visible := true;
  // ShowMessage( tree.Name );

  // Tree.Align:= alLeft;
   Tree.Visible := true;
   i:= i + 1;
   IBQuery1.Next;
  // showmessage(inttostr (Form1.PageControl1.ActivePage.ComponentCount));
 until IBQuery1.Eof;

end;

end.
Страницы создаются, деревья тоже, но их не видно. Почемууууууууууууууу


 
Ega23 ©   (2006-09-01 13:42) [18]


> Tree:= TTreeView.Create( Page );
>    Tree.Parent := Page;
>    Tree.Name := "Tree"+inttostr(i);
>    Tree.Align := alLeft;
>    Tree.Visible := true;


А Tree.Width Дядя Вася задавать будет?


 
Плохиш ©   (2006-09-01 13:46) [19]


>    Page:= TTabSheet.Create (Form1.PageControl1);


> но их не видно.

Потому, что пытаешься их увидеть на другом экземпляре TForm1.

PS. Руки повырывать за такое кодерство @|


 
Sergey_b   (2006-09-01 14:42) [20]

Плохиш ©   (01.09.06 13:46) [19]

>    Page:= TTabSheet.Create (Form1.PageControl1);

>Потому, что пытаешься их увидеть на другом экземпляре TForm1.
Написал:
Page:= TTabSheet.Create (PageControl1);
Page.PageControl := PageControl1;
Tree:= TTreeView.Create( PageControl1 );
не видно. Эх.........

> PS. Руки повырывать за такое кодерство @| - Если не сложно, может  какие-нибудь советы по коду подскажешь? Или лучше книгу. А вообще это моя вторая программа в программерской практике.


 
Плохиш ©   (2006-09-01 15:34) [21]


> не видно. Эх.........

Всё-равно телепатор включать не буду.
Кстати, то про что дядя Ega23 спрашивал, справил?

> Или лучше книгу. А вообще это моя вторая программа в программерской
> практике.

Книги, думается, для начала, любой по тематике из ближайшего книжного магазина достаточно.


 
Sergey_b   (2006-09-01 16:04) [22]

Сделал новый проект. Все скопировал из этого. Все появляется.
Правда в первом варианте прога запускалась свернутой, а во-втором нет.
Что за напсть.
>А Tree.Width Дядя Вася задавать будет? - это не обязательно.
>Книги, думается, для начала, любой по тематике из ближайшего книжного магазина достаточно.
Нет, не достаточно. Какого-нибудь Архангельского мне не надо. Я имел в виду не Паскаль, не DELPHI, а правильность программирования ( не знаю как правильно выразиться), алгоритмы. Слышал, что есть некий Калверт - подойдет? У начальника есть книга Марко Кенту DELPHI7 Для профессионалов. Хорошая, спора нет, но я ее не везде понимаю, потому что не знаю некоторых простых вещей. Ну вот, что-нибудь подобное, желательно дополняющее Кенту.
И такой вопросик. Почему проги, написанные на DELPHI, так много кушают всего, или это нормально? А C++ билдер - тоже? Вроде VCL у них одна и та же?
И все-таки что такое Телепатор? Программа дистанционного ...чего?


 
Virgo_Style ©   (2006-09-01 16:29) [23]

Sergey_b   (01.09.06 16:04) [22]
...чтения мыслей


 
Sergey_b   (2006-09-01 16:42) [24]


> Virgo_Style ©   (01.09.06 16:29) [23]
> Sergey_b   (01.09.06 16:04) [22]
> ...чтения мыслей

Это все еще форум по дельфам?


 
Сергей М. ©   (2006-09-01 16:45) [25]


> Почему проги, написанные на DELPHI, так много кушают всего


Потому что Delphi - это RAD-среда для быстрой разработки бизнес-приложений любого уровня сложности.

Разрабатывать поделки а-ля "Hello, world !", коей представляется сабж, в этой среде действительно неэффективно ни с каких точек зрения.



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

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

Наверх




Память: 0.54 MB
Время: 0.033 c
2-1157009368
Patrick
2006-08-31 11:29
2006.09.24
Access violation...


10-1123726974
kblc
2005-08-11 06:22
2006.09.24
Связь с объектом


3-1153728577
Кирей
2006-07-24 12:09
2006.09.24
Можно ли упростить?


1-1155712716
Sniper
2006-08-16 11:18
2006.09.24
Изменяющиеся свойства подкласса


1-1155113520
Ega23
2006-08-09 12:52
2006.09.24
Hint для каждого узла TTreeView - миф или реальность?