Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.09.24;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.048 c
1-1155585410
Franzy
2006-08-14 23:56
2006.09.24
Проблема с Exception


1-1155198521
Всилий
2006-08-10 12:28
2006.09.24
Вовремя исполнения Form:=nil


5-1139839358
Святослав
2006-02-13 17:02
2006.09.24
Как запустить процедуру после установки Parent?


15-1157308104
wp2
2006-09-03 22:28
2006.09.24
Решил попробовать использование прокси-сервера


2-1157364800
Ragazor
2006-09-04 14:13
2006.09.24
Как создать в Dll переменную TDataModule из DataModule1.pas





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский