powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Корректное ли описание
9 сообщений из 9, страница 1 из 1
Корректное ли описание
    #39507744
Фотография 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.
type
  TfrmDataList = class(TForm)
    qMain: TMyQuery;
    dsMain: TMyDataSource;
    tlbMain: TToolBar;
    btnAdd: TToolButton;
    btnEdit: TToolButton;
    btnDelete: TToolButton;
    actlstMain: TActionList;
    actDelete: TAction;
    actOpen: TAction;
    cxGrid1DBTableView1: TcxGridDBTableView;
    cxgrdbclmnGrid1DBTableView1NAME: TcxGridDBColumn;
    cxGrid1Level1: TcxGridLevel;
    cxGrid1: TcxGrid;
    pnlBottom: TPanel;
    cxButton1: TcxButton;
    cxButton2: TcxButton;
    edtSearchText: TcxTextEdit;
    btnSearch: TToolButton;
    cxGrid1DBTableView1Column1: TcxGridDBColumn;
    procedure btnSearchClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  protected
    function GetItemData: Integer; virtual;
    procedure LoadData;
    procedure CreateFilter(AColumn: TcxGridDBColumn; ASearhText: string);
  end;

var
  frmDataList: TfrmDataList;

implementation

procedure TfrmDataList.btnSearchClick(Sender: TObject);
begin
  CreateFilter(cxgrdbclmnGrid1DBTableView1NAME, edtSearchText.Text);
end;

procedure TfrmDataList.CreateFilter(AColumn: TcxGridDBColumn; ASearhText: string);
var
  AItemList: TcxFilterCriteriaItemList;
begin
  with cxGrid1DBTableView1.DataController.Filter do
  begin
    BeginUpdate;
    try
      Root.Clear;
      if Trim(edtSearchText.Text) = '' then
        Active := False
      else
      begin
        Root.AddItem(AColumn, foLike, '%' + ASearhText + '%', '');
        Active := True;
      end;
    finally
      EndUpdate;
    end;
  end;
end;



Наследник:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
type
  TfrmQuestionList = class(TfrmDataList)
    intgrfldMainID: TIntegerField;
    strngfldMainNAME: TStringField;
    strngfldMainCODE: TStringField;
    cxgrdbclmnGrid1DBTableView1ID: TcxGridDBColumn;
   // cxgrdbclmnGrid1DBTableView1NAME: TcxGridDBColumn;
    cxgrdbclmnGrid1DBTableView1CODE: TcxGridDBColumn;
    procedure FormShow(Sender: TObject);
    procedure actOpenExecute(Sender: TObject);
    procedure actDeleteExecute(Sender: TObject);
  private
    { Private declarations }
  public
    function GetItemData: Integer; override;
    { Public declarations }
  end;

var
  frmQuestionList: TfrmQuestionList;

implementation



При запуске программы постоянно возникает сообщение:
Код: pascal
1.
Field cxgrdbclmnGrid1DBTableView1NAME does not have a corresponding component. Remove the declaration ?



А удалить cxgrdbclmnGrid1DBTableView1NAME в базовом классе я не могу...

Вот и вопрос все ли верно я делаю ?
...
Рейтинг: 0 / 0
Корректное ли описание
    #39507745
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо не комментировать cxgrdbclmnGrid1DBTableView1NAME, а удалять. Причем как из pas, так и dfm-файла. Потому и ругается, что в дфм есть такое поле, а в пас-файле -- нет (либо наоборот).
...
Рейтинг: 0 / 0
Корректное ли описание
    #39507746
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDi, спасибо, завтра попробую, а вообще корректны ли такие действия, или лучше сделать так:
Код: pascal
1.
2.
3.
4.
procedure TfrmQuestionList.btnSearchClick(Sender: TObject);
begin
procedure CreateFilter(cxgrdbclmnGrid1DBTableView1NAME,edtSearchText.Text); 
end;
...
Рейтинг: 0 / 0
Корректное ли описание
    #39507747
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wsnet,

без понятия -- надо запускать и смотреть, правильно ли работает эта фильрация.
...
Рейтинг: 0 / 0
Корректное ли описание
    #39507748
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDi, нет она работает правильно, просто как лучше сделать через базовый класс или потомка ?
При условии что потомков будет ни один?
...
Рейтинг: 0 / 0
Корректное ли описание
    #39507765
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как удобно... Вариантов использования и наследования для строки поиска и механизма фильтрации может быть уйма:
1. Если контролы поиска и колонки повторяются в формах -- всё в родителе;
2. Если контролы поиска повторяются, а колонки будут разными -- частично в родителе (как сейчас);
3. Если контролы поиска разные и колонки разные -- смысла в родителе нет.

Я бы вообще сделал универсальную процедуру для фильтрации в гриде и использовал ее без всякого наследования -- на вход передается GridView, список колонок и текст для фильтрации).
...
Рейтинг: 0 / 0
Корректное ли описание
    #39507784
Фотография wsnet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JaDiКак удобно... Вариантов использования и наследования для строки поиска и механизма фильтрации может быть уйма:
1. Если контролы поиска и колонки повторяются в формах -- всё в родителе;
2. Если контролы поиска повторяются, а колонки будут разными -- частично в родителе (как сейчас);
3. Если контролы поиска разные и колонки разные -- смысла в родителе нет.

Я бы вообще сделал универсальную процедуру для фильтрации в гриде и использовал ее без всякого наследования -- на вход передается GridView, список колонок и текст для фильтрации).

Спасибо, JaDi!
...
Рейтинг: 0 / 0
Корректное ли описание
    #39507819
Фотография 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.
unit UfrmQuestionList;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, UfrmDataList, cxGraphics, cxControls, cxLookAndFeels,
  cxLookAndFeelPainters, cxStyles, dxSkinsCore, dxSkinsDefaultPainters,
  dxSkinscxPCPainter, cxCustomData, cxFilter, cxData, cxDataStorage, cxEdit, DB,
  cxDBData, ActnList, DBAccess, MyAccess, MemDS, cxGridLevel, cxClasses,
  cxGridCustomView, cxGridCustomTableView, cxGridTableView, cxGridDBTableView,
  cxGrid, ComCtrls, ToolWin, Menus, StdCtrls, cxButtons, ExtCtrls, cxLabel,
  cxContainer, cxTextEdit;

type
  TfrmQuestionList = class(TfrmDataList)
    cxgrdbclmnGrid1DBTableView1ID: TcxGridDBColumn;
    cxgrdbclmnGrid1DBTableView1NAME: TcxGridDBColumn;
    cxgrdbclmnGrid1DBTableView1CODE: TcxGridDBColumn;
    intgrfldMainQUESTIONID: TIntegerField;
    strngfldMainQUESTIONNAME: TStringField;
    strngfldMainQUESTIONCODE: TStringField;
    procedure FormShow(Sender: TObject);
    procedure actOpenExecute(Sender: TObject);
    procedure actDeleteExecute(Sender: TObject);
    procedure btnSearchClick(Sender: TObject);
  private
    { Private declarations }
  public
    function GetItemData: Integer;
    { Public declarations }
  end;

var
  frmQuestionList: TfrmQuestionList;

implementation

uses
  UfrmDM, UfrmQuestionItem;

{$R *.dfm}

procedure TfrmQuestionList.actDeleteExecute(Sender: TObject);
begin
  inherited;
  if MessageDlg('Вы действительно хотите сохранить изменения?', mtConfirmation, mbOKCancel, 0) = mrOk then
    qMain.Delete;
end;

procedure TfrmQuestionList.actOpenExecute(Sender: TObject);
begin
  inherited;
  with TfrmQuestionItem.Create(Self) do
  try
    if TAction(Sender).ActionComponent.Tag = 0 then
      ID := 0
    else
      ID := GetItemData;      //ID := UID;
    if ShowModal = mrOk then
    begin
      LoadData;
    end;
  finally
    Free;
  end;
end;

procedure TfrmQuestionList.btnSearchClick(Sender: TObject);
begin
  CreateFilter(cxgrdbclmnGrid1DBTableView1NAME, edtSearchText.Text);
end;

procedure TfrmQuestionList.FormShow(Sender: TObject);
begin
  inherited;
  LoadData;
end;

function TfrmQuestionList.GetItemData: Integer;
begin
  Result := qMain.FieldByName('QUESTIONID').AsInteger;
end;

end.



Задача - дабы не плодить текст процедуры, перенести ее функционал в базовый класс:
В базовом классе:
Код: 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.
type
  TfrmDataItemClass = class of TfrmDataItem;

  TfrmDataList = class(TForm)
    qMain: TMyQuery;
    dsMain: TMyDataSource;
    tlbMain: TToolBar;
    btnAdd: TToolButton;
    btnEdit: TToolButton;
    btnDelete: TToolButton;
    actlstMain: TActionList;
    actDelete: TAction;
    actOpen: TAction;
    cxGrid1DBTableView1: TcxGridDBTableView;
    cxGrid1Level1: TcxGridLevel;
    cxGrid1: TcxGrid;
    pnlBottom: TPanel;
    cxButton1: TcxButton;
    cxButton2: TcxButton;
    edtSearchText: TcxTextEdit;
    btnSearch: TToolButton;
  private
    { Private declarations }
  public
    { Public declarations }
  protected
    procedure LoadData;
    procedure FormCreate(var ASourceID: Integer; ADestinationID: Integer; Sender: TObject; frmDataItemClass: TfrmDataItemClass);
    procedure CreateFilter(AColumn: TcxGridDBColumn; ASearhText: string);
  end;

...

procedure TfrmDataList.FormCreate(var ASourceID: Integer; ADestinationID: Integer; Sender: TObject; frmDataItemClass: TfrmDataItemClass);
begin
  with frmDataItemClass.Create(Self) do
  try
    if TAction(Sender).ActionComponent.Tag = 0 then
      ASourceID := 0
    else
      ASourceID := ADestinationID;
    if ShowModal = mrOk then
      ShowMessage('test');
  finally
    Free;
  end;
end;



Но весь вопрос как мне вернуть в форме детализации ASourceID?

Модератор: Как мне оформить свое сообщение?
...
Рейтинг: 0 / 0
Корректное ли описание
    #39507822
Фотография JayDi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделать конструктор формы с параметрами и передавать в него... Т.е. вместо использования:
Код: pascal
1.
TmyForm.Create(Self);



вызывать типа:
Код: pascal
1.
TmyForm.CreateDialog(Self, SourceID);



а еще лучше передавать объект с несколькими параметрами:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
TmyFormParams = class
public
  Param1: Integer;
  Param2: Integer;
end;

var
  params: TmyFormParams;

params := TmyFormParams.Create;
TmyForm.CreateDialog(Self, params);



а то и вовсе вывести в отдельный модуль функцию по вызову диалогового окна вида:
Код: pascal
1.
function OpenMyForm(Owner, Params): Boolean;



P.S. А вообще, я бы забил пока на наследования (в плане какой код куда поместить и как), сделал бы сначала полноценный проект со всем копи-пастом, а уже потом смотрел бы -- что куда можно вынести. А то складывается ощущение, что наследование пытаются применить ради наследования, и появляется излишние усложнения (как-то выставление ID в тагах контролов и экшенов).
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Корректное ли описание
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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