FS и компоненты формы.

отредактировано 01:23 Раздел: FastScript
Zdravstvujte..

Stolknulsja s neprijatnoj dlja menja shtukoj..
mne neobxodimo ispolzovat' componenti v skripte kotorjije lezat na "drugoj" forme
a imenno

form1.Button1.Caption := 'test';
form2.label1.Caption := 'test2';

registriruja formi script naxodit ix no naxodit' objecti na nej on estestvenno ne budet
nesljza li sdelat' tak 4to Tfsscript, ne naxodja u dannogo objecta(Form1, Form2)
dannuju propertu ili method (Button1, Label1), to on pitajetsja naiti object (FindComponent) s takim imenem.
ESli vozmono ukazite mne kuda ja sam poprvalju, ili mozet vi namerevaetes' vnesti eto
v sleduju#uju versiju FS.


Igor...

Комментарии

  • отредактировано 01:23
    Что-то апологеты не отвечают. А ведь интересный вопрос.
    Можно ли когда-нибудь из скрипта обращаться к другим формам и объектам, на ней расположенных?
  • отредактировано 01:23
    В 1.4 (скоро) - можно.
  • отредактировано 01:23
    Пока не стал бы причислять себя к ярым апологетам FS, но откликнусь ;) Я добавил обертку TComponent.FindComponent, примерно так:
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      with fsGlobalUnit.FindClass('TComponent') do
        AddMethod('function FindComponent(AName: string): TComponent', CallMethod);
    end;
    
    function TForm1.CallMethod(Instance: TObject; ClassType: TClass;
      const MethodName: String; var Params: Variant): Variant;
    begin
      if Instance is TComponent then
        if MethodName = 'FINDCOMPONENT' then
          Result := Integer(TComponent(Instance).FindComponent(Params[0]))
    end;
    
    Как это может работать покажет следующий скрипт:
    На основой форме комбобкс, едит и 2 кнопки. По каждому нажатию "New Form" создается и показывается новая немодальная дочерняя форма с именем FormX - где Х счетчик, имя ее также добавляется в комбобокс. Для примера на новую форму помещается лэйбл с предопределенным именем LabelName. По нажатию "Edit Caption" обработчик ищет форму с именем текущего элемента комбобокса, если находит ищет на форме лэйбл с именем LabelName и присваивает ему текст едита. Так что до появления FS 1.4 подобным подходом можно пользоваться ;)
    const
      LabelName = 'Label1';
    var
      Count: Integer;
      fmMain: TForm;
      btNewForm: TButton;
      cbxForms: TComboBox;
      edCaption: TEdit;
      btEditLabel: TButton;
    
    function GetNewForm(Owner: TForm; Name: string): TForm;
    var
      Form: TForm;
      Label1: TLabel;
    begin
      Result := nil;
      Form := TForm.Create(Owner);
      Label1 := TLabel.Create(Form);
      Label1.Parent := Form;
      Label1.Name := LabelName;
      Form.Name := Name;
      Form.Caption := Name;
      cbxForms.Items.Add(Name);
      cbxForms.ItemIndex := cbxForms.Items.Count-1;
      Form.Show;
      Result := Form;
    end;
    
    procedure btNewFormClick(Sender: TObject);
    var
      Form: TForm;
    begin
      Count := Count + 1;
      Form := GetNewForm(fmMain, 'Form'+IntToStr(Count));
      Form.Left := Count*10;
      Form.Top := Count*10;
    end;
    
    procedure btEditLabelClick(Sender: TObject);
    var
      Label1: TLabel;
      Form: TForm;
      FormName: string;
    begin
      if cbxForms.ItemIndex < 0 then Exit;
    
      FormName := cbxForms.Items[cbxForms.ItemIndex];
      Form := TForm(fmMain.FindComponent(FormName));
      if Form <> nil then
      begin
        Label1 := TLabel(Form.FindComponent(LabelName));
        if Label1 <> nil then
          Label1.Caption := edCaption.Text
        else
          ShowMessage(Format(
            'На форме с именем "%s" компонент по имени "%s" не найден...',
            [FormName, LabelName]));
      end
      else
        ShowMessage('Форма с именем "'+FormName+'" не найдена...');
    end;
    
    begin
      Count := 0;
      fmMain := TForm.Create(nil);
      try
        fmMain.Caption := 'Parent';
        fmMain.Left := 300;
        fmMain.Top := 300;
    
        cbxForms := TComboBox.Create(fmMain);
        cbxForms.Parent := fmMain;
    
        edCaption := TEdit.Create(fmMain);
        edCaption.Parent := fmMain;
        edCaption.Top := cbxForms.Height + 10;
        edCaption.Text := 'Caption For "Label1"';
    
        btNewForm := TButton.Create(fmMain);
        btNewForm.Parent := fmMain;
        btNewForm.Caption := 'New Form';
        btNewForm.OnClick := @btNewFormClick;
        btNewForm.Left := cbxForms.Width + 10;
    
        btEditLabel := TButton.Create(fmMain);
        btEditLabel.Parent := fmMain;
        btEditLabel.Caption := 'Edit Label';
        btEditLabel.OnClick := @btEditLabelClick;
        btEditLabel.Left := btNewForm.Left;
        btEditLabel.Top := btNewForm.Height + 10;
    
        fmMain.ShowModal;
      finally
        fmMain.Free;
      end;
    end.
    
  • отредактировано 01:23
    Этим способом можно пользоваться и после выхода 1.4, т.к. обращение к компонентам формы работает только для внешних форм, которые были добавлены через fsScript.AddForm.

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.