Как передавать переменной на произвольной форме значение из фрейма, размещенного на ней

m830
Дата: 25.07.2019 21:53:49
Есть много форм, на которых размещен один и тот же фрейм.
Клик по кнопке фрейма производит расчет и должен передать в родительскую форму какой-то переменной (во всех формах может быть разное имя переменной) полученное значение.
Gator
Дата: 25.07.2019 22:20:27
m830,

"один и тот же фрейм" это абстракция. На самом деле, как правило, ты жмакаешь разные кнопки на разных фреймах (см. классы и и их экземпряры). Точно так же с формами. Есть класс формы и экземпляр формы.

Созданный фрейм (экземпряр) ты можешь прилепить разным формам. Тогда жмаканье по кнопке на фрейме приведёт к реакции всех форм, к которым этот фрейм привязан.
________
Читай про Parrent & Owner
m830
Дата: 25.07.2019 22:44:46
Все формы разные
На них есть есть Grid, под ним Label, отображающий кол-во записей в DataSet Grid-а
Имя Grid и Label на всех формах разные
Frame успешно понимает имя Grid-а на активной форме и при фильтрации определяет кол-во оставшихся записей в DataSet.
Нужно передать это кол-во в Caption Label формы, в которой вызывался Frame.
Операторы
MyRecCount:=IntToStr(AGrid.DataSource.DataSet.RecordCount);
TLabel(Parent.FindChildControl('Label2')).Caption:=MyRecCount;

успешно передают на родительскую форму кол-во записей.
Но в другой форме может быть свое имя метки
Вот в этом и загвоздка
white_nigger
Дата: 25.07.2019 22:50:17
Программист? Тогда сделай эвент или делегат во фрейме которые будут дергаться по окончании расчёта. А в формах назначай эвент/передавай делегат где и присваивай значение нужной переменной
DimaBr
Дата: 25.07.2019 22:50:30
Фрейм (компонент) не должен управлять компонентами за областью своей видимости
Gator
Дата: 25.07.2019 22:55:47
DimaBr, это через почему?
m830
Дата: 25.07.2019 23:13:29
DimaBr,

А если надо?
DimaBr
Дата: 26.07.2019 00:39:02
m830
DimaBr,
А если надо?

Ты не можешь управлять другим человеком. Ты можешь сказать что он должен сделать и он делает. Но делает это он сам !!!

Фрейм не может управлять другими компонентами (не своими), он может лишь сказать (через событие), что готов отдать данные.
А другой компонент (Label) забирает данные.
krapotkin
Дата: 26.07.2019 13:11:52
мало того, фрейм по хорошему не должен держать данные у себя
он нужен для их визуализации
поэтому
берем данные, создаем фрейм, он получает ссылку на данные
если нужно, вводим фрейму события, и делаем на них обработчики
но в итоге, даже после убийства фрейма, данные должны остаться с вами
m830
Дата: 26.07.2019 16:11:48
У меня все получилось
На какой-то форме есть Grid, под ним метка LabelRc с кол-вом строк в текущем DataSet
На этой же форме помещен "поисковичек" с кнопкой фильтрации по значению ComboBox
Для подключения его к обслуживанию этого Grid-а по событию OnTitleClick используется вызов процедуры
procedure TFrame5.GridTitleClick(Column: TColumn; LblRc: TLabel);
Var
  I :Integer;
begin
  LabelRc:=LblRc;
  LblRecCount:=LblRc.Name;
  GrName:=Column.Grid.Name;
  if ((AGrid<>Nil) and (GrName<>AGrid.Name)) then
     ClearSmtFltr;
  AGrid:=Column.Grid as TDBGrid;
  if Not CheckBox1.Checked then
    for I := 0 to AGrid.Columns.Count-1 do
       AGrid.Columns[I].Title.Font.Style:=FontDialog1.Font.Style;
  AGrid.SelectedField:=Column.Field;
  Column.Title.Font.Style:=[fsBold];
  if Length(Column.Title.Caption)>0 then
    begin
      Label1.Caption:=Column.Title.Caption;
      FldName:=Column.FieldName;
      BitBtn1.Enabled:=True;
      BitBtn2.Enabled:=True;
      BitBtn3.Enabled:=True;
      BitBtn4.Enabled:=True;
      Button1.Enabled:=True;
      Button2.Enabled:=True;
      CheckBox1.Enabled:=True;
      if Column.Field.DataType<>ftString then
         Begin
          Button3.Enabled:=True;
         End
      Else
         Begin
          Button3.Enabled:=False;
         End;
    end;
  ComboBox1.SetFocus
end; 


А установка нового значения кол-ва записей в DataSet Grid-а в метке родительской формы после установки фильтра по кнопке "поисковичка" осуществляется
  RecCount:=IntToStr(AGrid.DataSource.DataSet.RecordCount);
  TLabel(Parent.FindComponent(LabelRc.name)).Caption:=RecCount;