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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.08.2014, 10:39   #1
5cek
Форумчанин
 
Регистрация: 04.07.2013
Сообщений: 118
Вопрос Процедура с параметром

Привет всем, вообщем столкнулся с проблемкой, есть у меня основная программа и dll с процедурами, в них есть следующее объявление типа:
Код:
type
  TMyProcedure = procedure (Param: Pointer = nil) of object;
В основной программе существует процедура:
Код:
procedure TfrmRDPUsers.SetRDPConnection(Param: Pointer);
begin
  Query.Edit;
  Query.FieldByName('id_rdp_connections').AsInteger := Integer(Param);
  Query.Post;
end;
А в DLL есть другая процедура:
Код:
procedure ForToGrid(ViewData: TcxGridViewData; Querys: TUniQuery; proced: TMyProcedure); stdcall;
Var
  i: Integer;
begin
  for i := 0 to ViewData.RowCount - 1 do
  begin
    if ViewData.Rows[i].Values[0] <> null then
      if ViewData.Rows[i].Values[0] then
      begin
        Querys.RecNo := i + 1;
        proced;
      end;
  end;
end;
Так вот, из основной программы пытаюсь передать процедуру в DLL так:
Код:
ForToGrid(cxGridDBTableView1.ViewData, Query, SetRDPConnection(P));
Не хочет компилировать ругаясь следующими некрасивыми словами:
E2010 Incompatible types: 'TMyProcedure' and 'procedure, untyped pointer or untyped parameter'

Где я накосячил?
5cek вне форума Ответить с цитированием
Старый 15.08.2014, 10:48   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Для начала параметры должны совпадать тютенька в тютеньку
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 15.08.2014, 10:49   #3
5cek
Форумчанин
 
Регистрация: 04.07.2013
Сообщений: 118
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Для начала параметры должны совпадать тютенька в тютеньку
Это я заметил когда перечитал пост, в SetRdpConnection добавил = nil, теперь тютелька в тютельку
5cek вне форума Ответить с цитированием
Старый 15.08.2014, 10:50   #4
5cek
Форумчанин
 
Регистрация: 04.07.2013
Сообщений: 118
По умолчанию

Главное если уберу параметр то компилит
Вот так:
Код:
ForToGrid(cxGridDBTableView1.ViewData, Query, SetRDPConnection);
5cek вне форума Ответить с цитированием
Старый 15.08.2014, 10:51   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А ты так не передашь.
Максимум что
ForToGrid(cxGridDBTableView1.ViewDa ta, Query, SetRDPConnection);
или
ForToGrid(cxGridDBTableView1.ViewDa ta, Query, @SetRDPConnection);
Но без параметра передаваемой процедуры.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.08.2014, 10:55   #6
5cek
Форумчанин
 
Регистрация: 04.07.2013
Сообщений: 118
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А ты так не передашь.
Максимум что
ForToGrid(cxGridDBTableView1.ViewDa ta, Query, SetRDPConnection);
или
ForToGrid(cxGridDBTableView1.ViewDa ta, Query, @SetRDPConnection);
Но без параметра передаваемой процедуры.
Понял, значит параметр дополнительно в процедуру передавать?
Вот так: ForToGrid(cxGridDBTableView1.ViewDa ta, Query, SetRDPConnection, Param);
Я так думал в начале, но хотел как то покрасивше)
5cek вне форума Ответить с цитированием
Старый 15.08.2014, 11:08   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
но хотел как то покрасивше
Покрасивше будет передача объекта. Иначе параметры передавай отдельно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.08.2014, 11:21   #8
StriderX
Форумчанин
 
Регистрация: 21.04.2014
Сообщений: 115
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Покрасивше будет передача объекта. Иначе параметры передавай отдельно.
Есть еще один вариант, передать туда интерфейс\анонимку:
Код:
   ForToGrid(cxGridDBTableView1.ViewDa ta, Query, 
                 procedure ()
                 begin
                        SetRDPConnection(P);
                 end
                );
Главное такими штуками не увлекаться =-)
StriderX вне форума Ответить с цитированием
Старый 15.08.2014, 11:32   #9
5cek
Форумчанин
 
Регистрация: 04.07.2013
Сообщений: 118
По умолчанию

Цитата:
Сообщение от StriderX Посмотреть сообщение
Есть еще один вариант, передать туда интерфейс\анонимку:
Код:
   ForToGrid(cxGridDBTableView1.ViewDa ta, Query, 
                 procedure ()
                 begin
                        SetRDPConnection(P);
                 end
                );
Главное такими штуками не увлекаться =-)
Можно и так, но покрасивше всё таки как Stilet подсказал, передача объекта, чет сразу в голову не пришло спасибо!))
5cek вне форума Ответить с цитированием
Старый 15.08.2014, 11:37   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Есть еще один вариант, передать туда интерфейс\анонимку:
Ну это счастливчикам ХЕ-шек такое можно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
процедура с параметром вызывает функцию subluna Microsoft Office Excel 27 11.01.2012 02:37
Процедура с параметром MD1 Паскаль, Turbo Pascal, PascalABC.NET 1 29.11.2011 18:25
Процедура с параметром и без параметра admin22 Паскаль, Turbo Pascal, PascalABC.NET 2 27.09.2011 15:44
Процедура с изменяемым параметром Utkin Общие вопросы Delphi 11 30.11.2010 14:41
Процедура с параметром динамическим массивом. VintProg Общие вопросы Delphi 12 11.06.2010 13:12