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

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

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

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

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

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

Вот еще что-то сотворил, но могу найти ошибку - код не работает.

type
TMyClass = class
function t(lpThreadParameter : Pointer; Control : TControl): Integer; stdcall; // здесь выдает компилятор ошибку - "[Pascal Error] Unit1.pas(29): E2065 Unsatisfied forward or external declaration: 'TMyClass.t'" что делать? как исправить?
end;

var
Form1: TForm1;
IsMin: boolean;
var1 : TMyClass;

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 < 600) do
begin
Control.Height := Control.Height + rd;
Control.Width := ElPanel1.Width + rd;
Sleep(10);
end;
IsMin := not IsMin;
end;

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

Помогите исправить код, пожалуйста! Спасибо всем.
SkAndrew вне форума Ответить с цитированием
Старый 16.04.2008, 18:38   #52
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,183
Стрелка

Почему любят простые вещи усложнять.
Вот так хоть какой обьект свернёт/развернёт(надо знак только поменять):

Код:
unit Lists;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var XCon :TControl;
  Form1: TForm1;
  procedure t;

implementation

  procedure t;
  Var rd:integer;
  begin
   IF XCon=Nil Then Exit;
  randomize;
  rd:=(random(4));
  while (XCon.Width>50)and(XCon.Height>50) do begin
    XCon.Width := XCon.Width-rd;
    XCon.Height := XCon.Height-rd;
    sleep(10);
  end;   
  end;

{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);
var ti :Cardinal;
begin
 XCon := Button1; // Переменая для объекта анимации
 CreateThread(nil, 0, @t, 0, CREATE_NEW, ti);
end;

end.

Последний раз редактировалось Alter; 16.04.2008 в 18:40.
Alter вне форума Ответить с цитированием
Старый 16.04.2008, 18:57   #53
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    RollButton: TButton;
    UnRollButton: TButton;
    Panel1: TPanel;
    procedure FormCreate(Sender: TObject);
    procedure RollButtonClick(Sender: TObject);
    procedure UnRollButtonClick(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    bIsFanelRolled : boolean;
    MaxPanelHeight  : cardinal;
    RollLock        : RTL_CRITICAL_SECTION;
    procedure RollPanelThread; stdcall;
    procedure UnRollPanelThread; stdcall;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
    self.bIsFanelRolled := false;
    MaxPanelHeight      := 300;
    InitializeCriticalSection(RollLock);
end;

procedure TForm1.RollPanelThread;
var
    rcPanel : TRect;
    cy      : cardinal;
begin
    EnterCriticalSection(RollLock);
        if(not self.bIsFanelRolled) then begin
            GetWindowRect(Panel1.Handle, rcPanel);
            cy := rcPanel.Bottom - rcPanel.Top;
            while cy >= 20 do begin
                dec(cy, 20);
                SetWindowPos(
                        Panel1.Handle,
                        0,
                        0,
                        0,
                        rcPanel.Right - rcPanel.Left,
                        cy,
                        SWP_NOMOVE + SWP_NOZORDER + SWP_NOACTIVATE);
                sleep(30);

                GetWindowRect(Panel1.Handle, rcPanel);
                cy := rcPanel.Bottom - rcPanel.Top

            end;
            self.bIsFanelRolled := true;
        end;
    LeaveCriticalSection(RollLock);
end;

procedure TForm1.UnRollPanelThread;
var
    rcPanel : TRect;
    cy      : cardinal;
begin
    EnterCriticalSection(RollLock);
        if(self.bIsFanelRolled) then begin
            GetWindowRect(Panel1.Handle, rcPanel);
            cy := rcPanel.Bottom - rcPanel.Top;
            while cy <= MaxPanelHeight - 10 do begin
                inc(cy, 20);
                SetWindowPos(
                        Panel1.Handle,
                        0,
                        0,
                        0,
                        rcPanel.Right - rcPanel.Left,
                        cy,
                        SWP_NOMOVE + SWP_NOZORDER + SWP_NOACTIVATE);
                sleep(30);

                GetWindowRect(Panel1.Handle, rcPanel);
                cy := rcPanel.Bottom - rcPanel.Top

            end;
            self.bIsFanelRolled := false;
        end;
    LeaveCriticalSection(RollLock);
end;

procedure TForm1.RollButtonClick(Sender: TObject);
var
    id : cardinal;
begin
    CreateThread(nil, 0, @TForm1.RollPanelThread, self, 0, id);
end;

procedure TForm1.UnRollButtonClick(Sender: TObject);
var
    id : cardinal;
begin
    CreateThread(nil, 0, @TForm1.UnRollPanelThread, self, 0, id);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
    DeleteCriticalSection(RollLock);
end;

end.
--------------------------------------
Пример выше предназначен для того, чтобы закрыть вопрос о внедрении потока в класс. Лично я не думаю, что потоки и даже волокна в данном случае - оптимальный вариант. Всё это вполне можно решить простым таймером.
Код:
unit Unit3;

interface

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

type
  TForm1 = class(TForm)
    RollButton: TButton;
    UnRollButton: TButton;
    Panel1: TPanel;
    Timer1: TTimer;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure RollButtonClick(Sender: TObject);
    procedure UnRollButtonClick(Sender: TObject);
  private
    nRollDirection  : integer;
    MaxPanelHeight  : cardinal;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
    nRollDirection      := 0;
    MaxPanelHeight      := 300;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
    if nRollDirection <> 0 then begin
        if nRollDirection > 0 then begin
            if Panel1.ClientHeight <= MaxPanelHeight - 10 then begin
                Panel1.ClientHeight := Panel1.ClientHeight + 20;
            end
            else nRollDirection := 0;
        end
        else begin
            if Panel1.ClientHeight >= 20 then begin
                Panel1.ClientHeight := Panel1.ClientHeight - 20;
            end
            else nRollDirection := 0;
        end
    end;
    if nRollDirection = 0 then Timer1.Enabled := false;
end;

procedure TForm1.RollButtonClick(Sender: TObject);
begin
    nRollDirection := -1;
    Timer1.Enabled := true;
end;

procedure TForm1.UnRollButtonClick(Sender: TObject);
begin
    nRollDirection := 1;
    Timer1.Enabled := true;
end;

end.

Последний раз редактировалось B_N; 16.04.2008 в 19:32.
B_N вне форума Ответить с цитированием
Старый 16.04.2008, 21:35   #54
SkAndrew
Форумчанин
 
Регистрация: 05.04.2008
Сообщений: 244
По умолчанию

Спасибо всем.
Один последний вопрос:

есмли прервать во время выполнения эту функцию, то компилятор выдает ошибку.
Как можно перехватить прерывание и правильно записать код
, чтобы правильно прервать выполнение функции (что добавить):

var
Form1 : TForm1;
IsMin : Boolean;

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

implementation

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 < 570) and (Panel1.Height + rd < 306) do
begin
Panel1.Height := Panel1.Height + rd;
Panel1.Width := Panel1.Width + rd;
Sleep(10);
end;
IsMin := not IsMin;
Result := 0;
end;

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

Цитата:
Сообщение от SkAndrew Посмотреть сообщение
есмли прервать во время выполнения эту функцию, то компилятор выдает ошибку.
Как можно перехватить прерывание и правильно записать код
, чтобы правильно прервать выполнение функции (что добавить):
Как Вы её прерываете во время выполнения?
Какую ошибку? Компялитор не имеет отношения к ошибкам времени выполнения.
Что Вы понимаете под "перехватом прерывания"? Обычно под этим понимается абсолютно другое действие.
B_N вне форума Ответить с цитированием
Старый 16.04.2008, 22:59   #56
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

В смысле если до полного сворачивания нажать обратно?

Поигрались и хватит, советую отложить потоки в сторону и использовать таймер, как уже сказали использование потоков тут не оправдано. Код усложняется, кол-во вопросов (от вас) и ошибок (программы) увеличивается.
Интервал таймера 10 соответствует функции Sleep(10).
С таймером передача любых параметров в функцию не вызовет никаких проблем.
Код:
procedure TForm1.Timer1Timer(Sender: TObject);  
begin  
function ВашаФункция(параметры);
end;
p.s. По моему вы все время не упрощаете код, а усложняете.
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 вне форума Ответить с цитированием
Старый 17.04.2008, 00:57   #57
SkAndrew
Форумчанин
 
Регистрация: 05.04.2008
Сообщений: 244
По умолчанию

Я имел в виду если при сворачивании или разворачивании формы просто закрыть форму (до момента окончания действия), то компилятор выдает ошибку неправильного чтения какого-то адреса. извините, но мне хотелось бы для себя понять и эту причину перед тем как поставить точку в данном исследовании решения поставленной задачи. спасибо всем за ответы и помощь.
SkAndrew вне форума Ответить с цитированием
Старый 17.04.2008, 01:36   #58
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Цитата:
просто закрыть форму (до момента окончания действия)
Нужно просто контролировать некий флажок, сигнализирующий об окончании работы функции, и только в случае успешной установки этого флажка переходить к собственно Form.Close или Application.Terminate.
mihali4 вне форума Ответить с цитированием
Старый 17.04.2008, 01:48   #59
SkAndrew
Форумчанин
 
Регистрация: 05.04.2008
Сообщений: 244
По умолчанию

Спасибо, все вопросы решены. огромное спасибо всем за помощь, поддержку и терпение.
SkAndrew вне форума Ответить с цитированием
Старый 25.07.2011, 00:11   #60
ierecumi
 
Регистрация: 28.05.2010
Сообщений: 9
Хорошо

Я вместо Panel1 использовал GroupBox1.
Но у меня всё работает.
Изначально параметр Visible поставь в False.
Для пущего лоска я ещё свойство Aling поставил в alLeft.
GroupBox1 растянулся вдоль левого борта.


Код:
procedure TForm1.Button2Click(Sender: TObject);
begin
  AnimateWindow(GroupBox1.handle, 600, AW_HOR_POSITIVE or AW_SLIDE or AW_ACTIVATE);
  GroupBox1.Show
end;
А чтобы закрыть кинь Батон на GroupBox1 и впиши в onClicK

Код:
procedure TForm1.Button2Click(Sender: TObject);
begin
  GroupBox1.Hide
end;
Плавного закрытия не будет. Но панель исчезнет.
А если тебе надо чтобы с правого борта вылазила, то замени
AW_HOR_POSITIVE на AW_HOR_NEGATIVE - Справа налево. В комбинации с AW_CENTER или AW_HIDE не использовать.

Вот ещё несколько направлений:
AW_VER_POSITIVE - Сверху вниз.В комбинации с AW_CENTER или AW_BLEND не использовать.
AW_VER_NEGATIVE - Снизу вверх.


Вот посмотри вложение там всё работает.
А благодаря Caption у GroupBox'ов ты всегда будешь видеть назначение у панэльки!!!
Фу вроде всё!
Вложения
Тип файла: rar OpenPanelInForm.rar (163.8 Кб, 39 просмотров)
ierecumi вне форума Ответить с цитированием
Ответ


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