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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.07.2015, 23:01   #21
Мордохвост
Пользователь
 
Регистрация: 15.04.2015
Сообщений: 30
По умолчанию

Тогда class и static. Слово это нейтрализует Self.
Код:
...
TForm1 = class(TForm)
    Memo1: TMemo;
...
  private
    class procedure FCallBack(const str: string);static;
...

var
  Form1 : TForm1;

implementation

class TForm1.FCallBack(const str: string);
begin
Form1.Memo1.Lines.Add(str); 
end;
Мордохвост вне форума Ответить с цитированием
Старый 30.07.2015, 23:07   #22
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Пробовал уже, не выходит, выдает ошибку:
Цитата:
[Error] Unit1.pas(25): Field definition not allowed after methods or properties
На строчку:
Код:
    class procedure FCallBack(const str: string);static;
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
Krasiosoft вне форума Ответить с цитированием
Старый 30.07.2015, 23:13   #23
Мордохвост
Пользователь
 
Регистрация: 15.04.2015
Сообщений: 30
По умолчанию

XE7, собралось.
Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs;

type
  TForm1 = class(TForm)
  private
    { Private declarations }
    class procedure FCallBack(const str:string);static;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

class procedure TForm1.FCallBack(const str:string);
begin
Form1.Caption := 'Called back!';
end;

{$R *.dfm}

end.
А. procedure выше пропустил.
Мордохвост вне форума Ответить с цитированием
Старый 30.07.2015, 23:21   #24
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Я собираю на Delphi 7 (build 4.453).

Если код:

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
  private
    { Private declarations }
    class procedure FCallBack(const str:string);static;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

class procedure TForm1.FCallBack(const str:string);
begin
Form1.Caption := 'Called back!';
end;

{$R *.dfm}

end.
тогда ошибка:

Цитата:
[Error] Unit1.pas(13): Field definition not allowed after methods or properties
Если убрать "static;", тогда собирает нормально.

Выходит проблема в версии компилятора...
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).

Последний раз редактировалось Krasiosoft; 30.07.2015 в 23:24.
Krasiosoft вне форума Ответить с цитированием
Старый 30.07.2015, 23:22   #25
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Цитата:
Сообщение от Krasiosoft Посмотреть сообщение
JUDAS
Т.е. чтоб при вызове этой функции ничего лишнего не передавалось, кроме как const str: string (это я о self).
те же яйца только вид с копчика

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TMyProc = procedure(const str: string);

  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    
  public
    callback : TMyProc;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.FormCreate(Sender: TObject);

   procedure _PROC(const str: string); far;
   begin
     Form1.Memo1.Lines.Add(str);
   end;

begin
  callback := @_PROC;
end;


procedure UseCallbackFunc(proc: TMyProc);
begin
  proc('1111');
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  Form1.callback('1111');  //  íîðìàëüíî âûâîäèò òåêñò â Memo1
  UseCallbackFunc(Form1.callback);  //  âûâîäèò âñÿêèé áðåä â Memo1
end;

end.
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 30.07.2015, 23:55   #26
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

JUDAS, Спасибо! Это то, что я и хотел.

Если не сложно, можете объяснить, как такое вложение функций называется, и почему для этого не нужно писать var перед _PROC?

Я так понимаю, видимость этой функции будет только внутри TForm1.FormCreate(), но тело функции не в стеке и ее можно продолжать использовать.
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).

Последний раз редактировалось Krasiosoft; 30.07.2015 в 23:57.
Krasiosoft вне форума Ответить с цитированием
Старый 31.07.2015, 00:41   #27
ResourceSpace
Форумчанин
 
Аватар для ResourceSpace
 
Регистрация: 30.06.2015
Сообщений: 353
По умолчанию

То? Поле callback не является функцией, просто указатель. Функция _PROC не принадлежит классу, её можно вынести из FormCreate() и ничего не изменится.
Не в курсе что именно делает "static" в XE, но в Борландовских оно неприменимо к методам и свойствам.
Цитата:
В C++ для этого нужно было просто писать static перед функцией.
гм... А разве там такие функции считаются принадлежащими классу?

Так а зачем это всё? Если некто принимает простую функцию - метод класса он принимать не станет. И наоборот.
ResourceSpace вне форума Ответить с цитированием
Старый 31.07.2015, 00:54   #28
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Подход может не из самых лучших, но он работает, и функция _PROC недоступна с других мест. Если есть лучше вариант для Delphi 7, можете предложить его.

В C++ это было так:
Код:
#include <iostream>

using namespace std;

class A{

public:
    static void func(int a){
        cout << a << endl;
    }
};

int main ()
{
    A::func(66);

    system("pause");

    return 0;
}
И в функцию "func" никакие дополнительные параметры не передавались, что происходит сейчас в Delphi.
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).

Последний раз редактировалось Krasiosoft; 31.07.2015 в 00:56.
Krasiosoft вне форума Ответить с цитированием
Старый 31.07.2015, 01:28   #29
ResourceSpace
Форумчанин
 
Аватар для ResourceSpace
 
Регистрация: 30.06.2015
Сообщений: 353
По умолчанию

Цитата:
И в функцию "func" никакие дополнительные параметры не передавались, что происходит сейчас в Delphi.
Конечно не передаётся. Так как ни _PROC() ни TForm.callback не являются методами класса. Первое обычная функция, второе указатель.
Цитата:
функция _PROC недоступна с других мест.
О, да. И даже из самого класса. Как тогда можно утверждать что оно принадлежит ему?
Но недоступна только потому что оно столь странно объявлено. Что-то мне подсказывает что так не следует объявлять. [где же уважаемый GunSmoker который может пояснить все нюансы?]
Вынес за FormCreate() - код работает как и прежде, но _PROC() стало доступно как обычно.
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TMyProc = procedure(const str: string);

  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    
  public
    callback : TMyProc;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure _PROC(const str: string); far;
begin
Form1.Memo1.Lines.Add(str);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  callback := @_PROC;
end;


procedure UseCallbackFunc(proc: TMyProc);
begin
  proc('UseCallbackFunc');
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  Form1.callback('Button1Click');  //  íîðìàëüíî âûâîäèò òåêñò â Memo1
  UseCallbackFunc(Form1.callback);  //  âûâîäèò âñÿêèé áðåä â Memo1
  _PROC('_PROC');
end;

end.
Что изменилось? Не понял в чём фишка.


У меня нету C++ под рукою, а если так (блин, давно не писал на нём, накосячить с синтаксисом могу) чего будет?:
Код:
#include <iostream>

using namespace std;

class A{
    int count = 10;
public:
    static void func(int a){
        cout << "[" << count << "]  " << a << endl;
        count++;
    }
};

int main ()
{
    A::func(66);
    A::func(67);
    A::func(68);
    system("pause");
    return 0;
}
Если из func нет доступа к count то думаю нельзя утверждать что func принадлежит классу. Идентично тому если бы была обычная функция.
ResourceSpace вне форума Ответить с цитированием
Старый 31.07.2015, 02:09   #30
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Цитата:
Сообщение от ResourceSpace Посмотреть сообщение
Как тогда можно утверждать что оно принадлежит ему?
Если посмотреть дизассемблером, то в C++ статик функцию класса нельзя отличить от обычной, но речь же идет не об этом.

В C++ static функции можно вызывать без объекта класса, т.е. они работают как обычные функции вне класса, но находятся в классе. Этого я и добиваюсь в Delphi 7.

Код на C++, который Вы написали не скомпилируется, будет ошибка, что нельзя со статик функций обращаться к не статик переменным класса.
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
Krasiosoft вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
На С++ написать программу с реализацией в виде вызова функции по ссылке: Функция должна вернуть не одно, а ДВА(или более) значения Raitek Помощь студентам 2 23.01.2015 07:41
Процедура и функция Ken_Watanabe Помощь студентам 9 09.09.2014 16:27
Сделать чтобы функция стандартная String.Delete работала в классе потомке от TStringList? nick17 Общие вопросы Delphi 4 09.11.2010 14:17
Метод обратного вызова? Altera Общие вопросы Delphi 20 11.08.2010 18:27
Функция обратного вызова и таймер на WinApi flug Win Api 4 17.09.2009 16:06