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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.04.2008, 10:16   #41
SkAndrew
Форумчанин
 
Регистрация: 05.04.2008
Сообщений: 244
По умолчанию

компилятор указывает на ошибку второго параметра (панели), а почему? пишет:
[DCC Error] Unit1.pas(59): E2036 Variable required
как это можно исправить?
SkAndrew вне форума Ответить с цитированием
Старый 16.04.2008, 11:19   #42
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А потому что нельзя писать так. Ты почитай внимательно все предидущие описания CreateThread.
CreateThread(nil, 0, Тут нужен указатель на функцию а не вызов ее, nil, CREATE_NEW, ti);
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.04.2008, 11:29   #43
SkAndrew
Форумчанин
 
Регистрация: 05.04.2008
Сообщений: 244
По умолчанию

значит нельзя в функции использовать более общий параметр типа Control : TControl? Или все же есть какой-то выход? Спасибо?
SkAndrew вне форума Ответить с цитированием
Старый 16.04.2008, 11:49   #44
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

SkAndrew, методы класса всегда включают неявный параметер - указатель на объект, для которого они вызваны.
Скажем вызов метода, определенного как
Код:
Tclass1 = class
	//.............
	procedure proc1(i : integer);
	//.............
end;
для переменной var1 : TClass1 будет записан так
Код:
var1.proc1(100);
но фактически (незаметно для разработчика) будет вызван как
Код:
proc1(@var1, 100);
Именно в неявной передаче в метод указателя self и кроется, как правило невозможность включать многие функции WinAPI в класс, иначе как статические методы - вызываемые без self. Но в ряде случаев, наоборот, существует трюк, как, например с функцией потока. В неё передаётся всего один параметр - адрес произвольной переменной, с которой она сама знает как разобраться, поэтому её, в качестве исключения, можно "привязать" к классу но не указывать в определении никаких параметров, а при создании потока (через CreateThread) указать в качестве параметра потока указатель self. Тогда ОС вызовет эту функцию так, как она считает нужным - передав параметр lpParam, а внутри функции он "превратится" в указатель self на объект класса.
B_N вне форума Ответить с цитированием
Старый 16.04.2008, 11:58   #45
SkAndrew
Форумчанин
 
Регистрация: 05.04.2008
Сообщений: 244
По умолчанию

спасибо за разъяснение, но я так и не понял можно использовать более общий параметр типа Control : TControl в функции или нет и как тогда указать, что этот параметр может быть панелью или каким-либо другим контролом?
SkAndrew вне форума Ответить с цитированием
Старый 16.04.2008, 12:01   #46
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от SkAndrew Посмотреть сообщение
спасибо за разъяснение, но я так и не понял можно использовать более общий параметр типа Control : TControl в функции или нет и как тогда указать, что этот параметр может быть панелью или каким-либо другим контролом?
А этого:
Цитата:
поэтому её, в качестве исключения, можно "привязать" к классу
недостаточно? И не забывайте про потоковую небезопасность VCL.
B_N вне форума Ответить с цитированием
Старый 16.04.2008, 12:11   #47
SkAndrew
Форумчанин
 
Регистрация: 05.04.2008
Сообщений: 244
По умолчанию

ну вот в этом то и мое желание разобраться - как именно привязать, можете привести пример и как и как предотвратить потоковую небезопасность МСД? Спасибо!
SkAndrew вне форума Ответить с цитированием
Старый 16.04.2008, 12:22   #48
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от SkAndrew Посмотреть сообщение
ну вот в этом то и мое желание разобраться - как именно привязать,
Что значит "как"? Описать метод класса.

Цитата:
Сообщение от SkAndrew Посмотреть сообщение
и как предотвратить потоковую небезопасность МСД? Спасибо!
EnterCriticalSection, LeaveCriticalSection. А вообще, насколько я помню, на эту тему была статья в справке по дельфи.
B_N вне форума Ответить с цитированием
Старый 16.04.2008, 12:44   #49
SkAndrew
Форумчанин
 
Регистрация: 05.04.2008
Сообщений: 244
По умолчанию

простите, Вы можете привести Ваше видение этого примера кода? А его доработка уже будет более объективно видима, потому что пока рассуждения о классах понятны Вам как специалисту, а моя задача несколько проще - я врач и пишу программу на этом уровне знаний для своей научной работы и все что мне нужно упростить функцию. поэтому у меня просьба помочь с кокретным примером. Спасибо.
SkAndrew вне форума Ответить с цитированием
Старый 16.04.2008, 14:45   #50
SkAndrew
Форумчанин
 
Регистрация: 05.04.2008
Сообщений: 244
По умолчанию

Написал так:

function t(lpThreadParameter : Pointer; Control : TControl): Integer; stdcall;

var
Form1: TForm1;
IsMin: boolean;
lpThreadParameter : Pointer;

implementation

{$R *.dfm}

// плавное раскрытие/сворачивание компонента (панель) по высоте
function t(lpThreadParameter : Pointer; Control : TControl): Integer;// stdcall;
var rd : Integer;
begin
if IsMin then rd := 2 else rd := -2;
while (Control.Height + rd > 2) and (Control.Height + rd < 338) do
begin
Control.Height := Control.Height + rd;
Sleep(10);
end;
IsMin := not IsMin;
Result := 0;
end;

procedure TForm1.Button1Click(Sender: TObject);
var ti : Cardinal;
Control : TControl;
begin
Control := TControl(Panel1);
CreateThread(nil, 0, @t(lpThreadParameter, Control), nil, CREATE_NEW, ti);
end;

все равно компилятор выдает ошибку, что неверно указан параметр "Control". Подскажите как нужно прописать в CreateThread функцию t, чтобы данный код нормально компилировался. Спасибо!
SkAndrew вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дано четырехзначное число, заданное в символьном виде, например, '1954'. Напечатать его текстом, например gred Помощь студентам 13 31.03.2008 22:24
Внедрить контрол в FlexGrid beryllium Общие вопросы .NET 0 21.02.2008 01:09
Плавно выпадающее меню для Mozilla Firefox мЕхаил =) JavaScript, Ajax 6 22.12.2007 23:46
Как создать программу-панель (как панель Msoffice), чтобы была поверх всех окон Romanbl4 Общие вопросы Delphi 6 27.06.2007 17:23
Как плавно поменять цвет формы гера Помощь студентам 1 20.04.2007 15:35