Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Удаление компонент, которые созданы в процессе 
:(
    Опции темы
DeepPurple
Дата 19.5.2009, 02:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 13.5.2009

Репутация: нет
Всего: нет



вот такая вот проблема возникла:
одна кнопка создает кнопки которые добавляются в динамический массив.
необходимо чтобы по нажатию каждой кнопки она удаляла сама себя, и, допустим, чекбокс с таким же св-вом Tag.
при создании кнопки указываю
TButton(New).OnClick:=OnClickButton;
 а вот что написать в процедуре онклик никак придумать не могу. ведь когда мы пишем кнопки еще не созданы и дестроить нечего.
да еще и вдобавок свойства кнопки которая только что была нажата не могу использовать. соответственно и другой компонент удалить сложно(чекбокс тоже создается в процессе)



2й вопрос такой. необходимо по нажатию на кнопку привязать панель к скролл боксу и на панели создать едит например. я использовал такую процедуру:
Код

procedure TfmMain.Button6Click(Sender: TObject);
var pnl:TPanel;  rrr:TEdit;
begin

  pnl:=TPanel.Create(nil);
  pnl.Name := 'Panel' + IntToStr(y);
  pnl.left := sbAnswer.Left+8 ;
  pnl.Top := sbAnswer.Top + x;
  pnl.Parent := sсollboxAnswer2;
  x:=x+60;
  y:=y+1;

  rrr := TEdit.Create(nil);
  rrr.Name := 'TEdit' + IntToStr(z);
  rrr.Left := pnl.Left+32;
  rrr.Top := pnl.Top+x+16;
  rrr.Text := '';
  rrr.Parent := pnl;

end;


панель создается на скроллбоксе а эдит нет. буду рад конструктивным ответам smile 
PM MAIL   Вверх
Демо
Дата 19.5.2009, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 7
Всего: 50



Цитата(DeepPurple @  19.5.2009,  02:31 Найти цитируемый пост)
необходимо чтобы по нажатию каждой кнопки она удаляла сама себя,


Код

unit Unit1;

interface

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

const
  WM_CLICKBN=WM_USER+1;

type

  TButtonArray=packed array of TButton;

  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    procedure ButtonClick(Sender: TObject);
    procedure WMCLICKBN(var M: TMessage); message WM_CLICKBN;
  end;

var
  Form1: TForm1;
  BA: TButtonArray;

implementation

{$R *.dfm}


procedure TForm1.ButtonClick(Sender: TObject);
begin
  PostMessage(Form1.Handle,WM_CLICKBN,Integer(Sender),0);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  for i := 0 to 5 do
  begin
    SetLength(BA,Length(BA)+1);
    BA[High(BA)] := TButton.Create(nil);
    BA[High(BA)].OnClick := ButtonClick;
    BA[High(BA)].Width := 50;
    BA[High(BA)].Left := 20+(High(BA)*50);
    BA[High(BA)].Top := 100;
    BA[High(BA)].Caption := 'Button'+IntToStr(High(BA));
    BA[High(BA)].Parent := Form1;
    BA[High(BA)].Visible := True;
  end;

end;

procedure TForm1.WMCLICKBN(var M: TMessage);
var
  bn: TButton;
  i: Integer;
begin
  bn := TButton(M.WParam);
  if not (bn is TButton) then Exit;
  for i := 0 to High(BA)-1 do
  begin
    if BA[i]=bn then
    begin
      Move(BA[i+1],BA[i],SizeOf(TButton)*(High(BA)-i));
      Break;
    end;
  end;
  SetLength(BA,High(BA));
  FreeAndNil(bn);

end;

end.


Добавлено через 4 минуты и 22 секунды
Цитата(DeepPurple @  19.5.2009,  02:31 Найти цитируемый пост)
панель создается на скроллбоксе а эдит нет. буду рад конструктивным ответам   


У тебя TEdit уходит за пределы панели.

Код

  rrr.Left := 32;
  rrr.Top := 16;



--------------------
    
PM MAIL ICQ Skype   Вверх
DeepPurple
Дата 20.5.2009, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 13.5.2009

Репутация: нет
Всего: нет



большое спасибо за ответ, это действительно работает, но мой мозг взрывается при попытки его модифицировать smile 
у меня возникли некоторые вопросы
1) в чем хитрость этой операции?
Код

  Move(BA[i+1],BA[i],SizeOf(TButton)*(High(BA)-i));
      Break;



2) ни как не могу понять (а хотелось бы) принцип действия вот этого, да и вообще зачем мы в процедуре просто делаем ссылку на другую процедуру оО:
Код

  PostMessage(Form1.Handle,WM_CLICKBN,Integer(Sender),0);

и почему мы не пишем все остальное в онклик?

3) что за свойство handle? к сожалению хелпер мало чего обьяснил.


Искренне буду рад если ответите)

Это сообщение отредактировал(а) DeepPurple - 20.5.2009, 00:13
PM MAIL   Вверх
Демо
Дата 20.5.2009, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 7
Всего: 50



[quote=DeepPurple, 20.5.2009,  00:10, post1872804]1) в чем хитрость этой операции?

Код

  Move(BA[i+1],BA[i],SizeOf(TButton)*(High(BA)-i));
      Break;[/quote]


Ссылка на удаляемую кнопку может находиться в середине массива.
В этом случае мы удаляем не элемент внутри массива, а последний.
Но для этого переносим все элементы конца массива на одну позицию ближе к началу.


Цитата(DeepPurple @  20.5.2009,  00:10 Найти цитируемый пост)
2) ни как не могу понять (а хотелось бы) принцип действия вот этого, да и вообще зачем мы в процедуре просто делаем ссылку на другую процедуру оО


Цитата(DeepPurple @  20.5.2009,  00:10 Найти цитируемый пост)
PostMessage(Form1.Handle,WM_CLICKBN,Integer(Sender),0);


Цитата(DeepPurple @  20.5.2009,  00:10 Найти цитируемый пост)
и почему мы не пишем все остальное в онклик?


Так как из самого метода класса (в обрабочике OnClick) нельзя удалить  экземпляр этого класса, мы говорим сделать это другому объекту - в данном случае форме.



Цитата(DeepPurple @  20.5.2009,  00:10 Найти цитируемый пост)
3) что за свойство handle? к сожалению хелпер мало чего обьяснил.


Так как форма - это лишь над стройка над окнами Windows, то для использования функций WInAPI32 нужно знать Handle - дескриптор окна.
TForm.Handle как раз и является таким дескриптором.


--------------------
    
PM MAIL ICQ Skype   Вверх
kami
Дата 20.5.2009, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 22
Всего: 72



Цитата(Демо @  19.5.2009,  12:37 Найти цитируемый пост)
TButtonArray=packed array of TButton;

гхм...
может, лучше TList?
PM MAIL WWW   Вверх
Демо
Дата 20.5.2009, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 7
Всего: 50



Цитата(kami @  20.5.2009,  12:57 Найти цитируемый пост)
гхм...
может, лучше TList? 


Да в принципе без разницы.
Плюсы и минусы есть и в одном, и в другом случае-)


--------------------
    
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0497 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.