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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.10.2011, 14:17   #1
medved6216
Пользователь
 
Регистрация: 28.10.2009
Сообщений: 56
По умолчанию создание динамических объектов

В голове каша сейчас. не могу разобраться. Вот код
Код:
var
pp : TsPanel;

procedure TForm1.panel;
var
panel : TsPanel;
exit : TsSpeedButton;
begin
Doska:= TsPanel.Create(Form1);
with Doska do
  begin
  parent := form1;
  //AutoSize := True;
  name := 'doska';
  hint := 'Panel';
  showhint := false;
  caption := '';
  end;
Exit := TsSpeedButton.Create(Doska);
with Exit do
  begin
  parent:= Doska;
  Images  := sAlphaImageList1;
  ImageIndex := 2;
  OnClick := MinimazingPanel;
  left := Doska.Width - 25;
  //align := alBottom;
  end;
end;

procedure TForm1.MinimazingPanel(Sender: TObject);
var
BitBtn : TsBitBtn;
begin
BitBtn := TsBitBtn.Create(PanelTop);
with BitBtn do
  begin
  parent := PanelTop;
  left := buttonExit.Width + 10;
  name := (TControl(Sender).Parent as TsPanel).name;
  caption := (TControl(Sender).Parent as TsPanel).Hint;
  OnMouseUp := ButtonDestroy;
  end;
  pp:= (TControl(Sender).Parent as TsPanel);
showWindow((TControl(Sender).Parent as TsPanel).Handle,sw_hide);
end;

procedure TForm1.ButtonDestroy(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
(Sender as TsBitBTN).Visible := false;
ShowWindow(pp.Handle,sw_show);
(Sender as TsBitBTN).Destroy;
end;
Нужно свернуть форму(panel) и создать кнопку(BitBtn) на панели (PanelTop) для разворачивания её. Хочу использовать procedure TForm1.MinimazingPanel(Sender: TObject); и для сворачиванию других панелей(даже когда сворачиваю несколько панель), должны появляться и другие кнопки (т.е. BitBtn : array[0..99] of TsBitBtn; ), для разворачивание использую клик по этой кнопки через переменную (pp), для того чтобы загонять туда панели нужно тоже сделать массив (pp : array[0..99] of TsPanel; )
Как мне реализовать это?

Последний раз редактировалось mihali4; 28.10.2011 в 18:03.
medved6216 вне форума Ответить с цитированием
Старый 28.10.2011, 16:39   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

каждая кнопка должна знать "свою" панель. Для это можно использовать ЕЁ свойство (Tag)
Код:
with BitBtn do
  begin
  parent := PanelTop;
  left := buttonExit.Width + 10;
  name := (TControl(Sender).Parent as TsPanel).name;
  caption := (TControl(Sender).Parent as TsPanel).Hint;
  OnMouseUp := ButtonDestroy;
 
  tag:=integer(Tcontrol(sender).Parent); //теперь она "знает свою панель"

  end;
и когда нажимаем достаем и используем
Код:
panel:=TsPanel( (sender as TbitBtn).tag );  //достали панель из нажатой кнопки (sender)
и дальше делаем что надо.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 28.10.2011 в 16:44.
evg_m на форуме Ответить с цитированием
Старый 31.10.2011, 10:52   #3
medved6216
Пользователь
 
Регистрация: 28.10.2009
Сообщений: 56
По умолчанию

evg_m, спасибо за такой способ) Я другой нашел с большем количеством кода)) Просто дома интернета нет, а решение пришло за ужином в субботу)) Ввел новые переменные numA, numB : Integer = 0 .
Код:
with BitBtn do
  begin
  parent := PanelTop;
  left := buttonExit.Width + 10;
  name := (TControl(Sender).Parent as TsPanel).name;
  caption := (TControl(Sender).Parent as TsPanel).Hint;
  OnMouseUp := ButtonDestroy;
  end;
  NumA := NumA + 1;
  pp[NumA]:= (TControl(Sender).Parent as TsPanel);
showWindow((TControl(Sender).Parent as TsPanel).Handle,sw_hide);
procedure TForm1.ButtonDestroy(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
btn : TsBitBTN;
begin
btn := (Sender as TsBitBTN);
maximaze(BTN)
end;

Procedure Form1.Maximaze(var But : TsBitBTN);
begin
if pp[numB] = nil then
begin
 numB := NumB+1;
 maximaze(But);
end
else
begin
 if pp[numB].name = But.Name then
 begin
  But.Visible := false;
  ShowWindow(pp[numB].Handle,sw_show);
  but.Destroy;
 end
else
 begin
  numB := NumB + 1;
  maximaze(But);
 end;
end;
Не могу что-то сейчас с кнопкой разобраться, чтобы она располагалась правее предыдущей)
Код:
numa := numa+1
name := 'button' + inttostr(numA);
  if numA > 1 then
  begin
  if  TButton(FindComponent('button'+inttostr(numA-1))) is TsBitBtn then
    begin
      left := buttonexit.Width + 10 + 5 +
      TsBitBtn(FindComponent('button'+inttostr(numA-1))).Left
      + TsBitBtn(FindComponent('button'+inttostr(numA-1))).Width;
    end;
  end
  else
  begin
  left := buttonexit.Width + 10;
  end;

Последний раз редактировалось mihali4; 01.11.2011 в 16:36.
medved6216 вне форума Ответить с цитированием
Старый 01.11.2011, 15:58   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

не загромождайте код длинными повторами для этого есть переменные.(локальные). код получится компактным и более понятным
Код:
  // зачем много (3 раза) искать одно и то же
  prevbutton:=TButton(FindComponent('button'+inttostr(numA-1)));
  // нашли разок и используй
  if prevbutton<>nil then // на всякий случай вдруг такой нет 
// на самом деле лишней на мой взгляд яляется проверка numA>1
  begin
    left := buttonexit.Width + 10 + 5 + //а теперь ответьте зачем здесь buttonexit.Width
// и от каого объекта свойство Left:=
            prevbutton.Left 
            + prevbutton.Width;
  end;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 01.11.2011 в 16:03.
evg_m на форуме Ответить с цитированием
Старый 01.11.2011, 17:55   #5
medved6216
Пользователь
 
Регистрация: 28.10.2009
Сообщений: 56
По умолчанию

17:55
evg_m, left - при создание кнопки равнение по левому краю. А buttonExit это стат кнопка) От неё уже идет построение)) Т.Е. её ширина + отступ 10 и на этом месте располагаем кнопку)) И ещё спасибо за помощь)

18:11
Код не подошел, он создает кнопку на одном месте
Код:
left := buttonexit.Width + 10;
Как будто кнопка не создана
Код:
if prevbutton <> nil then
хотя в var прописал
Код:
prevbutton : TsBitBtn;
18:13
Код:
BitBtn := TsBitBtn.Create(PanelTop);
numA := numA+1;
with BitBtn do
  begin
  visible := false;
  parent := PanelTop;
  name := 'button' + inttostr(numA);
  prevbutton := TsBitBtn(FindComponent('button'+inttostr(numA-1)));
  if prevbutton <> nil then
  begin
  left := buttonexit.Width + 10 + 5 + prevbutton.Left + prevbutton.Width;
  end
  else
  begin
  left := buttonexit.Width + 10;
  end;
  showhint := false;;
  top := buttonexit.Top;
  caption := (TControl(Sender).Parent as TsPanel).Hint;
  OnMouseUp := ButtonDestroy;
  tag:=integer(Tcontrol(sender).Parent);
  visible := true;
  end;
Красные жирные циферки видны ?
Это время, когда вы отправляли свои сообщения друг за другом, подряд.
Читаем правила раздела.
По правилам это приравнивается к флуду.

Последний раз редактировалось mihali4; 02.11.2011 в 01:23.
medved6216 вне форума Ответить с цитированием
Старый 02.11.2011, 09:43   #6
medved6216
Пользователь
 
Регистрация: 28.10.2009
Сообщений: 56
По умолчанию

Нашел решение)) Забыл указать где ищем))
Код:
prevbutton := TsBitBtn(PanelTop.FindComponent('button'+inttostr(numA-1)));
medved6216 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
События для динамических объектов fezilk25 Общие вопросы Delphi 3 05.10.2011 18:13
обработчик событий динамических объектов Vervolf Общие вопросы Delphi 2 17.01.2011 18:45
Удаление динамических объектов Jetro Общие вопросы Delphi 13 14.12.2010 16:39
Имя динамических объектов PVD Общие вопросы Delphi 26 09.02.2010 15:38
Процедуры для динамических объектов Fruit Общие вопросы Delphi 8 30.12.2008 21:10