Управление компонентами формы по имени формы - PullRequest
0 голосов
/ 22 января 2012

У меня есть класс Form, из которого я использую несколько объектов формы.И я переименовываю каждую сгенерированную форму.

Я не знаю, как получить доступ к указанным компонентам формы, не затрагивая другие сгенерированные компоненты форм.

Я использовал этот код, но всегда составляющие компонентыНа последнюю созданную форму влияют:

procedure TmainForm.OFBloqueButtonClick(Sender: TObject);
begin
    if (mainForm.tabSheetBool = True) AND (mainForm.OFID <> '') then begin
       if OF_bloque = False then begin
           Application.CreateForm(TOFOperationsForm, OFOperationsForm);
           OFOperationsForm.Caption := 'Bloquer OF';
           OFOperationsForm.Name := 'OFBloqueForm';
           OF_bloque := True;
       end;
       OFOperationsForm.BringToFront;
       OFOperationsForm.ADOOF.SQL.Text := 'SELECT * FROM OFTab WHERE ID=''' + OFID + '''';
       OFOperationsForm.ADOOF.Open;
    end;
end;

Моя цель - манипулировать заданным ADOQuery желаемой формы.

Спасибо.

Ответы [ 3 ]

4 голосов
/ 22 января 2012

Когда вы создаете несколько экземпляров класса формы, вам не следует использовать переменную, объявленную IDE в модуле формы.На самом деле, большинство известных мне разработчиков Delphi удаляют эту переменную, как только они создают новую форму, только основная форма приложения сохраняет ее, потому что она нужна dpr.

Кроме того, вам не нужно искать формуиспользуя FindWindow или даже перебирая формы приложения или экрана.Просто используйте локальную переменную при ее создании:

procedure TmainForm.OFBloqueButtonClick(Sender: TObject);
var
  NewForm: TOFOperationsForm;
begin
    NewForm := nil;
    if (mainForm.tabSheetBool = True) AND (mainForm.OFID <> '') then begin
       if OF_bloque = False then begin
           NewForm := TOFOperationsForm.Create(Application);
           NewForm.Caption := 'Bloquer OF';
           NewForm.Name := 'OFBloqueForm';  //<== You'll need to make this unique!
           OF_bloque := True;
       end;
       if Assigned(NewForm) then begin
         NewForm.BringToFront;
         NewForm.ADOOF.SQL.Text := 'SELECT * FROM OFTab WHERE ID=''' + OFID + '''';
         NewForm.ADOOF.Open;
       end;
    end;
end;

Редактировать

Добавлены некоторые меры безопасности в приведенный выше код для предотвращения AV.В его нынешнем виде это означает, что запрос не изменяется, пока не будет создана форма.Если вы хотите установить запрос новой формы или изменить запрос последней созданной формы, вам нужно поле члена в TmainForm:

TmainForm = class(TForm)
private
  FLastFormCreated: TOFOperationsForm;
//...

и изменить код в обработчике ButtonClickto:

procedure TmainForm.OFBloqueButtonClick(Sender: TObject);
begin
    if (mainForm.tabSheetBool = True) AND (mainForm.OFID <> '') then begin
       if OF_bloque = False then begin
           FLastFormCreated := TOFOperationsForm.Create(Application);
           FLastFormCreated.Caption := 'Bloquer OF';
           FLastFormCreated.Name := 'OFBloqueForm';
           OF_bloque := True;
       end;
       if Assigned(FLastFormCreated) then begin
         FLastFormCreated.BringToFront;
         FLastFormCreated.ADOOF.SQL.Text := 'SELECT * FROM OFTab WHERE ID=''' + OFID + '''';
         FLastFormCreated.ADOOF.Open;
       end;
    end;
end;

Я оставил в проверке Assigned, потому что без остальной части кода я не могу судить, возможно ли логически достичь BringToFront без FLastFormCreated, получив по крайней мере ссылкуодин раз (т.е. в случае, если OF_Blogue установлен в True в другом месте).

0 голосов
/ 23 января 2012

Решение:

unit main;

interface

uses
    Windows, Messages, ... , OF_operations;

type
    TmainForm = class(TForm)
    ...
    ...
    ...
    private 
    ...
    public
         OFBloqueForm, OFCancelForm, OFDelaisClientForm, OFInspectionForm: TOFOperationsForm;
    end;

// Bloquer OF
procedure TmainForm.OFBloqueButtonClick(Sender: TObject);
begin
    if (mainForm.tabSheetBool = True) AND (mainForm.OFID <> '') then begin
        if OF_bloque = False then begin
            OFBloqueForm := TOFOperationsForm.Create(Application);
            OFBloqueForm.Caption := 'Bloquer OF';
            OFBloqueForm.Name := 'OFBloqueForm';
            OF_bloque := True;
        end;
        OFBloqueForm.BringToFront;
        OFBloqueForm.ADOOF.SQL.Text := 'SELECT * FROM OFTab WHERE ID=''' + OFID + '''';
        OFBloqueForm.ADOOF.Open;
    end;
end;
0 голосов
/ 22 января 2012

Я думаю, что происходит то, что вы создаете несколько форм, которые стирают указатели на предыдущие формы, и в итоге вы получаете указатель на последнюю созданную форму.

Вы можете перебирать Screen.Forms, чтобы получить ссылку на нужную форму, вот пример:

procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
  NewForm: TForm2;
begin
  // create two forms, then show the first form
  Application.CreateForm(TForm2, NewForm);
  NewForm.Name := 'FirstForm';
  NewForm.Caption := 'This form was created 1st';
  Application.CreateForm(TForm2, NewForm);
  NewForm.Name := 'SecondForm';
  NewForm.Caption := 'This form was created 2nd';
  // iterate Screen.Forms to access the first form by name
  for i := 0 to Screen.FormCount - 1 do
    if Screen.Forms[i].Name = 'FirstForm' then
      Screen.Forms[i].Show;  // shows the first form
end;
...