Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Формирование справочника  [new]
wsnet
Member

Откуда:
Сообщений: 800
Делаю формы справочника, есть базовая форма, от которой будут наследоваться другие справочники:
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;


Все ли корректно, или что-то лучше изменить ?
10 авг 17, 15:50    [20713936]     Ответить | Цитировать Сообщить модератору
 Re: Формирование справочника  [new]
defecator
Member

Откуда:
Сообщений: 35379
wsnet

Все ли корректно, или что-то лучше изменить ?


  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:
    procedure GetData(const aQueryText: string); overload ;
    procedure GetData(const AQuery: TMyQuery); overload ;

Вынести в Protected:

    procedure CreateFieldsView
    function CreateDBColumn
10 авг 17, 16:04    [20714016]     Ответить | Цитировать Сообщить модератору
 Re: Формирование справочника  [new]
wsnet
Member

Откуда:
Сообщений: 800
defecator
wsnet
Все ли корректно, или что-то лучше изменить ?


  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:
    procedure GetData(const aQueryText: string); overload ;
    procedure GetData(const AQuery: TMyQuery); overload ;

Вынести в Protected:

    procedure CreateFieldsView
    function CreateDBColumn


Поспешил, GetData2 нафиг удалить надо!
defecator, почему я Вас путаю с softwarer (((
10 авг 17, 16:15    [20714060]     Ответить | Цитировать Сообщить модератору
 Re: Формирование справочника  [new]
Квейд
Member

Откуда: Kyiv, Ukraine
Сообщений: 5047
wsnet
  for i := 0 to ADomenList.Count - 1 do
    CreateDBColumn(AView, TDomenValue(ADomenList[i]).FieldName, TDomenValue(ADomenList[i]).ColName);


а в девках не надо для такого вызывать нечто вроде BeginUpdate/EndUpdate?
10 авг 17, 16:21    [20714083]     Ответить | Цитировать Сообщить модератору
 Re: Формирование справочника  [new]
schi
Member

Откуда: Москва
Сообщений: 2344
Domen заменить на Domain
10 авг 17, 17:48    [20714370]     Ответить | Цитировать Сообщить модератору
 Re: Формирование справочника  [new]
wsnet
Member

Откуда:
Сообщений: 800
Меня смущает, что понадобится создать n-ое число визуально унаследованных форм, вот подумываю как бы сделать через одну форму или лучше оставить как есть ?
10 авг 17, 19:56    [20714686]     Ответить | Цитировать Сообщить модератору
 Re: Формирование справочника  [new]
schi
Member

Откуда: Москва
Сообщений: 2344
wsnet
Меня смущает, что понадобится создать n-ое число визуально унаследованных форм, вот подумываю как бы сделать через одну форму или лучше оставить как есть ?


Я грешным делом не понимаю, зачем надо вообще городить подобные огороды. Какие задачи должны быть решены при помощи одной или нескольких форм ?
10 авг 17, 21:47    [20714882]     Ответить | Цитировать Сообщить модератору
 Re: Формирование справочника  [new]
wsnet
Member

Откуда:
Сообщений: 800
schi, ну как же буду иметь одну форму для справочника в проекте и формировать из базы через параметры без программирования не ?
10 авг 17, 22:25    [20714916]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать верхнюю строку в TCxGrid ?  [new]
AJi
Member

Откуда: Москва
Сообщений: 35
А редактирование справочников не предполагается?
11 авг 17, 01:43    [20715119]     Ответить | Цитировать Сообщить модератору
 Re: Формирование справочника  [new]
wsnet
Member

Откуда:
Сообщений: 800
AJi, предполагается, а что ?
11 авг 17, 07:23    [20715191]     Ответить | Цитировать Сообщить модератору
 Re: Формирование справочника  [new]
wsnet
Member

Откуда:
Сообщений: 800
А что предпочтительнее, вот так:
procedure TfrmBase.GetData(const AQuery: TMyQuery);
begin
  AQuery.Close;
  AQuery.Open;
end;


или вот так:
procedure TfrmBase.GetData(var AQuery: TMyQuery);
begin
  AQuery.Close;
  AQuery.Open;
end;
11 авг 17, 08:11    [20715237]     Ответить | Цитировать Сообщить модератору
 Re: Формирование справочника  [new]
krapotkin
Member

Откуда: Екатеринбург
Сообщений: 540
второй вариант - жесть )
11 авг 17, 09:58    [20715588]     Ответить | Цитировать Сообщить модератору
 Re: Формирование справочника  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 3192
Автор хочет генерить колонки в справочнике по списку полей таблицы (CreateDBColumn...)? Нет, не взлетит... Т.к. кроме самих полей нужно будет еще и оформление -- подписи, ширина, подсветка, подсказки, сокрытие-показ. Либо делать настраиваемый дизайнер-генератор и строить из базы (как выше советовали, но это сложно), либо дать программисту после унаследования формы добавлять нужные поля самому прямо в делфи (норм вариант -- общий код можно вынести в родителя, а в потомках заниматься только внешним видом, да мелкими правками типа подсказок-отрисовок-сокрытий). Можно еще пользователю вывалить все поля, чтобы он сам всё настроил/скрыл под себя -- но это издевательство на ним.
11 авг 17, 10:12    [20715664]     Ответить | Цитировать Сообщить модератору
 Re: Формирование справочника  [new]
wsnet
Member

Откуда:
Сообщений: 800
Еще немного спрошу, подскажите, как можно сократить код:
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.


Приходится писать несколько строчек для кода задания параметров:
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.


Мне кажется это очень много.
11 авг 17, 14:09    [20716874]     Ответить | Цитировать Сообщить модератору
 Re: Формирование справочника  [new]
wsnet
Member

Откуда:
Сообщений: 800
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.
11 авг 17, 14:10    [20716877]     Ответить | Цитировать Сообщить модератору
 Re: Формирование справочника  [new]
schi
Member

Откуда: Москва
Сообщений: 2344
wsnet
Еще немного спрошу, подскажите, как можно сократить код:
Вместо 

    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, заполняющее параметры.
11 авг 17, 14:47    [20717027]     Ответить | Цитировать Сообщить модератору
 Re: Формирование справочника  [new]
wsnet
Member

Откуда:
Сообщений: 800
schi
wsnet
Еще немного спрошу, подскажите, как можно сократить код:
Вместо 

    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, заполняющее параметры.


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


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


Поподробнее можно ?
11 авг 17, 15:25    [20717199]     Ответить | Цитировать Сообщить модератору
 Re: Формирование справочника  [new]
Квейд
Member

Откуда: Kyiv, Ukraine
Сообщений: 5047
wsnet
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;
эммм.... только меня одного смущает результат этой функции?
11 авг 17, 16:22    [20717371]     Ответить | Цитировать Сообщить модератору
 Re: Формирование справочника  [new]
schi
Member

Откуда: Москва
Сообщений: 2344
wsnet
Поподробнее можно ?


RTFS: Db.pas
  TDataSet = class(TComponent)
...
    property FieldValues[const FieldName: string]: Variant read GetFieldValue write SetFieldValue; default;
...
  end;
11 авг 17, 17:00    [20717461]     Ответить | Цитировать Сообщить модератору
 Re: Как выбрать верхнюю строку в TCxGrid ?  [new]
AJi
Member

Откуда: Москва
Сообщений: 35
wsnet
AJi, предполагается, а что ?

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

У меня есть готовый вариант того, что вы делаете, но там все построено на хранимых процедурах. Разве что грид не генерится автоматом.
11 авг 17, 18:57    [20717670]     Ответить | Цитировать Сообщить модератору
 Re: Формирование справочника  [new]
ma1tus
Member

Откуда:
Сообщений: 458
При визуальном наследовании зачем что-то генерить...
wsnet
Меня смущает, что понадобится создать n-ое число визуально унаследованных форм, вот подумываю как бы сделать через одну форму
Чем смущает... не сегодня - завтра, не в первой - во второй понадобится своя особая логика, и разбираться потом в месиве одной формы..
11 авг 17, 19:43    [20717728]     Ответить | Цитировать Сообщить модератору
 Re: Формирование справочника  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 1610
Квейд
эммм.... только меня одного смущает результат этой функции?
Ну возвращает человек убитый объект - его право :)
12 авг 17, 20:55    [20719060]     Ответить | Цитировать Сообщить модератору
 Re: Формирование справочника  [new]
schi
Member

Откуда: Москва
Сообщений: 2344
white_nigger
Квейд
эммм.... только меня одного смущает результат этой функции?
Ну возвращает человек убитый объект - его право :)


There's no limit to how bad things can get.
12 авг 17, 21:04    [20719066]     Ответить | Цитировать Сообщить модератору
 Re: Формирование справочника  [new]
Beltar
Member

Откуда:
Сообщений: 101
А что мешает сделать одну форму и предусмотреть несколько точек подключения доп. функционала? Например, у меня одна форма со списком таблиц, но можно для каждой таблицы указать форму редактирования, если очень хочется, либо подцепить к контролам на ней свои эвенты. И я эту форму с кучей проектов использую.
18 авг 17, 14:53    [20734400]     Ответить | Цитировать Сообщить модератору
 Re: Формирование справочника  [new]
Arioch
Member

Откуда:
Сообщений: 9144
Квейд,

Мда, человек забыл одну строчку, AQuery := nil :-)
18 авг 17, 15:09    [20734462]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить