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

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

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

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

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

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

Спасибо alexBlack, но если записать вот так:

function t(lpThreadParameter : Pointer): Integer stdcall;
var rd : Integer;
begin
Randomize;
rd := Random(4);
with Form1 do
while (Panel1.Width > 50) and (Panel1.Height > 50) do
begin
Panel1.Height := Panel1.Height - rd;
Panel1.Width := Panel1.Width - rd;
Sleep(10);
end;
end;

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

то функция компилируется, но после нажатия кнопки ничего не происходи и более того после закрытия формы компилчтор выдает ошибку неверного чтения какого-то адреса.
Что не так?
Спасибо.
SkAndrew вне форума Ответить с цитированием
Старый 15.04.2008, 12:13   #32
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

SkAndrew, вернись на первую страницу в пост #4, строка 18. Понял что не так?
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 15.04.2008, 12:14   #33
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Даж не знаю... Вообще я лично прекрасно обходился без параметров в этой функе. Ну попробуй прописать result:=0 в конце функи потока. Где то в стек попадает левый адрес помоему.
И еще попробуй убрать из потока все обращения к компонентам и форме, если ошибка при закрытии исчезнет, значит в потоке нужно проверять не уничтожены ли компоненты.

э-э-э стоп, а ты что функу в класс формы включил?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.04.2008, 17:03   #34
SkAndrew
Форумчанин
 
Регистрация: 05.04.2008
Сообщений: 244
По умолчанию

mutabor - нет не понял - что там не так, можно привести полный код чтобы наконец-то понять где ошибка. спасибо!
SkAndrew вне форума Ответить с цитированием
Старый 15.04.2008, 20:44   #35
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Проверил, работает.
Код:
...
function t(lpThreadParameter : Pointer): Integer stdcall;

implementation

{$R *.DFM}

function t(lpThreadParameter : Pointer): Integer stdcall;
var rd : Integer;
begin
Randomize;
rd := Random(4);
with Form1 do
while (Panel1.Width > 50) and (Panel1.Height > 50) do
begin
Panel1.Height := Panel1.Height - rd;
Panel1.Width := Panel1.Width - rd;
Sleep(10);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var ti : Cardinal;
begin
CreateThread(nil, 0, @t, nil, CREATE_NEW, ti);
end;
...
А это с моими дополнениями - добавил разворачивание и Random убрал (не очень понятно зачем его там вообще применили).
Разворачивание все той же кнопкой, начальные размеры панели должны быть меньше чем 300 х 300, если превышают поменяй либо размеры панели, либо цифры в условии, так чтобы разница хотя бы в единицу была.
Код:
...
var
  IsMin: boolean;

function t(lpThreadParameter : Pointer): Integer stdcall;

implementation

{$R *.DFM}

function t(lpThreadParameter : Pointer): Integer stdcall;
var
rd: integer;
begin
if IsMin then rd := 2 else rd := -2;
with Form1 do
  while (Panel1.Width + rd > 50) and (Panel1.Height + rd > 50) and
    (Panel1.Width + rd < 300) and (Panel1.Height + rd < 300) do
    begin
      Panel1.Height := Panel1.Height + rd;
      Panel1.Width := Panel1.Width + rd;
      Sleep(10);
    end;
IsMin := not IsMin;
end;

procedure TForm1.Button1Click(Sender: TObject);
var ti : Cardinal;
begin
CreateThread(nil, 0, @t, nil, CREATE_NEW, ti);
end;
...
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 15.04.2008, 22:27   #36
SkAndrew
Форумчанин
 
Регистрация: 05.04.2008
Сообщений: 244
По умолчанию

спасибо - работает отлично!
SkAndrew вне форума Ответить с цитированием
Старый 15.04.2008, 22:41   #37
SkAndrew
Форумчанин
 
Регистрация: 05.04.2008
Сообщений: 244
По умолчанию

mutabor - А если записать так (это возможно?):

var
Form1: TForm1;
IsMin: boolean;

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

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.Width + rd > 50) and (Control.Height + rd > 2) and
(Control.Width + rd < 600) and (Control.Height + rd < 338) do
begin
Control.Height := Control.Height + rd;
Control.Width := Control.Width + rd;
Sleep(10);
end;
IsMin := not IsMin;
Result := 0;
end;

procedure TForm1.Button1Click(Sender: TObject);
var ti : Cardinal;
begin
CreateThread(nil, 0, @t(??????, ElPanel1), nil, CREATE_NEW, ti);
end;

тогда какой должен быть первый параметр в функции t?
Спасибо за ответ!
SkAndrew вне форума Ответить с цитированием
Старый 16.04.2008, 08:06   #38
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
CreateThread(nil, 0, @t(??????, ElPanel1), nil, CREATE_NEW, ti);
Ты бы хоть проверил будет ли этот изврат работать.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.04.2008, 10:01   #39
SkAndrew
Форумчанин
 
Регистрация: 05.04.2008
Сообщений: 244
По умолчанию

проверил, не работает. просто хотел несколько упростить функцию mutabor. не могу понять как записать первый параметр функции и ошибку компилятор выдает почему-то на второй параметр. Спасибо.
SkAndrew вне форума Ответить с цитированием
Старый 16.04.2008, 10:06   #40
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Чтоб передать в поток ченить, нужно просто определить переменные, передл запуском потока, и пусть поток их читает.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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