Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Формирование справочника / 25 сообщений из 25, страница 1 из 1
10.08.2017, 15:50:16
    #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
10.08.2017, 16:04:12
    #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
10.08.2017, 16:15:38
    #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
10.08.2017, 16:21:02
    #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
10.08.2017, 17:48:12
    #39503628
schi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование справочника
Domen заменить на Domain
...
Рейтинг: 0 / 0
10.08.2017, 19:56:03
    #39503702
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование справочника
Меня смущает, что понадобится создать n-ое число визуально унаследованных форм, вот подумываю как бы сделать через одну форму или лучше оставить как есть ?
...
Рейтинг: 0 / 0
10.08.2017, 21:47:52
    #39503739
schi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование справочника
wsnetМеня смущает, что понадобится создать n-ое число визуально унаследованных форм, вот подумываю как бы сделать через одну форму или лучше оставить как есть ?

Я грешным делом не понимаю, зачем надо вообще городить подобные огороды. Какие задачи должны быть решены при помощи одной или нескольких форм ?
...
Рейтинг: 0 / 0
10.08.2017, 22:25:31
    #39503742
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование справочника
schi, ну как же буду иметь одну форму для справочника в проекте и формировать из базы через параметры без программирования не ?
...
Рейтинг: 0 / 0
11.08.2017, 01:43:40
    #39503767
AJi
AJi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование справочника
А редактирование справочников не предполагается?
...
Рейтинг: 0 / 0
11.08.2017, 07:23:36
    #39503788
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование справочника
AJi, предполагается, а что ?
...
Рейтинг: 0 / 0
11.08.2017, 08:11:46
    #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
11.08.2017, 09:58:26
    #39503839
krapotkin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование справочника
второй вариант - жесть )
...
Рейтинг: 0 / 0
11.08.2017, 10:12:22
    #39503853
JayDi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование справочника
Автор хочет генерить колонки в справочнике по списку полей таблицы (CreateDBColumn...)? Нет, не взлетит... Т.к. кроме самих полей нужно будет еще и оформление -- подписи, ширина, подсветка, подсказки, сокрытие-показ. Либо делать настраиваемый дизайнер-генератор и строить из базы (как выше советовали, но это сложно), либо дать программисту после унаследования формы добавлять нужные поля самому прямо в делфи (норм вариант -- общий код можно вынести в родителя, а в потомках заниматься только внешним видом, да мелкими правками типа подсказок-отрисовок-сокрытий). Можно еще пользователю вывалить все поля, чтобы он сам всё настроил/скрыл под себя -- но это издевательство на ним.
...
Рейтинг: 0 / 0
11.08.2017, 14:09:49
    #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
11.08.2017, 14:10:40
    #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
11.08.2017, 14:47:57
    #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
11.08.2017, 15:25:30
    #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
11.08.2017, 16:22:46
    #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
11.08.2017, 17:00:54
    #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
11.08.2017, 18:57:11
    #39504255
AJi
AJi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Формирование справочника
wsnetAJi, предполагается, а что ?
Просто хотелось бы понимать как вы это предполагаете делать.
Это ни в ком случае не сарказм, а действительно интересно.

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

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

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


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