Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.04.2024, 18:55   #1
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 627
По умолчанию With ... do и вызов функции

Код:
with TButton.Create do begin
  {настройка кнопки}
end;
И вот такой вопрос: мне внутри этого блока нужно вызвать процедуру, аргументом которой будет сама кнопка. Есть ли такая возможность?
Kronos913 вне форума Ответить с цитированием
Старый 10.04.2024, 19:23   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Например:
Код:
bt := TButton.Create;
with bt do begin
  func(bt);
end;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 11.04.2024, 00:33   #3
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Цитата:
Сообщение от Kronos913 Посмотреть сообщение
Есть ли такая возможность?
Нет. Без внешней переменной никак. Это очень печально, но разработчики компилятора о такой возможности не озаботились.
northener вне форума Ответить с цитированием
Старый 11.04.2024, 09:42   #4
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
разработчики компилятора о такой возможности не озаботились
Если речь идет о своем собственном классе, то о такой возможности можно позаботиться самостоятельно:
Код:
type
  TMyClass = class
    protected
      FTest: Integer;
      function GetThis: TMyClass;
    public
      property Test: Integer read FTest;
      property This: TMyClass read GetThis;
      constructor Create(A: Integer);
  end;

constructor TMyClass.Create(A: Integer);
begin
  inherited Create;
  FTest := A;
end;

function TMyClass.GetThis: TMyClass;
begin
  Result := Self; // вернем указатель на самого себя
end;

procedure ShowTest(MyClass: TMyClass);
begin
  ShowMessage(IntToStr(MyClass.Test));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  with TMyClass.Create(123) do begin
    ShowTest(This); // This - указатель на себя
  end;
end;
Arigato вне форума Ответить с цитированием
Старый 11.04.2024, 20:53   #5
DIONISKA
Форумчанин
 
Регистрация: 07.11.2011
Сообщений: 161
По умолчанию

Это же по сути тот-же самый вопрос что и этот >>?
Конструкция with ... do чисто косметическая, нужная для улучшения читаемости кода, в вашем случае если что-то гордить, то читаемость она только ухудшит.
Но если это не останавливаети и не хочется создавать локальные переменные и у вас IDE Rio и выше (10.3+), то можно делать так:
Код:
procedure Tmainform.btnclick(Sender: TObject);
var
  button:TButton absolute Sender;
begin
  ShowMessage('Button #'+button.Tag.ToString+' Clicked!');
end;

procedure Tmainform.FormCreate(Sender: TObject);
begin
  for var I:integer := 0 to 5 do
   begin
     //переменная button будет видима только в этом блоке!
     var button{:tbutton}:=tbutton.Create(self);
     with button do
      begin
       Parent:=self;
       Caption:='Я кнопка #'+i.ToString;
       OnClick:=mainform.btnclick;
       Left:=button.Width*i;
       Tag:=i;
      SomeProcedure(button);
      end;
   end;
end;
Или как вам советовали в той теме: Наследник класса, возрващающий self, использовать классхелперы и тп
DIONISKA вне форума Ответить с цитированием
Старый 11.04.2024, 21:32   #6
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Цитата:
Сообщение от DIONISKA Посмотреть сообщение
Это же по сути тот-же самый вопрос что и этот
Тоже помню, что отвечал на подобный вопрос, но тему сходу не нашел. Да, ТС странный человек, и вопросы странные задает, и повторяется, то есть ответы он не воспринимает...
Arigato вне форума Ответить с цитированием
Старый 12.04.2024, 02:20   #7
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Цитата:
Сообщение от Arigato Посмотреть сообщение
Если речь идет о своем собственном классе, то о такой возможности можно позаботиться самостоятельно:
Цитата:
Сообщение от DIONISKA Посмотреть сообщение
Конструкция with ... do чисто косметическая, нужная для улучшения читаемости кода
И да и нет в обоих случаях.
northener вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вызов функции из DLL artemavd Общие вопросы Delphi 12 03.06.2015 13:22
Вызов функции Diana528 Общие вопросы C/C++ 1 18.04.2013 21:56
Вызов функции Anubys Помощь студентам 2 06.04.2011 16:40
Вызов функции из DLL(C#) ZverSS88 Помощь студентам 0 25.11.2010 11:27
Мини бэйсик:объявление функции, вызов функции , возврат. AL_LORD Помощь студентам 2 14.10.2010 17:48