На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
  
> Как из функции передать несколько значений?, Вывод данных в форму.
    На форме кнопка Button и Label1 Label2:
    Скрытый текст

    ExpandedWrap disabled
      unit Unit2;
       
      interface
       
      uses
        Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
        Dialogs, StdCtrls;
       
      type
        TForm2 = class(TForm)
          Label1: TLabel;
          Button1: TButton;
          Label2: TLabel;
          procedure Button1Click(Sender: TObject);
        private
          { Private declarations }
          function d (a, b:integer):integer;
       
        public
          { Public declarations }
        end;
       
      var
        Form2: TForm2;
       
      implementation
       
      {$R *.dfm}
       
      procedure TForm2.Button1Click(Sender: TObject);
      var i,i2,a,b:integer;
      begin
      a:=5;
      b:=5;
      i:=d(a,b); //ссумируем
      Label1.Caption:=IntToStr(i);//выводим    d1
       
      i2:=d(a,b);
      Label2.Caption:=IntToStr(i2);//выводим    d2
       
      end;
       
       
       
      function TForm2.d(a, b: integer): integer;
      var d1,d2: integer;
      begin
      d1:=a+b*a; //Присваиваем функции сумму переменных 1
      Result:=d1;
       
      //d2:=a*2+b*a; //Присваиваем функции сумму переменных 2
      //Result:=d2;
       
      end;
       
      end.
      Чтобы из функции вернуть несколько значений, нужно возвращаемый результат сделать типа запись (record) с несколькими полями.
      Кроме того, можно добавить var-параметр.

      А приведённый пример вообще намекает, что результат должен зависеть от количества вызовов, в этом случае нужно где-то хранить состояние.
        Функция вызывается один раз.
        Как правильно прописать?

        type
        rec = record
        d1,d2:integer;
        end;
          Нашёл такую запись,никак не соединю:
          ExpandedWrap disabled
            type
              TComplex = record
                Re, Im: Double;
                function Create(ARe, AIm: Double): TComplex;
              end;
             
              function TComplex.Create(ARe, AIm: Double): TComplex;
              begin
                Result.Re:= ARe;
                Result.Im:= AIm;
              end;
            ExpandedWrap disabled
                  unit Unit2;
                  
                  interface
                  
                  uses
                    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
                    Dialogs, StdCtrls;
                  
                  type
                    ololo = record
                      d1:integer;
                      d2:integer;
                  end;
                  type
                    TForm2 = class(TForm)
                      Label1: TLabel;
                      Button1: TButton;
                      Label2: TLabel;
                      procedure Button1Click(Sender: TObject);
                    private
                      { Private declarations }
                      function d (a:ololo):ololo;
                    public
                      { Public declarations }
                    end;
                  
                  var
                    Form2: TForm2;
                  
                  implementation
                  
                  {$R *.dfm}
                  
                  procedure TForm2.Button1Click(Sender: TObject);
                  var a:ololo;
                  begin
                    a.d1:=5;
                    a.d2:=5;
                    a:=d(a); //ссумируем
                    Label1.Caption:=IntToStr(a.d1);//выводим    d1
                    Label2.Caption:=IntToStr(a.d2);//выводим    d2
                  end;
                      
                  
                  function TForm2.d(a:ololo):ololo;
                  begin
                    Result.d1:=a.d1+a.d2*a.d1;
                    Result.d2:=a.d1*2+a.d2*a.d1;
                  end;
                  
                  end.
              Gonarh, спасибо большое.
                Цитата Breind10 @
                На форме кнопка Button и Label1 Label2:
                Скрытый текст

                ExpandedWrap disabled
                  unit Unit2;
                   
                  interface
                   
                  uses
                    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
                    Dialogs, StdCtrls;
                   
                  type
                    TForm2 = class(TForm)
                      Label1: TLabel;
                      Button1: TButton;
                      Label2: TLabel;
                      procedure Button1Click(Sender: TObject);
                    private
                      { Private declarations }
                      function d (a, b:integer):integer;
                   
                    public
                      { Public declarations }
                    end;
                   
                  var
                    Form2: TForm2;
                   
                  implementation
                   
                  {$R *.dfm}
                   
                  procedure TForm2.Button1Click(Sender: TObject);
                  var i,i2,a,b:integer;
                  begin
                  a:=5;
                  b:=5;
                  i:=d(a,b); //ссумируем
                  Label1.Caption:=IntToStr(i);//выводим    d1
                   
                  i2:=d(a,b);
                  Label2.Caption:=IntToStr(i2);//выводим    d2
                   
                  end;
                   
                   
                   
                  function TForm2.d(a, b: integer): integer;
                  var d1,d2: integer;
                  begin
                  d1:=a+b*a; //Присваиваем функции сумму переменных 1
                  Result:=d1;
                   
                  //d2:=a*2+b*a; //Присваиваем функции сумму переменных 2
                  //Result:=d2;
                   
                  end;
                   
                  end.

                создать две функции :D
                "What I cannot create, I don't understand" Richard Feynman.
                https://github.com/Cfon/
                :D
                  Создать две функции не всегда хорошо.
                  Например, деление нацело и остаток от деления вычисляются одной инструкцией процессора, потому код
                  ExpandedWrap disabled
                    x := a div b;
                    y := a mod b;

                  это глупость с точки зрения производительности если оно не будет оптимизировано компилятором.
                  Так же и в функциях. Выше был правильный ответ, использовать record. Нафига тут объект и ООП я не знаю, простейший вариант следующий:
                  ExpandedWrap disabled
                    type TRec = record x,y:integer; end;
                     
                    function test(a,b:integer):TRec;
                    begin
                    result.x=1;
                    result.y=2;
                    end;
                  hello world
                  1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script Execution time: 0,1050 ]   [ 15 queries used ]   [ Generated: 3.04.20, 09:08 GMT ]