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

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

Настройка DbGrid [D7]


Leon1 ©   (2005-01-14 14:24:00) 

Вот тут рылся рылся что то ничего не нашел, вопрос наверное банален до ужаса, суть проблемы такова
имеем форму с TDBGrid, Хотим: создать диалоговое окно для настройки данного TDBGrid пользователем, вопрос, как передать этот самый TDBGrid в форму настроек, поставить в uses у формы с настройками на форму с TDBGrid не имеет смысла, ибо должна функция унивесальна быть.... писать для каждый формы с TDBGrid обработчик отдельный обработчик настроек.... бррррр....


Leon1   (2005-01-17 07:52:00) [1]

Да это я прогнал, сам создаю форму и присваиваю ей грид в момент создания, есесьно гид в момент создания nil а в момент присвоения форма уже создана.


jack128   (2005-01-14 21:31:00) [2]

Ega23 ©   (14.01.05 15:11) [7]
constructor TFmSetupColumns.CreateForm(AOwner: TComponent; aGrig : TDBGrid);
begin
Create(AOwner);
DBGrid:=aGrid;
end;

только наоборот

DBGrid:=aGrid;
Create(AOwner);
иначе при OldCreateOrder = True в OnCreate можно AV получить.


Ega23   (2005-01-14 15:21:00) [3]

Хотя мне больше нравится вариант с переопределением конструктора...


Leon1   (2005-01-14 15:20:00) [4]

О есть


Ega23   (2005-01-14 15:12:00) [5]

Procedure TFmSetupColumns.AdvShow(DbGridEh:TdbGrideh);
Var
I:Integer;
begin
DbGrid:=DbGridEh;
ShowModal;
For I:=0 to DbGrid.Columns.Count-1 do
  ListBox1.Items.Add(DbGrid.Columns.Items[i].Title.Caption);
End;
End.
И ListBox1 пуст как лист бумаги.... что то я помоему не то делаю... :-(


ShowModal ПОСЛЕ цикла вставь.


Ega23   (2005-01-14 15:11:00) [6]

Ну тут есть несколько вариантов.
1. Переопределить конструктор у TFmSetupColumns.
Пример:

 TFmSetupColumns = class(TForm)
 private

   { Private declarations }
 public
   { Public declarations }
   DBGrid:TDBGrid;
   constructor CreateForm(AOwner: TComponent; aGrig : TDBGrid);

 end;

constructor TFmSetupColumns.CreateForm(AOwner: TComponent; aGrig : TDBGrid);
begin
Create(AOwner);
DBGrid:=aGrid;
end;

Создание формы тогда будет выглядеть:

FmSetupColumns:=TFmSetupColumns.CreateForm(Application, DBGrid1Eh);



Вариант 2.

Всё что ты делаешь на procedure TFmSetupColumns.FormCreate(Sender: TObject);
убрать в отдельную процедуру с входным параметром TDBGrid


Leon1   (2005-01-14 15:08:00) [7]

Блин ну таже самая ерунда:
Вот вызвываю окно
 FmSetupColumns:=TFmSetupColumns.Create(Application);
 FmSetupColumns.AdvShow(DbGridEh1);
 FmSetupColumns.Free;

Вот окно настроек
unit TableStupBox;

interface

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

type
 TFmSetupColumns = class(TForm)
   ListBox1: TListBox;
   Label1: TLabel;
   BitBtn1: TBitBtn;
   Label2: TLabel;
   Label3: TLabel;
   Edit1: TEdit;
   ComboBox1: TComboBox;
   FontDialog1: TFontDialog;
   Button1: TButton;
   ColorDialog1: TColorDialog;
   Button2: TButton;
   CheckBox1: TCheckBox;
   procedure AdvShow(DbGridEh:TdbGrideh);
 private
   { Private declarations }
 public
   { Public declarations }
 end;
var
 FmSetupColumns: TFmSetupColumns;
 DbGrid:TDBgridEh;
implementation

{$R *.dfm}

Procedure TFmSetupColumns.AdvShow(DbGridEh:TdbGrideh);
Var
 I:Integer;
begin
 DbGrid:=DbGridEh;
 ShowModal;
 For I:=0 to DbGrid.Columns.Count-1 do
   ListBox1.Items.Add(DbGrid.Columns.Items[i].Title.Caption);
End;
End.
И ListBox1 пуст как лист бумаги.... что то я помоему не то делаю... :-(


Leon1   (2005-01-14 14:50:00) [8]

Ай... я.... вот я балдень млин... а как же его передать то правильнее...


Ega23   (2005-01-14 14:44:00) [9]

Естественно. Потому, что на момент создания TFmSetupColumns твой DBGrid ещё не определён.


Leon1   (2005-01-14 14:41:00) [10]

Да пробовал ни фига может конечно  косяк во мне вот код вызова из формы с TDbGrid
........
 FmSetupColumns:=TFmSetupColumns.Create(Self);
 FmSetupColumns.DbGrid:=DbGridEh1;
 FmSetupColumns.ShowModal;
 FmSetupColumns.Free;
........
Фот код формы настроек
unit TableSetupBox;

interface

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

type
 TFmSetupColumns = class(TForm)
   ListBox1: TListBox;
   Label1: TLabel;
   BitBtn1: TBitBtn;
   Label2: TLabel;
   Label3: TLabel;
   Edit1: TEdit;
   ComboBox1: TComboBox;
   FontDialog1: TFontDialog;
   Button1: TButton;
   ColorDialog1: TColorDialog;
   Button2: TButton;
   CheckBox1: TCheckBox;
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   DbGrid:TDBgridEh;
   { Public declarations }
 end;
var
 FmSetupColumns: TFmSetupColumns;
implementation

{$R *.dfm}
procedure TFmSetupColumns.FormCreate(Sender: TObject);
Var
 I:Integer;
begin
 For I:=0 to DbGrid.Columns.Count-1 do///Тут получаем Access violation
   ListBox1.Items.Add(DbGrid.Columns.Items[i].Title.Caption);
end;

End.


begin...end   (2005-01-14 14:40:00) [11]

А ещё, вероятно, можно использовать свойство Tag формы настроек.


begin...end   (2005-01-14 14:34:00) [12]

> Leon1   (14.01.05 14:24)

Можно в форму настроек добавить метод, в котором в качестве одного из параметров будет параметр типа TDBGrid.

Например:

procedure TOptionsForm.AdvShow(Grid: TDBGrid);
begin
 // здесь можно какому-нибудь полю в классе
 // этой формы присвоить значение переданного
 // параметра, чтобы потом с ним работать
 Show
end.

И потом показывать форму настроек с помощью этого метода.


Наверх

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