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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.07.2015, 20:32   #11
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Именно с этим и есть проблема.
Не вижу проблемы:
Код:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses  windows,
      Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

type
      TEnumWindowProc=function(aHandle:HWND;aCaption,aClass:String):Boolean of object;

			{ TEnumWindow }

      TEnumWindow=class
        public
          OnFindWindow:TEnumWindowProc;
           procedure Go;
			end;

			{ TForm1 }

      TForm1 = class(TForm)
						ListBox1: TListBox;
						procedure FormCreate(Sender: TObject);
            function  OnFindWND(aHandle:HWND;aCaption,aClass:String):Boolean;
      private
            { private declarations }
      public
            { public declarations }
      end;

var
      Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
     with TEnumWindow.Create do begin
       OnFindWindow:=@OnFindWND;
       Go;
       Free;
     end;
end;

function TForm1.OnFindWND(aHandle: HWND; aCaption, aClass: String): Boolean;
begin
 ListBox1.AddItem(aCaption+' '+aClass,nil);
end;

{ TEnumWindow }

function EnumCallBack(h:THandle;Me:integer):LongBool; stdcall;
var Nm,cls:Array[0..255] of Char;
begin
   GetClassName(h,cls,sizeof(cls));
   GetWindowText(h,Nm,sizeof(nm));
   TEnumWindow(Me).OnFindWindow(h,string(nm),string(cls));
   Result:=true;
end;


procedure TEnumWindow.Go;

begin
  if not Assigned(OnFindWindow) then exit;
  EnumWindows(@EnumCallBack,LPARAM(Self));
end;

end.
Я угадал?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.07.2015, 21:05   #12
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от Krasiosoft Посмотреть сообщение
Должно быть как-то проще. В C++ для этого нужно было просто писать static перед функцией.
стоп стоп стоп, в С++ static функция по сути функция просто.
она не имеет доступа до экземпляров класса.(если не передать)
не пишите тогда метод класса и все.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 30.07.2015, 21:09   #13
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Stilet, да, что-то вроде этого, только нужно, чтоб функция:
Код:
function EnumCallBack(h:THandle;Me:integer):LongBool; stdcall;
принадлежала классу.

Другими словами, чтоб не было глобальных функций, а все было в классах.

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
С++ static функция по сути функция просто.
Да, именно такую функцию и нужно мне записать в класс.
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).

Последний раз редактировалось Krasiosoft; 30.07.2015 в 21:12.
Krasiosoft вне форума Ответить с цитированием
Старый 30.07.2015, 21:16   #14
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
принадлежала классу.
Зачем? Какой в этом смысл?
И не проще ли тогда использовать FindWindow вместо EnumWindows?
Цитата:
чтоб не было глобальных функций
А где у меня в примере такая функция объявлена?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.07.2015, 21:28   #15
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Зачем? Какой в этом смысл?
Хочу, чтоб все было "по полочкам", т.е. если класс использует функцию, значь она должна ему принадлежать.
Цитата:
Сообщение от Stilet Посмотреть сообщение
И не проще ли тогда использовать FindWindow вместо EnumWindows?
EnumWindows я просто привел как пример, т.к. в нее нужно передавать адрес функции.
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
Krasiosoft вне форума Ответить с цитированием
Старый 30.07.2015, 21:42   #16
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
если класс использует функцию, значь она должна ему принадлежать.
Если я живу в Украине, знач я хохол. Угадал?
Хорошо, это не политкорректно. Если я люблю шоколад, значит я люблю сырое какао жевать. Так?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.07.2015, 21:51   #17
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Я это вижу несколько иначе: "если шоколад, тогда в нем какао".
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
Krasiosoft вне форума Ответить с цитированием
Старый 30.07.2015, 22:04   #18
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Т.е. белый шоколад по твоем не возможен?
Или наоборот - какао заменитель.
ИМХО мороку на голову ты себе только придумал. У нас есть поговорка: "Не мала баба клопота - купила порося".
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.07.2015, 22:27   #19
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Автор, подкорректировав технологии первого поста получил вот такою юнит.
Оно?
Код:
unit Unit1;

interface

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

type
  TMyProc = procedure(const str: string) of object;

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

var
  Form1: TForm1;

implementation

{$R *.dfm}


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

procedure TForm1.FCallBack(const str: string);
begin
  Form1.Memo1.Lines.Add(str);
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, 22:40   #20
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

JUDAS, это не совсем то, что нужно. Надо, чтоб тип функции был именно:
Код:
type
  TMyProc = procedure(const str: string);
Т.е. чтоб при вызове этой функции ничего лишнего не передавалось, кроме как const str: string (это я о self).
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
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