Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Много действий на одну кнопку(постраничная навигаци) Delphi7

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

Ugnetatel

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте подскажите пожалуйста решение, я новенький и решить задачу самому не получилось.
Очень долго мучился, но так и не вышло. (
 
В общем есть две кнопки Button1(Имя: << Назад ), Button2(Имя: Вперед >>) и десять GroupBox(GroupBox1, GroupBox2, GroupBox3..).
 
GroupBox1 - по умолчанию виден, все остальные скрыты.
 
Как сделать чтобы щелкая по кнопке Button2(Имя >>)  один раз -  sGroupBox2.Visible:= true и sGroupBox1.Visible:= false; Второй раз щелкаем - sGroupBox3.Visible:= true и sGroupBox2.Visible:= false; и т.д.
 
А по кнопке Button1(Имя <<), происходил обратный отсчёт с текущего GroupBox.
 
Всего предполагается 100 GroupBox-ов, я не знаю как записать даже по простому, а если пример будет и сжатый, то расцелую Вас.  

Всего записей: 31 | Зарегистр. 06-01-2014 | Отправлено: 19:04 15-02-2014
IJCuper



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Ну примерно вот так можно сделать

Код:
type
  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    GroupBox2: TGroupBox;
    GroupBox3: TGroupBox;
    GroupBox4: TGroupBox;
    GroupBox5: TGroupBox;
    GroupBox6: TGroupBox;
    btnNext: TButton;
    btnPrev: TButton;
    procedure btnNextClick(Sender: TObject);
    procedure btnPrevClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
Const
  MaxGroupBoxNum = 6;
  PrefixGroupBox = 'GroupBox';
var
  Form1: TForm1;
  ActiveGroupBox: Word = 1;
implementation
 
{$R *.dfm}
 
procedure TForm1.btnNextClick(Sender: TObject);
Var
  GroupBox: TComponent;
begin
  GroupBox := FindComponent(PrefixGroupBox + IntToStr(ActiveGroupBox));
  (GroupBox as TGroupBox).Visible := False;
  If ActiveGroupBox = MaxGroupBoxNum
    then ActiveGroupBox := 1
    else Inc(ActiveGroupBox);
  GroupBox := FindComponent(PrefixGroupBox + IntToStr(ActiveGroupBox));
  (GroupBox as TGroupBox).Visible := True;
end;
 
procedure TForm1.btnPrevClick(Sender: TObject);
Var
  GroupBox: TComponent;
begin
  GroupBox := FindComponent(PrefixGroupBox + IntToStr(ActiveGroupBox));
  (GroupBox as TGroupBox).Visible := False;
  If ActiveGroupBox = 1
    then ActiveGroupBox := MaxGroupBoxNum
    else Dec(ActiveGroupBox);
  GroupBox := FindComponent(PrefixGroupBox + IntToStr(ActiveGroupBox));
  (GroupBox as TGroupBox).Visible := True;
end;

На форме шесть GroupBox-ов и две кнопки.
Можно было бы написать компактнее, если механизм отображения и скрытия GroupBox-ов вынести в отдельную процедуру, но я думаю вы и сами с этим сможете справиться

Всего записей: 668 | Зарегистр. 07-07-2004 | Отправлено: 19:24 15-02-2014
Ugnetatel

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Спасибочки огромное, Вы просто СУПЕРРРРРРРРРРРРР!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
Только как сделать когда доходит до 6 или до 1 и продолжаешь жать в том же направлении, то перескакивает с 1 сразу на 6(даёт круг), т.е. меньше 1 и больше 6 жать нельзя.
 
Добавлено:
Ясно, а как сделать тоже самое только для AlphaControls,
 
там уже sGroupBox идет, я пробовал по вашему примеру дописывать s, но что-то не работает, пробовал перебором по разному.
 
Заранее спасибо за ответ.
 
Добавлено:
Переделал под AlphaConrols, всё работает:
 

Код:
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, sGroupBox, sButton, sSkinManager;
 
type
  TForm1 = class(TForm)
    sButton1: TsButton;
    sButton2: TsButton;
    sGroupBox1: TsGroupBox;
    sGroupBox2: TsGroupBox;
    sGroupBox3: TsGroupBox;
    sGroupBox4: TsGroupBox;
    sGroupBox5: TsGroupBox;
    sGroupBox6: TsGroupBox;
    sSkinManager1: TsSkinManager;
    procedure sButton2Click(Sender: TObject);
    procedure sButton1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
Const
  MaxGroupBoxNum = 6;
  PrefixGroupBox = 'sGroupBox';
var
  Form1: TForm1;
  ActiveGroupBox: Word = 1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.sButton2Click(Sender: TObject);
Var
  GroupBox: TComponent;
begin
  GroupBox := FindComponent(PrefixGroupBox + IntToStr(ActiveGroupBox));
  (GroupBox as TsGroupBox).Visible := False;
  If ActiveGroupBox = MaxGroupBoxNum
    then ActiveGroupBox := 1
    else Inc(ActiveGroupBox);
  GroupBox := FindComponent(PrefixGroupBox + IntToStr(ActiveGroupBox));
  (GroupBox as TGroupBox).Visible := True;
end;
 
procedure TForm1.sButton1Click(Sender: TObject);
Var
  GroupBox: TComponent;
begin
  GroupBox := FindComponent(PrefixGroupBox + IntToStr(ActiveGroupBox));
  (GroupBox as TsGroupBox).Visible := False;
  If ActiveGroupBox = 1
    then ActiveGroupBox := MaxGroupBoxNum
    else Dec(ActiveGroupBox);
  GroupBox := FindComponent(PrefixGroupBox + IntToStr(ActiveGroupBox));
  (GroupBox as TGroupBox).Visible := True;
end;
 
end.

 
Поправьте если есть где ошибки под AlphaControls.
 
 
IJCuper подскажи как убрать пролистывание с 6на1 и с1на6 (круг). И говори свой электронный кош.,  денежку кину за помощь.
выручил, класс.
 
 
 
Добавлено:
Исправьте
Код:
(GroupBox as TGroupBox).Visible := True; на (GroupBox as TsGroupBox).Visible := True;

Не заметил.
 
Возникла другая проблема: у меня 10 sGroupBox наложенных друг на друга, т.е.  

Код:
Const
MaxGroupBoxNum = 10;  

 
И происходит мерцание при смене false на true, как избежать этого?  
Решение нашел использовать Brig To Front и отказаться полностью от false на true(все по умолчанию показаны, перекрываются друг другом).  
Помогите с примером, пожалуйста, используется sButton и sGroupBox.
 
Как переделать этот пример под Brig To Front (без Visible := True и Visible := Falce).
Заранее преогромнейшее спасибо.

Всего записей: 31 | Зарегистр. 06-01-2014 | Отправлено: 20:05 15-02-2014
IJCuper



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Ugnetatel

Цитата:
как убрать пролистывание с 6на1 и с1на6 (круг).

ну у меня получилось вот так

Код:
 
procedure TForm1.sButton1Click(Sender: TObject);
Var
  GroupBox: TComponent;
begin
    GroupBox := FindComponent(PrefixGroupBox + IntToStr(ActiveGroupBox));
    (GroupBox as TsGroupBox).Visible := False;
    Dec(ActiveGroupBox);
    GroupBox := FindComponent(PrefixGroupBox + IntToStr(ActiveGroupBox));
    (GroupBox as TsGroupBox).Visible := True;
    sButton1.Enabled := not(ActiveGroupBox = 1);
    sButton2.Enabled := (ActiveGroupBox < MaxGroupBoxNum);
end;
 
procedure TForm1.sButton2Click(Sender: TObject);
Var
  GroupBox: TComponent;
begin
    GroupBox := FindComponent(PrefixGroupBox + IntToStr(ActiveGroupBox));
    (GroupBox as TsGroupBox).Visible := False;
    Inc(ActiveGroupBox);
    GroupBox := FindComponent(PrefixGroupBox + IntToStr(ActiveGroupBox));
    (GroupBox as TsGroupBox).Visible := True;
    sButton2.Enabled := not(ActiveGroupBox = MaxGroupBoxNum);
    sButton1.Enabled := (ActiveGroupBox > 1);
end;
 

Необходимо еще для кнопки '<<' (которая sButton1) в установить Enabled = False через Инспектор объектов.. Ну и само собой Visible=False для всех TsGroupBox-ов кроме первого
С AlphaControls не работал, но каких-то особенных свойств эти примеры не используют.Думаю должно работать.
 
Добавлено:
Ugnetatel

Цитата:
 И происходит мерцание при смене false на true, как избежать этого?  
Решение нашел использовать Brig To Front и отказаться полностью от false на true(все по умолчанию показаны, перекрываются друг другом).  
Помогите с примером, пожалуйста, используется sButton и sGroupBox.
 
Как переделать этот пример под Brig To Front (без Visible := True и Visible := Falce).
Заранее преогромнейшее спасибо.  

Не уверен что BringToFront здесь сработает лучше, мерцание будет зависеть от скорости прорисовки объектов внутри активируемого GroupBox-а.
Попробуйте такой код:

Код:
 
procedure TForm1.sButton1Click(Sender: TObject);
Var
  GroupBox: TComponent;
begin
    Dec(ActiveGroupBox);
    GroupBox := FindComponent(PrefixGroupBox + IntToStr(ActiveGroupBox));
    (GroupBox as TsGroupBox).BringToFront;
    sButton1.Enabled := not(ActiveGroupBox = 1);
    sButton2.Enabled := (ActiveGroupBox < MaxGroupBoxNum);
end;
 
procedure TForm1.sButton2Click(Sender: TObject);
Var
  GroupBox: TComponent;
begin
    Inc(ActiveGroupBox);
    GroupBox := FindComponent(PrefixGroupBox + IntToStr(ActiveGroupBox));
    (GroupBox as TsGroupBox).BringToFront;
    sButton2.Enabled := not(ActiveGroupBox = MaxGroupBoxNum);
    sButton1.Enabled := (ActiveGroupBox > 1);
end;
 

Да, здесь конечно Visible=True для всех TsGroupBox. И в конструкторе форм для первого TsGroupBox сделать Bring To Front, чтобы при запуске приложения он был самым верхним...

Всего записей: 668 | Зарегистр. 07-07-2004 | Отправлено: 21:54 15-02-2014 | Исправлено: IJCuper, 22:06 15-02-2014
Ugnetatel

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Код:
procedure TForm1.sButton1Click(Sender: TObject);
Var
  GroupBox: TComponent;
begin
    Dec(ActiveGroupBox);
    GroupBox := FindComponent(PrefixGroupBox + IntToStr(ActiveGroupBox));
    (GroupBox as TsGroupBox).BringToFront;
    sButton1.Enabled := not(ActiveGroupBox = 1);
    sButton2.Enabled := (ActiveGroupBox < MaxGroupBoxNum);
end;
 
procedure TForm1.sButton2Click(Sender: TObject);
Var
  GroupBox: TComponent;
begin
    Inc(ActiveGroupBox);
    GroupBox := FindComponent(PrefixGroupBox + IntToStr(ActiveGroupBox));
    (GroupBox as TsGroupBox).BringToFront;
    sButton2.Enabled := not(ActiveGroupBox = MaxGroupBoxNum);
    sButton1.Enabled := (ActiveGroupBox > 1);
end;  

 
На вторую кнопку можно: SendToBack
 
Компилируется хорошо, но при нажатии выскакивает ошибка:
Project Project1.exe raised exception class EAcessViolation with message 'Access violation at adress 004036b6 in module 'Project1.exe'. Read of address 00000000'. Process stopped. Use Step or Run to continue.
 
И скажите электронный кошелек, денежку положу.
 
Добавлено:
Прошу прощения, говорите Ваш числовой пополнитель
 
Всё работает на Ура.
 

Код:
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, sGroupBox, sButton;
 
type
  TForm1 = class(TForm)
    sButton1: TsButton;
    sButton2: TsButton;
    sGroupBox1: TsGroupBox;
    sGroupBox2: TsGroupBox;
    sGroupBox3: TsGroupBox;
    sGroupBox4: TsGroupBox;
    sGroupBox5: TsGroupBox;
    sGroupBox6: TsGroupBox;
    procedure sButton1Click(Sender: TObject);
    procedure sButton2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
Const
  MaxGroupBoxNum = 6;
  PrefixGroupBox = 'sGroupBox';
 
var
  Form1: TForm1;
  ActiveGroupBox: Word = 1;  
 
implementation
 
{$R *.dfm}
 
procedure TForm1.sButton1Click(Sender: TObject);
Var
  GroupBox: TComponent;
begin
    Dec(ActiveGroupBox);
    GroupBox := FindComponent(PrefixGroupBox + IntToStr(ActiveGroupBox));
    (GroupBox as TsGroupBox).BringToFront;
    sButton1.Enabled := not(ActiveGroupBox = 1);
    sButton2.Enabled := (ActiveGroupBox < MaxGroupBoxNum);
end;
 
procedure TForm1.sButton2Click(Sender: TObject);
Var
  GroupBox: TComponent;
begin
    Inc(ActiveGroupBox);
    GroupBox := FindComponent(PrefixGroupBox + IntToStr(ActiveGroupBox));
    (GroupBox as TsGroupBox).BringToFront;
    sButton2.Enabled := not(ActiveGroupBox = MaxGroupBoxNum);
    sButton1.Enabled := (ActiveGroupBox > 1);
end;
 
 
end.

 
И ещё: вот когда пролистываешь до конца, кнопка гаснет, можно это как-то избежать, чтобы она была такой же и не гасла как у Вас в примере(для дизайна просто нужно).

Всего записей: 31 | Зарегистр. 06-01-2014 | Отправлено: 22:33 15-02-2014
IJCuper



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Ugnetatel

Цитата:
 На вторую кнопку можно: SendToBack  

Не думаю, что это будет верный шаг. Здесь надо будет аккуратно следить за порядком GroupBox-ов при конструировании формы приложения - неудобно.. Чуть проще вытаскивать на верхний уровень нужный GroupBox, не обращая внимания на порядок расположения всех остальных.

Цитата:
но при нажатии выскакивает ошибка:
Project Project1.exe raised exception class EAcessViolation

чуть побольше информации хотелось бы - при нажатии на какую кнопку - '<<' или '>>', какой из GroupBox-ов отображается, какое значение у переменной ActiveGroupBox?  
Я не зря писал о необходимости:

Цитата:
 Необходимо еще для кнопки '<<' (которая sButton1) в установить Enabled = False  

поскольку нажатие на нее приведет к попытке применить BringToFront к TsGroupBox с номером 0, которого нет в природе, здесь вполне может появится ошибка такого вида, как вы процитировали.
Загляните еще в личные сообщения
 
 
Добавлено:

Цитата:
 И ещё: вот когда пролистываешь до конца, кнопка гаснет, можно это как-то избежать, чтобы она была такой же и не гасла как у Вас в примере(для дизайна просто нужно).

Можно, отчего же нельзя.. Тогда обернуть мероприятия, связанные с BringToFront в условный оператор.
У меня получилось что-то такое:

Код:
 
procedure TForm1.sButton1Click(Sender: TObject);
Var
  GroupBox: TComponent;
begin
    if ActiveGroupBox > 1 then begun
      Dec(ActiveGroupBox);
      GroupBox := FindComponent(PrefixGroupBox + IntToStr(ActiveGroupBox));
      (GroupBox as TsGroupBox).BringToFront;
    end;
end;
 
procedure TForm1.sButton2Click(Sender: TObject);
Var
  GroupBox: TComponent;
begin
  if ActiveGroupBox < MaxGroupBoxNum then
  begin
    Inc(ActiveGroupBox);
    GroupBox := FindComponent(PrefixGroupBox + IntToStr(ActiveGroupBox));
    (GroupBox as TsGroupBox).BringToFront;
  end;
end;  
 

Ну или поместить все в защищенный блок типа try...finally - дело вкуса..

Всего записей: 668 | Зарегистр. 07-07-2004 | Отправлено: 22:59 15-02-2014
Ugnetatel

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Я же только учусь, 3дня над этим парился))
 
Вот бестолковщина.

Всего записей: 31 | Зарегистр. 06-01-2014 | Отправлено: 23:06 15-02-2014 | Исправлено: Ugnetatel, 00:14 16-02-2014
IJCuper



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Почитайте мой пост выше - примерно в одно время написали, и я дал все ответы и комментарии по поводу ошибки и "неугасания" кнопки в крайних случаях.  
P.S. вверху страницы есть ссылка "Личный ящик" - отправил вам письмецо

Всего записей: 668 | Зарегистр. 07-07-2004 | Отправлено: 23:09 15-02-2014 | Исправлено: IJCuper, 23:10 15-02-2014
Ugnetatel

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Этот пост можно смело заносить в идеальные Уроки: Создание постраничной навигации или Выпадающего меню с использованием как стандартных функций, так и AlphaConrols.  
Delphi 7

Всего записей: 31 | Зарегистр. 06-01-2014 | Отправлено: 23:11 15-02-2014 | Исправлено: Ugnetatel, 23:12 15-02-2014
IJCuper



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Цитата:
Этот пост можно смело заносить в идеальные Уроки: Создание постраничной навигации или Выпадающего меню..  

На вкус и цвет фломастеры разные.. Мне больше нравится вариант, когда кнопка отключается при достижении крайнего положения, а не просто игнорирует нажатие.  
У вас задача изначально не очень подробно была расписана, возможно есть и более простые способы добиться желаемого.

Всего записей: 668 | Зарегистр. 07-07-2004 | Отправлено: 23:15 15-02-2014 | Исправлено: IJCuper, 14:32 16-02-2014
Ugnetatel

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Всё: замечание принял во внимание.
Огромное спасибо за Ваш труд.
 
Добавлено:
Вот всё идеально, только мне ещё вот что нужно:
(Для полного комплекта так сказать).
 
У меня панель кнопок находится в sPanel - это тоже, что и sGroupBox и сама панель лежит на
sGroupBox(так было с true falce).
 
А когда я переключаю, то кнопки перекрываются, а вынести за пределы sGroupBox -  
дизайн жутко портится, можно сделать BringToFront как сделано и после прибавить ещё BringToFront для sPanel, т.е. sPanel оказывается всегда на 1месте, а sGroupBox на 2.
 
Пока писал, уже решил:  

Код:
(GroupBox as TsGroupBox).BringToFront;
Нужно сделать:
(GroupBox as TsGroupBox).BringToFront;
 Добавляем sPanel1.BringToFront;
 

 
Теперь sPanel1 - всегда на верху.

Всего записей: 31 | Зарегистр. 06-01-2014 | Отправлено: 23:32 15-02-2014 | Исправлено: Ugnetatel, 00:38 16-02-2014
Chukotka

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Не проще было разместить все на PageControl'e у которого скрыты закладки (Tabs) - тогда все шаманство будет в изменении свойства ActivePageIndex?

Всего записей: 428 | Зарегистр. 01-11-2006 | Отправлено: 04:44 22-02-2014
IJCuper



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Chukotka
дык как топикстартер задачу сформулировал, так ее и решали...  
возможно при смене tab-ов будет мерцание при прорисовке если объектов много

Всего записей: 668 | Зарегистр. 07-07-2004 | Отправлено: 12:29 22-02-2014
xpin2013



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
IJCuper
Против мерцаний помогают  LockWindow(Handle) и Repaint по вкусу.

Всего записей: 291 | Зарегистр. 16-01-2014 | Отправлено: 12:54 22-02-2014
Chukotka

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
IJCuper

Цитата:
дык как топикстартер задачу сформулировал, так ее и решали...  

Понятно, но имхо мой вариант на порядок проще и кроме того, позволяет спокойно добавлять страницы и не заботиться о нумерации GroupBox'ов

Цитата:
возможно при смене tab-ов будет мерцание при прорисовке если объектов много

imho разница между скрытием\показом GroupBox и активацией PageControl'а минимальна

Всего записей: 428 | Зарегистр. 01-11-2006 | Отправлено: 02:20 23-02-2014
saidumar

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Chukotka
Согласен, так и просится использовать Page Control

Всего записей: 92 | Зарегистр. 10-04-2011 | Отправлено: 17:22 05-03-2014
GeXamin



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
так и просится использовать Page Control

В своих проектах так же используем TabbedNotebook, TNotebook.

Всего записей: 131 | Зарегистр. 07-09-2006 | Отправлено: 11:20 15-05-2014
TechnoDreamer

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Тоже хотел написать про PageControl, через GroupBox какое то извращение. Я надеюсь эти 100 групбоксов создаются программно?

Всего записей: 259 | Зарегистр. 01-06-2008 | Отправлено: 00:27 19-05-2014
IJCuper



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
TechnoDreamer
судя по фрагментам кода, которые кидал в личку топикстартер - все компоненты размещены ручками..
автор вопросов ушел, возможно появится еще, ответит

Всего записей: 668 | Зарегистр. 07-07-2004 | Отправлено: 22:22 19-05-2014
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Много действий на одну кнопку(постраничная навигаци) Delphi7


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru