powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Формирование справочника
25 сообщений из 25, страница 1 из 1
Формирование справочника
    #39503491
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Делаю формы справочника, есть базовая форма, от которой будут наследоваться другие справочники:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
type
  TfrmBase = class(TForm)
    tlbMain: TToolBar;
    btnOpen: TToolButton;
    btnDelete: TToolButton;
    btnEdit: TToolButton;
    myqryMain: TMyQuery;
    dsMain: TMyDataSource;
    cxgrdbtblvwMainGrid1DBTableView1: TcxGridDBTableView;
    cxgrdlvlMainGrid1Level1: TcxGridLevel;
    cxgrdMain1: TcxGrid;
    actlst1: TActionList;
    act1: TAction;
    btn1: TcxButton;
    cxgrdbclmnMainGrid1DBTableView1Column1: TcxGridDBColumn;
  private
    { Private declarations }
  public
    procedure GetData2(const aQueryText: string); virtual;
    procedure GetData(const AQuery: TMyQuery);
    procedure CreateFieldsView(AView: TcxGridDBTableView; ADomenList: TList);
    function CreateDBColumn(AView: TcxGridDBTableView; AFieldName, ACaption: string): TcxGridDBColumn;
    { Public declarations }
  end;

var
  frmBase: TfrmBase;
  DomenList: TList;

implementation

uses
  Unit2, Unit7;

{$R *.dfm}

{ TfrmBase }

function TfrmBase.CreateDBColumn(AView: TcxGridDBTableView; AFieldName, ACaption: string): TcxGridDBColumn;
begin
  with AView do
  begin
    Result := CreateColumn;
    with Result do
    begin
      DataBinding.FieldName := AFieldName;
      Caption := ACaption;
    end;
  end;
end;

procedure TfrmBase.CreateFieldsView(AView: TcxGridDBTableView; ADomenList: TList);
var
  i: Integer;
begin
  if (AView = nil) or (ADomenList = nil) or (ADomenList.Count = 0) then
    Exit;
  for i := 0 to ADomenList.Count - 1 do
    CreateDBColumn(AView, TDomenValue(ADomenList[i]).FieldName, TDomenValue(ADomenList[i]).ColName);
end;

procedure TfrmBase.GetData(const AQuery: TMyQuery);
begin
  AQuery.Close;
  AQuery.Open;
end;

type
  TfrmChild = class(TfrmBase)
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
    procedure GetTableView;
  public
    { Public declarations }
  end;

var
  frmChild: TfrmChild;
  DomenList: TList;

implementation

uses
  Unit7;

{$R *.dfm}

procedure TfrmChild.FormShow(Sender: TObject);
begin
  inherited;
  GetData(myqryMain);
  CreateFieldsView(cxgrdbtblvwMainGrid1DBTableView1, DomenList);
end;



Все ли корректно, или что-то лучше изменить ?
...
Рейтинг: 0 / 0
Формирование справочника
    #39503512
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
wsnet
Все ли корректно, или что-то лучше изменить ?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
  public
    procedure GetData2(const aQueryText: string); virtual;
    procedure GetData(const AQuery: TMyQuery);
    procedure CreateFieldsView(AView: TcxGridDBTableView; ADomenList: TList);
    function CreateDBColumn(AView: TcxGridDBTableView; AFieldName, ACaption: string): TcxGridDBColumn;
    { Public declarations }
  end;



GetData2 и GetData не нужны, если очень хочется, использовать overload:
Код: pascal
1.
2.
    procedure GetData(const aQueryText: string); overload ;
    procedure GetData(const AQuery: TMyQuery); overload ;


Вынести в Protected:

Код: pascal
1.
2.
    procedure CreateFieldsView
    function CreateDBColumn
...
Рейтинг: 0 / 0
Формирование справочника
    #39503530
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecatorwsnetВсе ли корректно, или что-то лучше изменить ?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
  public
    procedure GetData2(const aQueryText: string); virtual;
    procedure GetData(const AQuery: TMyQuery);
    procedure CreateFieldsView(AView: TcxGridDBTableView; ADomenList: TList);
    function CreateDBColumn(AView: TcxGridDBTableView; AFieldName, ACaption: string): TcxGridDBColumn;
    { Public declarations }
  end;



GetData2 и GetData не нужны, если очень хочется, использовать overload:
Код: pascal
1.
2.
    procedure GetData(const aQueryText: string); overload ;
    procedure GetData(const AQuery: TMyQuery); overload ;


Вынести в Protected:

Код: pascal
1.
2.
    procedure CreateFieldsView
    function CreateDBColumn



Поспешил, GetData2 нафиг удалить надо!
defecator, почему я Вас путаю с softwarer (((
...
Рейтинг: 0 / 0
Формирование справочника
    #39503541
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet
Код: sql
1.
2.
  for i := 0 to ADomenList.Count - 1 do
    CreateDBColumn(AView, TDomenValue(ADomenList[i]).FieldName, TDomenValue(ADomenList[i]).ColName);



а в девках не надо для такого вызывать нечто вроде BeginUpdate/EndUpdate?
...
Рейтинг: 0 / 0
Формирование справочника
    #39503628
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Domen заменить на Domain
...
Рейтинг: 0 / 0
Формирование справочника
    #39503702
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Меня смущает, что понадобится создать n-ое число визуально унаследованных форм, вот подумываю как бы сделать через одну форму или лучше оставить как есть ?
...
Рейтинг: 0 / 0
Формирование справочника
    #39503739
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnetМеня смущает, что понадобится создать n-ое число визуально унаследованных форм, вот подумываю как бы сделать через одну форму или лучше оставить как есть ?

Я грешным делом не понимаю, зачем надо вообще городить подобные огороды. Какие задачи должны быть решены при помощи одной или нескольких форм ?
...
Рейтинг: 0 / 0
Формирование справочника
    #39503742
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schi, ну как же буду иметь одну форму для справочника в проекте и формировать из базы через параметры без программирования не ?
...
Рейтинг: 0 / 0
Формирование справочника
    #39503767
AJi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AJi
Гость
А редактирование справочников не предполагается?
...
Рейтинг: 0 / 0
Формирование справочника
    #39503788
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AJi, предполагается, а что ?
...
Рейтинг: 0 / 0
Формирование справочника
    #39503795
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что предпочтительнее, вот так:
Код: sql
1.
2.
3.
4.
5.
procedure TfrmBase.GetData(const AQuery: TMyQuery);
begin
  AQuery.Close;
  AQuery.Open;
end;



или вот так:
Код: sql
1.
2.
3.
4.
5.
procedure TfrmBase.GetData(var AQuery: TMyQuery);
begin
  AQuery.Close;
  AQuery.Open;
end;
...
Рейтинг: 0 / 0
Формирование справочника
    #39503839
Фотография krapotkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
второй вариант - жесть )
...
Рейтинг: 0 / 0
Формирование справочника
    #39503853
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Автор хочет генерить колонки в справочнике по списку полей таблицы (CreateDBColumn...)? Нет, не взлетит... Т.к. кроме самих полей нужно будет еще и оформление -- подписи, ширина, подсветка, подсказки, сокрытие-показ. Либо делать настраиваемый дизайнер-генератор и строить из базы (как выше советовали, но это сложно), либо дать программисту после унаследования формы добавлять нужные поля самому прямо в делфи (норм вариант -- общий код можно вынести в родителя, а в потомках заниматься только внешним видом, да мелкими правками типа подсказок-отрисовок-сокрытий). Можно еще пользователю вывалить все поля, чтобы он сам всё настроил/скрыл под себя -- но это издевательство на ним.
...
Рейтинг: 0 / 0
Формирование справочника
    #39504091
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще немного спрошу, подскажите, как можно сократить код:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
unit UfrmMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, MemDS, DBAccess, MyAccess, cxGraphics, cxLookAndFeels,
  cxLookAndFeelPainters, Menus, dxSkinsCore, dxSkinsDefaultPainters, StdCtrls,
  cxButtons;

type
  TfrmMain = class(TForm)
    myqryMain1: TMyQuery;
    btn1: TcxButton;
    procedure btn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  frmMain: TfrmMain;

implementation

uses
  UfrmDM, UParamQuery;

{$R *.dfm}

procedure TfrmMain.btn1Click(Sender: TObject);
var
  tlist1: TList;
begin
  try
    tlist1 := TList.Create;
    tlist1.Add(TParamQuery.Create('pCity', 'Abha'));
    frmDM.Select('select * from city where city=:pCity', tlist1);
  finally
    tlist1.Free;
  end;
end;

end.

unit UParamQuery;

interface

type
  TParamQuery = class
    FName: string;
    FValue: string;
  private
    procedure SetName(const AName: string);
    procedure SetValue(const AValue: string);
  public
    constructor Create(AName: string; AValue: string);
    property Name: string read FName write SetName;
    property Value: string read FValue write SetValue;
  end;

implementation

{ TParamQuery }

constructor TParamQuery.Create(AName, AValue: string);
begin
  FName := AName;
  FValue := AValue;
end;

procedure TParamQuery.SetName(const AName: string);
begin
  if FName <> AName then
    FName := AName;
end;

procedure TParamQuery.SetValue(const AValue: string);
begin
  if FValue <> AValue then
    FValue := AValue;
end;

end.



Приходится писать несколько строчек для кода задания параметров:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
procedure TfrmMain.btn1Click(Sender: TObject);
var
  tlist1: TList;
begin
  try
    tlist1 := TList.Create;
    tlist1.Add(TParamQuery.Create('pCity', 'Abha'));
    frmDM.Select('select * from city where city=:pCity', tlist1);
  finally
    tlist1.Free;
  end;
end;

end.



Мне кажется это очень много.
...
Рейтинг: 0 / 0
Формирование справочника
    #39504092
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
unit UfrmDM;

interface

uses
  SysUtils, Classes, DBAccess, MyAccess, DB;

type
  TfrmDM = class(TDataModule)
    con: TMyConnection;
  private
    { Private declarations }
    procedure InitQuery(var AQuery: TMyQuery; const ASQLText: string; const AParamsList: TList);
  public
    function Select(const ASQLText: string; const AParamList: TList): TMyQuery;
    { Public declarations }
  end;

var
  frmDM: TfrmDM;

implementation

uses
  UParamQuery;

{$R *.dfm}

{ TDataModule1 }

procedure TfrmDM.InitQuery(var AQuery: TMyQuery; const ASQLText: string; const AParamsList: TList);
var
  i: Integer;
  AParam: TDAParam;
begin
  AQuery.Connection := con;
  AQuery.SQL.Text := ASQLText;
    if AParamsList.Count > 0 then
      for i := 0 to AParamsList.Count - 1 do
      begin
        AParam := AQuery.Params.FindParam(TParamQuery(AParamsList[i]).Name);
        if AParam <> nil then
          AParam.Value := TParamQuery(AParamsList[i]).Value;
      end;
  end;

function TfrmDM.Select(const ASQLText: string; const AParamList: TList): TMyQuery;
var
  AQuery: TMyQuery;
begin
  if AParamList = nil then
    Exit;
  AQuery := TMyQuery.Create(nil);
  try
    AQuery.Close;
    InitQuery(AQuery, ASQLText, AParamList);
    AQuery.Open;
    Result := AQuery;
  finally
    AQuery.Free;
  end;

end;

end.
...
Рейтинг: 0 / 0
Формирование справочника
    #39504125
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnetЕще немного спрошу, подскажите, как можно сократить код:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Вместо 

    tlist1 := TList.Create;
    tlist1.Add(TParamQuery.Create('pCity', 'Abha'));
    frmDM.Select('select * from city where city=:pCity', tlist1);

Писать

    frmDM.Select('select * from city where city=:pCity', ['pCity','...','...'], VarArrayOf(['Abha','..','...']));

Первый массив - array of string; второй array of Variant




Или сделать у TMyQuery свойство, аналогичное TDataSet.FieldValues, заполняющее параметры.
...
Рейтинг: 0 / 0
Формирование справочника
    #39504155
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schiwsnetЕще немного спрошу, подскажите, как можно сократить код:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Вместо 

    tlist1 := TList.Create;
    tlist1.Add(TParamQuery.Create('pCity', 'Abha'));
    frmDM.Select('select * from city where city=:pCity', tlist1);

Писать

    frmDM.Select('select * from city where city=:pCity', ['pCity','...','...'], VarArrayOf(['Abha','..','...']));

Первый массив - array of string; второй array of Variant




Или сделать у TMyQuery свойство, аналогичное TDataSet.FieldValues, заполняющее параметры.

Так лучше наверное так:
Код: pascal
1.
2.
const Params: array of TMyParam;
SelectValue('select * from city where city=:pCity', [DM.Param('pCity', 'Abha')]



Не понял насчет
Код: pascal
1.
Или сделать у TMyQuery свойство, аналогичное TDataSet.FieldValues



Поподробнее можно ?
...
Рейтинг: 0 / 0
Формирование справочника
    #39504185
Фотография Квейд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
function TfrmDM.Select(const ASQLText: string; const AParamList: TList): TMyQuery;
var
  AQuery: TMyQuery;
begin
  if AParamList = nil then
    Exit;
  AQuery := TMyQuery.Create(nil);
  try
    AQuery.Close;
    InitQuery(AQuery, ASQLText, AParamList);
    AQuery.Open;
    Result := AQuery;
  finally
    AQuery.Free;
  end;
end;

эммм.... только меня одного смущает результат этой функции?
...
Рейтинг: 0 / 0
Формирование справочника
    #39504203
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnetПоподробнее можно ?

RTFS: Db.pas
Код: pascal
1.
2.
3.
4.
5.
  TDataSet = class(TComponent)
...
    property FieldValues[const FieldName: string]: Variant read GetFieldValue write SetFieldValue; default;
...
  end;
...
Рейтинг: 0 / 0
Формирование справочника
    #39504255
AJi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AJi
Гость
wsnetAJi, предполагается, а что ?
Просто хотелось бы понимать как вы это предполагаете делать.
Это ни в ком случае не сарказм, а действительно интересно.

У меня есть готовый вариант того, что вы делаете, но там все построено на хранимых процедурах. Разве что грид не генерится автоматом.
...
Рейтинг: 0 / 0
Формирование справочника
    #39504266
ma1tus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При визуальном наследовании зачем что-то генерить...
wsnetМеня смущает, что понадобится создать n-ое число визуально унаследованных форм, вот подумываю как бы сделать через одну формуЧем смущает... не сегодня - завтра, не в первой - во второй понадобится своя особая логика, и разбираться потом в месиве одной формы..
...
Рейтинг: 0 / 0
Формирование справочника
    #39504447
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Квейдэммм.... только меня одного смущает результат этой функции?Ну возвращает человек убитый объект - его право :)
...
Рейтинг: 0 / 0
Формирование справочника
    #39504448
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_niggerКвейдэммм.... только меня одного смущает результат этой функции?Ну возвращает человек убитый объект - его право :)

There's no limit to how bad things can get.
...
Рейтинг: 0 / 0
Формирование справочника
    #39507569
Beltar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что мешает сделать одну форму и предусмотреть несколько точек подключения доп. функционала? Например, у меня одна форма со списком таблиц, но можно для каждой таблицы указать форму редактирования, если очень хочется, либо подцепить к контролам на ней свои эвенты. И я эту форму с кучей проектов использую.
...
Рейтинг: 0 / 0
Формирование справочника
    #39507578
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Квейд,

Мда, человек забыл одну строчку, AQuery := nil :-)
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Формирование справочника
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]