Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: 1 2      [все]
 Закрытие MDIChild-формы  [new]
client6aac
Member

Откуда:
Сообщений: 16
Пишем MDI приложение.
В нем есть базовая форма для всех MDIChild-фор, пусть TMdiBaseForm, от которой наследуются все остальные дочерние формы;

При закрытии дочерних формы не сворачиваем их, а именно закрываем:

procedure TMdiBaseForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;


Все формы создаются типовым способом:

  if Assigned(frmMdiChildren1) 
    then frmMdiChildren1.BringToFront
    else frmMdiChildren1 := TfrmMdiChildren1.CreateMDI(Application);


Все работает как надо, до момента закрытия формы.
После этого переменная frmMdiChildren1 остается ненулевая и форма повторно не создается.
Так вот вопрос: как занулить переменную формы после ее закрытия?
28 фев 19, 12:24    [21821597]     Ответить | Цитировать Сообщить модератору
 Re: Закрытие MDIChild-формы  [new]
zinpub
Member

Откуда:
Сообщений: 342
client6aac,

frmMdiChildren1:= nil;
28 фев 19, 12:40    [21821623]     Ответить | Цитировать Сообщить модератору
 Re: Закрытие MDIChild-формы  [new]
goldmi45
Member

Откуда:
Сообщений: 1115
client6aac,

function TMainForm.CheckMDIChild(Sender: TForm): Boolean;
var
  i: Integer;
begin
  Result := False;
  for i := 0 to (MDIChildCount - 1) do
    if MDIChildren[i] = Sender then
    begin
      Result := True;
      exit;
    end
    else
      Result := False;
end;


Использование
  if CheckMDIChild(frmMdiChildren1) then
    frmMdiChildren1.Show
  else
    frmMdiChildren1 := TfrmMdiChildren.Create(Self);  
28 фев 19, 12:41    [21821626]     Ответить | Цитировать Сообщить модератору
 Re: Закрытие MDIChild-формы  [new]
DimaBr
Member

Откуда:
Сообщений: 10922
client6aac
После этого переменная frmMdiChildren1 остается ненулевая и форма повторно не создается.


А где место в котором вы обнуляете переменную ? Зачем вообще существует переменная frmMdiChildren1 ?
28 фев 19, 12:47    [21821634]     Ответить | Цитировать Сообщить модератору
 Re: Закрытие MDIChild-формы  [new]
client6aac
Member

Откуда:
Сообщений: 16
DimaBr
А где место в котором вы обнуляете переменную?

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

DimaBr
Зачем вообще существует переменная frmMdiChildren1 ?

Для того, что бы понять создавалась форма ранее или нет. Если будет создано стопитцот разных окошек и искомое потеряется где-то в самом низу, то клацнув в главном меню на пунктик вызова этого окна мы или выведем его наверх (если оно было ранее создано), либо создадим.

В общем-то, нужное решение было дано в третьем посте, за что goldmi45 отдельное спасибо. Наверное тему можно закрывать
28 фев 19, 13:02    [21821654]     Ответить | Цитировать Сообщить модератору
 Re: Закрытие MDIChild-формы  [new]
zinpub
Member

Откуда:
Сообщений: 342
client6aac,

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;

  Form2 := nil;
end;


Открываем

procedure TForm1.btnClick(Sender: TObject);
begin
  if Assigned(Form2) then
    Form2.Show
  else
  begin
    Application.CreateForm(TForm2, Form2);
    Form2.Show;
  end;
end;
28 фев 19, 13:06    [21821659]     Ответить | Цитировать Сообщить модератору
 Re: Закрытие MDIChild-формы  [new]
zinpub
Member

Откуда:
Сообщений: 342
Но это - корявый метод...

Лучше закрывать\открывать "Главной формой"
28 фев 19, 13:07    [21821660]     Ответить | Цитировать Сообщить модератору
 Re: Закрытие MDIChild-формы  [new]
Arioch
Member

Откуда:
Сообщений: 10598
client6aac
Так вот вопрос: как занулить переменную формы после ее закрытия?


Удалить эту переменную вообще.
Она не нужна.

Реестр существующих окон держать в другом виде, например

 Type MyMDIClass = class of TMdiBaseForm;
Var   MyMDIForms: TDictionary<MyMDIClass, TMdiBaseForm>


Ну и не забывать оттуда удалять закрываемые формы.

P.S. именно такой реестр на самом деле редко практичен: он не позволяет открывать НЕСКОЛЬКО окон одного класса. Впрочем, как и переменная "frmMdiChildren1" не может содержать несколько указателей на несколько окон сразу.

А в реальности часто по другому. Например в браузере открыто несколько разных веб-страничек, в Excel открыто несколько разных файлов: класс один и тот же, а окон много: уникальный идентификатор окна состоит не только из класса, но и ещё каких-то данных.
28 фев 19, 13:08    [21821662]     Ответить | Цитировать Сообщить модератору
 Re: Закрытие MDIChild-формы  [new]
client6aac
Member

Откуда:
Сообщений: 16
zinpub
client6aac,

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;

  Form2 := nil;
end;

[/src]


Не годится... Action := caFree; делаем в базовой форме, которая ничего не знает про Form2

Arioch
В текущей логике приложения как раз и нужно открытие окошек в единственном экземпляре.
Но за наставление на путь истинный - спасибо!
28 фев 19, 13:18    [21821675]     Ответить | Цитировать Сообщить модератору
 Re: Закрытие MDIChild-формы  [new]
goldmi45
Member

Откуда:
Сообщений: 1115
Arioch,

Зачем создавать то, что уже есть?

MDIChildren и MDIChildCount
28 фев 19, 13:20    [21821678]     Ответить | Цитировать Сообщить модератору
 Re: Закрытие MDIChild-формы  [new]
krapotkin
Member

Откуда: Екатеринбург
Сообщений: 658
список MDI окон у нас по факту есть
но держать ссылки на формы в своем ObjectList(OwnObjects=FALSE!!!) никто не мешает
при закрытии нужно пробегать по нему и удалять из него ссылку на удаляемую форму

вопрос именно - для чего нам этот список
более практичным выглядит вариант когда это список моих объектов, которые содержат всякие данные и В ТОМ ЧИСЛЕ ссылку на форму...
28 фев 19, 13:21    [21821682]     Ответить | Цитировать Сообщить модератору
 Re: Закрытие MDIChild-формы  [new]
client6aac
Member

Откуда:
Сообщений: 16
Arioch
Вот только что созрела мысль, что в Вашем варианте с Дикшионари я тоже не очень понимаю как удалять Айтем из словаря при закрытии формы при условии, что все это должно быть реализовано в базовой форме
28 фев 19, 13:22    [21821683]     Ответить | Цитировать Сообщить модератору
 Re: Закрытие MDIChild-формы  [new]
DimaBr
Member

Откуда:
Сообщений: 10922
А две одинаковые формы (одного типа) не могут быть созданы ?
28 фев 19, 13:22    [21821684]     Ответить | Цитировать Сообщить модератору
 Re: Закрытие MDIChild-формы  [new]
client6aac
Member

Откуда:
Сообщений: 16
DimaBr
А две одинаковые формы (одного типа) не могут быть созданы ?

нет, при попытке создания второго экземпляра формы, нужно вывести наверх уже имеющийся
28 фев 19, 13:25    [21821688]     Ответить | Цитировать Сообщить модератору
 Re: Закрытие MDIChild-формы  [new]
Arioch
Member

Откуда:
Сообщений: 10598
goldmi45
client6aac,

function TMainForm.CheckMDIChild(Sender: TForm): Boolean;
var
  i: Integer;
begin
  Result := False;
  for i := 0 to (MDIChildCount - 1) do
    if MDIChildren[i] = Sender then
    begin
      Result := True;
      exit;
    end
    else
      Result := False;
end;


Или проще

function TMainForm.CheckMDIChild(Sender: TForm): Boolean;
begin
  Result := MyFormsRegistry.Contains(Sender as TMdiBaseForm);
end;


http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/Generics_Collections_TList_Contains.html

Но вообще привязывать реестр (реестры) открытых окон к TMainForm - стрёмная идея.
Потом если понадобиться распутать - то хрен распутаешь, спагетти зависимостей нарастёт.

Type TMdiBaseForm = class
...
private
    FRegistry: TList<TMdiBaseForm>; 
   // может быть один синглтон на всю программу, или несколько (разные открытые проекты-странички-файлы)
....
public
  procedure BeforeDestruction; Override;
  property MDIRegistry: TList<TMdiBaseForm> write RegisterInNewRegistry;
....

procedure TMdiBaseForm.BeforeDestruction; 
begin
   MDIRegistry := nil;
   inherited;
end;

procedure TMdiBaseForm.RegisterInNewRegistry(const NewReg: TList<TMdiBaseForm>); 
begin
   if NewReg = FRegistry then exit;
   if nil <> FRegistry then FRegistry.Remove(Self);
   if nil <> NewReg then NewReg.Add(Self);   
   FRegistry := NewReg;
end;

.....

  LMyNewForm := TMyMDIxxxxForm.Create( ...... );
  LMyNewForm.XXX := yyy;
  LMyNewForm.AAA := bbb;
  LMyNewForm.MDIRegistry := MyProjectWindows;
  LMyNewForm.Show;
28 фев 19, 13:25    [21821689]     Ответить | Цитировать Сообщить модератору
 Re: Закрытие MDIChild-формы  [new]
client6aac
Member

Откуда:
Сообщений: 16
Arioch,
я не пойму как это все делать из БАЗОВОЙ формы:)
28 фев 19, 13:27    [21821692]     Ответить | Цитировать Сообщить модератору
 Re: Закрытие MDIChild-формы  [new]
Arioch
Member

Откуда:
Сообщений: 10598
goldmi45
Arioch,

Зачем создавать то, что уже есть?

MDIChildren и MDIChildCount


1) лаконичнее. Одна строка - вызов стандартной функции TList<t>.Contains гораздо меньше, чем расписанный вами if с циклами. Следовательно, меньше шансов тупой ошибки.

2) гибче. Например, в дальнейшем нужно будет иметь несколько MDI-Parent окон. Или с MDI будет переход на что-то другое (табы, докающиеся плавающие окна, ...)
28 фев 19, 13:27    [21821693]     Ответить | Цитировать Сообщить модератору
 Re: Закрытие MDIChild-формы  [new]
zinpub
Member

Откуда:
Сообщений: 342
client6aac
zinpub
client6aac,

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;

  Form2 := nil;
end;

[/src]


Не годится... Action := caFree; делаем в базовой форме, которая ничего не знает про Form2


Ну
Sender:= nil;
28 фев 19, 13:30    [21821700]     Ответить | Цитировать Сообщить модератору
 Re: Закрытие MDIChild-формы  [new]
Arioch
Member

Откуда:
Сообщений: 10598
client6aac
я не пойму как это все делать из БАЗОВОЙ формы:)


1) пробросить в базовую формы ссылку на содержащий её реестр
2) иметь один единственный реестр в приложении - глобальную переменную
28 фев 19, 13:30    [21821701]     Ответить | Цитировать Сообщить модератору
 Re: Закрытие MDIChild-формы  [new]
Arioch
Member

Откуда:
Сообщений: 10598
client6aac
Не годится... Action := caFree; делаем в базовой форме, которая ничего не знает про Form2


так From2 тут явно один из потомков базовой формы, то же самое, что frmMdiChildren1
28 фев 19, 13:32    [21821702]     Ответить | Цитировать Сообщить модератору
 Re: Закрытие MDIChild-формы  [new]
zinpub
Member

Откуда:
Сообщений: 342
Но Arioch прав, гораздо лучше реестр окон, в который можно добавить собственные свойства\методы... итд
28 фев 19, 13:32    [21821703]     Ответить | Цитировать Сообщить модератору
 Re: Закрытие MDIChild-формы  [new]
Arioch
Member

Откуда:
Сообщений: 10598
zinpub
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;

  Form2 := nil;
end;[/src[

Ну [SRC pascal]Sender:= nil;


Зачем? переменная Sender перестаёт существовать через мгновение, когда ты выходишь из процедуры!
28 фев 19, 13:33    [21821706]     Ответить | Цитировать Сообщить модератору
 Re: Закрытие MDIChild-формы  [new]
Arioch
Member

Откуда:
Сообщений: 10598
Arioch
procedure TMdiBaseForm.RegisterInNewRegistry(const NewReg: TList<TMdiBaseForm>); 
begin
   if NewReg = FRegistry then exit;
//   if nil <> FRegistry then FRegistry.Remove(Self);
   if nil <> FRegistry then begin
     FRegistry.Remove(Self);
     FRegistry := nil;
   end;
   if nil <> NewReg then NewReg.Add(Self);   
   FRegistry := NewReg;
end;


Вот так лучше.
28 фев 19, 13:36    [21821709]     Ответить | Цитировать Сообщить модератору
 Re: Закрытие MDIChild-формы  [new]
zinpub
Member

Откуда:
Сообщений: 342
Arioch
zinpub
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;

  Form2 := nil;
end;[/src[

Ну [SRC pascal]Sender:= nil;


Зачем? переменная Sender перестаёт существовать через мгновение, когда ты выходишь из процедуры!


Тьфу... Да! затупил...
28 фев 19, 13:36    [21821710]     Ответить | Цитировать Сообщить модератору
 Re: Закрытие MDIChild-формы  [new]
Arioch
Member

Откуда:
Сообщений: 10598
krapotkin
более практичным выглядит вариант когда это список моих объектов, которые содержат всякие данные и В ТОМ ЧИСЛЕ ссылку на форму.


после чего этот список начинает расти, а либо поиск, либо удаление объектов в массиве - операции дорогие

свалить ВСЕ объекты в одну кучу - спорное решение.
28 фев 19, 13:38    [21821716]     Ответить | Цитировать Сообщить модератору
 Re: Закрытие MDIChild-формы  [new]
DimaBr
Member

Откуда:
Сообщений: 10922
Ну так создавайте изначально так, чтобы такой формы небыло
function CreateForm(FormClass: TMdiBaseFormClass): TMdiBaseForm;
var i: Integer;
begin
  for i := 0 to MDIChildCount - 1 do
    if MDIChildren[i].ClassType = FormClass then begin
      Result := MDIChildren[i] as TMdiBaseForm;
      Exit;
    end
  Result :=  FormClass.Create(Application);
end;
28 фев 19, 13:41    [21821722]     Ответить | Цитировать Сообщить модератору
 Re: Закрытие MDIChild-формы  [new]
Arioch
Member

Откуда:
Сообщений: 10598
Arioch
2) иметь один единственный реестр в приложении - глобальную переменную


А ещё лучше не глобальную, а локальную для класса

Type TMdiBaseForm = class
...
private // или strict private или protected
   class var FRegistry: TList<TMdiBaseForm>; 
   class constructor CreateReg;
   class destructor FreeReg;

...

class constructor TMdiBaseFormCreateReg;
begin
   FRegistry := TList<TMdiBaseForm>.Create;
   FRegistry.Capacity := 32; 
   inherited;
end;

class destructor TMdiBaseForm.FreeReg;
begin
   FRegistry.Free; 
   inherited;
end;
28 фев 19, 13:42    [21821723]     Ответить | Цитировать Сообщить модератору
 Re: Закрытие MDIChild-формы  [new]
goldmi45
Member

Откуда:
Сообщений: 1115
Arioch
goldmi45
Arioch,

Зачем создавать то, что уже есть?

MDIChildren и MDIChildCount


1) лаконичнее. Одна строка - вызов стандартной функции TList<t>.Contains гораздо меньше, чем расписанный вами if с циклами. Следовательно, меньше шансов тупой ошибки.

Да, Contains лаконичнее. Но ошибка может вкрасться на другом этапе (к примеру, забыв добавить переменную в список). И кода будет ни сколько не меньше: необходимо создавать список, его удалять, добавлять в него переменную. Возможно, необходимы отдельные методы, как у вас.

Arioch
2) гибче. Например, в дальнейшем нужно будет иметь несколько MDI-Parent окон. Или с MDI будет переход на что-то другое (табы, докающиеся плавающие окна, ...)

Согласен. Код имеет ограничения и вы предлагаете более гибкий подход.
28 фев 19, 13:42    [21821724]     Ответить | Цитировать Сообщить модератору
 Re: Закрытие MDIChild-формы  [new]
Arioch
Member

Откуда:
Сообщений: 10598
DimaBr
Ну так создавайте изначально так, чтобы такой формы небыло
function CreateForm(FormClass: TMdiBaseFormClass): TMdiBaseForm;
var i: Integer; 
begin
  for i := 0 to MDIChildCount - 1 do 
    if MDIChildren[i].ClassType = FormClass then begin
      Result := MDIChildren[i] as TMdiBaseForm;
      Exit;
    end
  Result :=  FormClass.Create(Application);
end;


Дважды вызывать функцию MDIChildren[i] - долго и потенциально моежт привести к опискам (например - несколько циклом, или индексы более разнообразные и сложные)

{.$Define hackyhack} // :-D

function CreateForm1(const FormClass: TMdiBaseFormClass): TMdiBaseForm;
var i: Integer; F: TForm {$IfDef hackyhack} absolute Result {$EndIf};
begin
  for i := 0 to MDIChildCount - 1 do begin
    F := MDIChildren[i];
    if F.ClassType = FormClass then 
{$IfDef hackyhack}
      Exit;
{$Else}
      Exit( F as TMdiBaseForm );
  end;
  Result :=  FormClass.Create(Application);
end;

function CreateForm2(const FormClass: TMdiBaseFormClass): TMdiBaseForm;
begin
  if not MyDictionary.TryGetValue( FormClass, Result ) then
  begin
    Result :=  FormClass.Create(Application);
    MyDictionary.Add( FormClass, Reuslt );
  end;
end;
28 фев 19, 13:50    [21821733]     Ответить | Цитировать Сообщить модератору
 Re: Закрытие MDIChild-формы  [new]
Arioch
Member

Откуда:
Сообщений: 10598
client6aac
Но за наставление на путь истинный - спасибо!


в общем, несколько вариантов тебе накидали, плюсы-минусы упомянули, планировтаь будущее программы и оценивать их - дело уже твоё.

главное, не забывай, что "90% кода в интернете - говно" - https://www.gunsmoker.ru/2010/05/90.html
28 фев 19, 14:02    [21821748]     Ответить | Цитировать Сообщить модератору
 Re: Закрытие MDIChild-формы  [new]
client6aac
Member

Откуда:
Сообщений: 16
ToAll
Я приятно удивлен, что вроде такой пустяковый вопросик вызвал такую достаточно бурную и конструктивную реакцию комьюнити.
Всем спасибо!
28 фев 19, 14:10    [21821754]     Ответить | Цитировать Сообщить модератору
 Re: Закрытие MDIChild-формы  [new]
LocksmithPC
Member

Откуда:
Сообщений: 176
А почему нельзя открыть (создать) дочернюю форму два раза?

У меня вообще все дочерние формы создаются TfrmMDIChild.Create(Self); Надо сотню открыть? На здоровье!
28 фев 19, 14:56    [21821833]     Ответить | Цитировать Сообщить модератору
 Re: Закрытие MDIChild-формы  [new]
Arioch
Member

Откуда:
Сообщений: 10598
Якобы, задача такая, что не надо.
Скрестим пальцы, чтобы он не ошибся.


Есть тезис "не изобретать велосипеды"

goldmi45
Зачем создавать то, что уже есть?

MDIChildren и MDIChildCo


И есть тезис "писать программу так, как будто через год её будет дописывать маньяк-убийца, которому расскажут, где живёт твоя семья"

zinpub
Но Arioch прав, гораздо лучше реестр окон, в который можно добавить собственные свойства\методы


При этом тезис
client6aac
В текущей логике приложения как раз и нужно открытие окошек в единственном экземпляре.


- это ставка в азартной игре "угадай, как дела обстоят не в реальности, а на самом деле".
Обычно мы угадываем, но иногда ошибаемся.
Очевидно, что заранее мы не знаем, где ошибёмся, иначе не ошиблись бы

провокация:
Хороший код такой, который легко ломается (т.е. от любого чиха перестаёт компилироваться).
Код, который компилируется даже после заметных изменений - плохой.

Пример - да хотя бы вечный срач про контроль типов (строгий / не строгий / никакого и статический / динамический), например https://www.sql.ru/forum/1309685/incompatible-types.

Собираем мой бред в кучку.

goldmi45
Зачем создавать то, что уже есть?

MDIChildren и MDIChildCo


"Бизюзловно" - прозюзюкала Зази.

Если программа пишется на один раз и через неделю её выкинут на помойку навсегода - то экономия на велосипедах сыграет.
Если "В текущей логике приложения как раз и нужно" и ни-ког-да никакой другйо логики не будет.

Но! если "другая логика" всё же случится, то "в класс-реестр можно добавить собственные свойства\методы".
А это значит, что в само объявление этих методов (списки/типы параметров, названия) можно зашить "требования к реальному миру". И при нарушении этих требований - компиляция сломается. И это - хороший код

DimaBr
function CreateForm(FormClass: TMdiBaseFormClass): TMdiBaseForm;

Тут мы предполагаем, что "TMdiBaseFormClass" - полный и уникальный идентификатор формы.
ЕСЛИ потом у нас будут несколько форм одного класса, то будет что-то вроде

type RMDIFormID = record
  FormClass: TMdiBaseFormClass;
  ProjectPath: TFileName;
  DocumentNo: cardinal;
end;

function CreateForm(const FormClass: RMDIFormID): TMdiBaseForm;


После этого всё позабытые нами вызовы "CreateFrom( MySuperMDIClass )" просто не соберутся. Даже если мы захотим их пропустить - Delphi не даст.

Но это - объявление метода.
А вот сам цикл - все равно будет собираться.

DimaBr
  for i := 0 to MDIChildCount - 1 do
    if MDIChildren[i].ClassType = FormClass then begin
      Result := MDIChildren[i] as TMdiBaseForm;
      Exit;
    end
  Result :=  FormClass.Create(Application);


Если это цикл по любой причине начал копи-паститься в разных местах - мы обязательно где-нибудь его да забудем. Потому что "то, что уже есть" - никак на наши реалии не завязано. И поэтому не овалится (к сожалению), если мы реалии поменяем.

Таким образом, использование этого "из коробки" функционала - это очень сильная ставка на YAGNI.

Ну и "охотничья байка".
Есть стандартный срач в БД - суррогатный или натуральный должен быть ключ таблиц.
Должен ли уникальный идентификатор строки в таблице иметь реальный смысл или быть полностью очищен от любых пересечений с реальностью.

Несколько лет назад мне надо было быстро сделать самописку для внутренних нужд компании.
Среди прочего там была таблицы контрагентов - юр/лиц.
В качестве Primary Key я там поставил ИНН. Сразу многие запросы стали проще, а при просмотре вторичных таблиц вместу асбтрактного случайного номера - был реальный и осмысленный ИНН. Удобно и быстро.

....перед этим я всю контору обошёл и у всех спросил, могут ли в России быть два юр-лица с одинаковым ИНН. И мне все сказали, что конечно же нет, и вообще "программе это никогда не понадобится". Ну и я "срезал угол". Тем более, что надо было быстро.

Прошло полгода. У самописки появились пользователи, у пользователей появились привычки, в БД появились данные.

И вдруг ко мне приходят и говорят, что программа остановила работу. Надо ввести контр-агента ,а не получается, ругается на повтор ИНН.

- значит, вы его уже раньше ввели в БД, берите готовый.
- нет, тот "Василёк", а нужен "Ромашка".
- значит "Василёк" переименовался в ромашку. Переименуйте в БД и используйте.
- нет, это разные юр-лица и нам нужны ОБА СРАЗУ
- если это разные юр-лица, то у них и ИНН разные, ищите опечатку.
- нет опечаток. Юр-лица разные, а ИНН общий
- ЧТО ????

...оказалось, что хотя вообще-то ИНН - "индивидуальный номер", но конкретно у филиалов банокв в разных городах ИНН был общий, а различались только КПП.

Но ИНН уже был PK, на него уже были построены многие Foreign Key, но это были завязаны запросы и куски кода. И всё это уже было полгода в реальной работе.

....а мне надо бросив все срочно вспомнить как та программа писалась, сделать ИНН неуникальным - в программе и БД, и при этом не потерять данные, ни в чём не изменить поведение программы, и чтобы никто из пользователей вообще не заметил обновления.

...но вообще конечно же, YAGNI и "В текущей логике приложения как раз и нужно"
Делайте ваши ставки, господа!
28 фев 19, 16:19    [21821939]     Ответить | Цитировать Сообщить модератору
 Re: Закрытие MDIChild-формы  [new]
Док
Member

Откуда: Казань
Сообщений: 6058
Arioch
Делайте ваши ставки, господа!

а ты не мог бы сказать то же самое, но покороче? Картинка с другого сайта.

К сообщению приложен файл. Размер - 104Kb
28 фев 19, 17:31    [21822025]     Ответить | Цитировать Сообщить модератору
 Re: Закрытие MDIChild-формы  [new]
Arioch
Member

Откуда:
Сообщений: 10598
Док,

- Долго ли умеючи?
- Умеючи-то долго!

К сообщению приложен файл. Размер - 55Kb
28 фев 19, 17:39    [21822033]     Ответить | Цитировать Сообщить модератору
 Re: Закрытие MDIChild-формы  [new]
client6aac
Member

Откуда:
Сообщений: 16
экак Вас поперло... пора уже выдыхать:D
28 фев 19, 17:44    [21822036]     Ответить | Цитировать Сообщить модератору
 Re: Закрытие MDIChild-формы  [new]
AJi
Member

Откуда: Москва
Сообщений: 72
У меня обычно используется вот такой вариант:

class function TMdiBaseFormClass.ExistForm: TMdiBaseFormClass;
var
  n: Integer;
begin
  Result := nil;
  for n := 0 to Screen.FormCount - 1 do
    if Screen.Forms[n].ClassName = Self.ClassName then begin
      Result := Screen.Forms[n] as TMdiBaseFormClass;
      Break;
    end;
end;


Туда же можно засунуть и создание формы, при желании.
1 мар 19, 10:48    [21822479]     Ответить | Цитировать Сообщить модератору
 Re: Закрытие MDIChild-формы  [new]
maratvg
Member

Откуда: 74
Сообщений: 107
client6aac,

на дороге MDI вы еще не дошли до вопроса "Как сделать, чтобы при максимизации одного окна, другие оставались в нормальном состоянии?" и иже с ними. Может вам не надо MDI, а то придется велосипедить долго и упорно. :)
1 мар 19, 15:15    [21822810]     Ответить | Цитировать Сообщить модератору
 Re: Закрытие MDIChild-формы  [new]
Old Nick
Member

Откуда: Санкт-Петербург
Сообщений: 3095
А зачем вообще переменная?

procedure TMainForm.OnClickButton1(Sender: TObject);
var frm: TMdiBaseForm;
begin
  frm := TMdiPriceSelectForm.Create(Application);
  frm.Show;
end;


После выхода из метода переменная сама обнулится.
5 мар 19, 11:13    [21825164]     Ответить | Цитировать Сообщить модератору
 Re: Закрытие MDIChild-формы  [new]
fraks
Member

Откуда: Новосибирск
Сообщений: 1418
Old Nick
А зачем вообще переменная?

procedure TMainForm.OnClickButton1(Sender: TObject);
var frm: TMdiBaseForm;
begin
  frm := TMdiPriceSelectForm.Create(Application);
  frm.Show;
end;


После выхода из метода переменная сама обнулится.


А зачем вообще переменная? Если она не нужна - так и не нужно ее делать.
procedure TMainForm.OnClickButton1(Sender: TObject);
begin
  with TMdiPriceSelectForm.Create(Application) do begin
    Show;
  end;
end;
6 мар 19, 04:36    [21825869]     Ответить | Цитировать Сообщить модератору
 Re: Закрытие MDIChild-формы  [new]
LocksmithPC
Member

Откуда:
Сообщений: 176
fraks, зачем вообще Show?

  with TOpenDialog.Create(Self) do
    try
      if Execute then
        TMdiPriceSelectForm.Create(Self, FileName);

    finally
      Free;

    end;
6 мар 19, 06:03    [21825880]     Ответить | Цитировать Сообщить модератору
 Re: Закрытие MDIChild-формы  [new]
goldmi45
Member

Откуда:
Сообщений: 1115
ТСу необходимо создавать в единственном экземпляре дочерние окна. Последние три писателя - нечитатели.
6 мар 19, 08:53    [21825909]     Ответить | Цитировать Сообщить модератору
 Re: Закрытие MDIChild-формы  [new]
LocksmithPC
Member

Откуда:
Сообщений: 176
goldmi45, ого, да ты гения!
6 мар 19, 09:35    [21825925]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: 1 2      [все]
Все форумы / Delphi Ответить