Откуда открыта форма.

Sashaua
Дата: 18.06.2019 00:25:19
Наверное глупый вопрос, терзают сомнения правильно ли я сделал.
Есть форма с гридом списка клиентов, форма может вызыватся с кучи разных мест, ее одна задача передать id_client который был выбран по двойном щелчку на гриде.
Для определения места откуда была выбрана форма я перед отображением формы смойству tag данной формы присваиваю какое то значение по токорому потом идентифицирую откуда была вызвана форма.
Возможно есть более элегантный вариант это сделать, так как при каждом новом месте открытия списка клиентов приходится добавлять условие откуда была открыта форма.
заранее спасибо.
Кроик Семён
Дата: 18.06.2019 01:04:42
UNIT ...... //тот юнит, где форма

INTERFACE

type
   TEditClientForm = class(TForm)
   private
      FClientID  : string;
   public
      ...
      procedure InitForm(const AClientID: string);
      ...
   end;
  
   //эта процедура будет создавать окно, поклазывать его и освобождать его память после закрытия 
   procedure ExecEditClientForm(const AClientID: string);
IMPLEMENTATION   
uses SysUtils;
...
...

procedure TEditClientForm.InitForm(const AClientID: string);
begin
   //сохраняем значение ID клиента 
   FClientID := AClientID;
   ....
   //всякие другие действия: открытия датасетов и т.д.
   ....
end;

// =========================================================================


procedure ExecEditClientForm(const AClientID: string);
var
   dlg : TEditClientForm;
begin
   dlg := TEditClientForm.Create(AClientID);
   try
      dlg.InitForm(AClientID);
      dlg.ShowModal();
   finally
      FreeAndNil(dlg);
   end;
end;


//в каком-нибудь другом месте программы показ диалогового окна сводится к вызову 
//процедуры и передачей ей в качестве аргумента ID клиента

ExecEditClientForm('1');

ExecEditClientForm('100');

ExecEditClientForm('35');
x1ca4064
Дата: 18.06.2019 01:29:33
Sashaua
Для определения места откуда была выбрана форма я перед отображением формы смойству tag данной формы присваиваю какое то значение по токорому потом идентифицирую откуда была вызвана форма.


Не понятно, для чего нужно знать "место откуда была выбрана форма". На что это влияет?
DimaBr
Дата: 18.06.2019 07:47:14
Форма по выбору клиента не должна знать откуда её вызвали. Её цель отдать клиента. Ну максимум встать на нужного клиента при открытии. Но для этого нужно передать клиента параметром.
Sashaua
Дата: 18.06.2019 10:21:14
x1ca4064
Sashaua
Для определения места откуда была выбрана форма я перед отображением формы смойству tag данной формы присваиваю какое то значение по токорому потом идентифицирую откуда была вызвана форма.


Не понятно, для чего нужно знать "место откуда была выбрана форма". На что это влияет?


Например:
Форма может быть открыта с карточки клиента, после выбора клиента в метод выборки карточки клиента необходимо передать id_client.
Форма может быть открыта с формы продажи, в таком случае продажа осуществляется на выбранного id_client.
итд...
После выбора клиента разные вырианты работы с id_client могут быть.
kealon(Ruslan)
Дата: 18.06.2019 10:39:29
Sashaua,

тынц
Василий 2
Дата: 18.06.2019 10:53:21
Sashaua
x1ca4064
пропущено...


Не понятно, для чего нужно знать "место откуда была выбрана форма". На что это влияет?


Например:
Форма может быть открыта с карточки клиента, после выбора клиента в метод выборки карточки клиента необходимо передать id_client.
Форма может быть открыта с формы продажи, в таком случае продажа осуществляется на выбранного id_client.
итд...
После выбора клиента разные вырианты работы с id_client могут быть.

Вот эти "разные вырианты работы с id_client" и делай после закрытия формы. Это не её задача, ей дали список клиентов - она вернула выбранного, всё.
goldmi45
Дата: 18.06.2019 10:54:16
Sashaua, понятнее не стало...
Я надеюсь, у вас такой алгоритм работы: открыта карточка клиента - поднимаем диалоговое окно с гридом (ваша форма Икс), после того, как пользователь выбрал клиента, но до того, как форма Икс уничтожена - узнать у неё, какой клиент был выбран пользователем (свойство id_client);
Всё тоже самое и в случае "формы продаж".

Форма Икс не должна знать, кто её поднимает. Её функция - предоставить выбор пользователю и предоставить результат этого выбора любой "форме", которой понадобился этот выбор.

+ Примерно так...

==== unit 1 ====
procedure Form1.ButtonClick(Sender: TObject);
var
  aDlg: TdlgFormaX;
  aId: Integer;
begin
  aDlg := TdlgFormaX.Create;
  try
    if aDlg.ShowModal = mrOk then
    begin
      aId := aDlg.id_client;
    end;
  finally
    FreeAndNil(aDlg);
  end;
end;

==== unit 2 ====
interface
type
  TdlgFormaX = class(TForm)
  private
    FId: Integer;
  public
    property id_client: integer read FId
  end;

implementation

procedure TdlgFormaX.btnOkClick(Sender: TObject);
begin
  FId := dataset.FieldByName('id').AsInteger;
  ModalResult := mrOk;
end;
DimaBr
Дата: 18.06.2019 11:01:45
function ShowFormClient(IdClient: integer): integer;
begin
  with TFormClient.Create(Application) do 
  try
    PrepareFormAndLocateIdClient(IdClient);
    if ShowModal = 1
      then Result := Dataset['IdClient']
      else Result := -1;
  finally
    Free;
  end;
end;
_Vasilisk_
Дата: 18.06.2019 14:55:16
DimaBr,

Лучше так

function ShowFormClient(var IdClient: integer): Boolean;
begin
  with TFormClient.Create(Application) do 
  try
    PrepareFormAndLocateIdClient(IdClient);
    Result := ShowModal = mrOk;
    if Result then
      IdClient := Dataset['IdClient'];
  finally
    Free;
  end;
end;
А то мало ли какой диапазон клиентов у него