Неопределенное количество форм в рантайме.

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: Неопределенное количество форм в рантайме.

Сообщение leo_bsv » 12.02.2012 21:43:50

iskander писал(а):см. TComponent.Create.

ок! убедили! ))) массивы и списки форм можно выкинуть :D
iskander писал(а):Создал справочник, показал модально, обработал пользовательский ввод, уничтожил справочник.

+1
Аватара пользователя
leo_bsv
постоялец
 
Сообщения: 276
Зарегистрирован: 04.08.2010 16:26:10
Откуда: Йошкар-Ола

Re: Неопределенное количество форм в рантайме.

Сообщение svk12 » 13.02.2012 00:39:23

leo_bsv писал(а):тогда встаёт вопрос - как динамически создать столько форм сколько надо - ведь они должны определяться как-то так

Выделить всё
Код: Выделить всё
   
var
      Form1, Form2...: TForm1;



Локальная переменная нужного типа прописывается в процедуре, создающей форму. Она нужна только для вызова Application.CreateForm
svk12
постоялец
 
Сообщения: 409
Зарегистрирован: 09.06.2008 18:42:47

Re: Неопределенное количество форм в рантайме.

Сообщение alexs » 13.02.2012 19:25:14

Код: Выделить всё
function SaleDocNew:TSaleEditDocForm;
function SaleDocEdit(TbDocId:integer):TSaleEditDocForm;
implementation
uses MakoshGlobalUtils, saleMassAddUnit, saleListUnit, MakoshMainDataUnit;

{$R *.lfm}

var
  SaleDocList:TList;

function SaleDocNew: TSaleEditDocForm;
begin
  Result:=TSaleEditDocForm.CreateEditForm(-1);
  Result.Show;
  Result.SetFocus;
  AlignSprWorkForm(Result);
end;

function DoFindDoc(TbDocId: integer): TSaleEditDocForm;
var
  i:integer;
begin
  Result:=nil;
  for i:=0 to SaleDocList.Count - 1 do
  begin
    if TSaleEditDocForm(SaleDocList[i]).FTbDocId = TbDocId then
    begin
      Result:=TSaleEditDocForm(SaleDocList[i]);
      break;
    end;
  end;
end;

function SaleDocEdit(TbDocId: integer): TSaleEditDocForm;
var
  i:integer;
begin
  Result:=DoFindDoc(TbDocId);
  if not Assigned(Result) then
  begin
    Result:=TSaleEditDocForm.CreateEditForm(TbDocId);
    Result.Show;
  end;
  Result.SetFocus;
end;


Код: Выделить всё
constructor TSaleEditDocForm.CreateEditForm(ATbDocId: integer);
begin
  inherited Create(Application);
  SaleDocList.Add(Self);
  FTbDocId:=ATbDocId;
end;

destructor TSaleEditDocForm.Destroy;
begin
  SaleDocList.Remove(Self);
  inherited Destroy;
end;

Код: Выделить всё
initialization
  SaleDocList:=TList.Create;
finalization
  SaleDocList.Free;
end.


Готовый код, даже ничего менять не надо.
Надеюсь объяснять не надо?
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Пред.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 193

Рейтинг@Mail.ru