Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.03.20;
Скачать: CL | DM;

Вниз

Непонятка с копонентом   Найти похожие ветки 

 
nza   (2010-12-23 18:28) [0]

Пытаюсь написать компонент, Striggrid c кнопками
Кнопки это динамич. массив. (FBtns). Кнопки удаляються при нажатии на них (OnBtClick).
проблема возникает когда я пытаюсь удалить последнюю кнопку масива
Вот так удаляю:

procedure TButtonGrid.OnBtClick(Sender: TObject);
 begin
if sender = TSpeedButton(sender) then   BtnDelete;
end;

procedure TButtonGrid.BtnDelete;
 var ln:integer;
 begin
 Ln:=Length(FBtns)-1 ;
 FBtns[ln].Free;
 SetLength(FBtns,ln);
 end;


Пожалйсята помогите разобраться


 
nza   (2010-12-23 18:29) [1]

При попытке удалить послед кнопку возникает ошибка памяти


 
KilkennyCat ©   (2010-12-23 18:46) [2]

код создания массива кнопок?


 
nza   (2010-12-23 18:57) [3]

Массив кнопок
procedure TButtonGrid.AddButton;    
 var ln:integer;
 begin
   ln:= Length(Fbtns);
   SetLength(FBtns,ln+1);
   FBtns[ln]:=TSpeedbutton.Create(self);
   FBtns[ln].Parent:=self;
   FBtns[ln].Height:=FGrid.DefaultRowHeight;
   FBtns[ln].Width :=50;
   FBtns[ln].Flat:=true;
   FBtns[ln].Caption:=inttostr(ln);
   FBtns[ln].Tag:=ln;
   FBtns[ln].OnClick:=OnBtClick;
   ButtonPosition (ln,Fbtns[ln]);
end;


положение кнопок

procedure TButtonGrid.ButtonPosition(index:integer; button:TSpeedButton);
 var h:integer;
 begin
 h:=FGrid.GridLineWidth+FGrid.DefaultRowHeight;
 button.Top:=h*index+FGrid.Top+1 ;
 button.Left:=Fgrid.Width+5;
end;


 
nza   (2010-12-23 18:59) [4]

FGrid это Tstringgrid


 
Palladin ©   (2010-12-23 19:02) [5]


> if sender = TSpeedButton(sender)

а ты этим чего сказать хотел?


 
KilkennyCat ©   (2010-12-23 19:02) [6]

индекс самой первой кнопки чему равен?


 
KilkennyCat ©   (2010-12-23 19:03) [7]


> Palladin ©   (23.12.10 19:02) [5]

что именно его, а не чья-то чужая кнопка :)


 
Palladin ©   (2010-12-23 19:06) [8]

угу

function IsValueTrue(value: Boolean): Boolean;
begin
  if value = true then
    result := true
  else if value = false then
    result := false
  else
   raise Exception.Create("Ошибка определения значения");
end;


 
nza   (2010-12-23 19:12) [9]


> индекс самой первой кнопки чему равен?


procedure TButtonGrid.AddButton;    
var ln:integer;
begin
  ln:= Length(Fbtns);
  SetLength(FBtns,ln+1);
  FBtns[ln]:=TSpeedbutton.Create(self);


Индекс первой кнопки = 0


> а ты этим чего сказать хотел?

procedure TButtonGrid.OnBtClick(Sender: TObject);
begin
  BtnDelete;
end;


 
_Юрий   (2010-12-23 19:32) [10]

Не надо удалять компонент из его собственного обработчика.
Используйте механизм PostMessage


 
nza   (2010-12-23 19:39) [11]


> Не надо удалять компонент из его собственного обработчика.
> Используйте механизм PostMessage

Но почему возникает ошибка только при удалении послед. кнопке?

А какие параметры следует указать для PostMessge в моем примере?


 
_Юрий   (2010-12-23 19:56) [12]

Это неустойчивая ошибка, может возникать а может не возникать

по поводу PostMessage: отправляем кастом сообщение (например, WM_USER + 1) на хендл формы вместо того, чтобы вызывать Btn.Free.

например в LParam сообщения передаем ссылку на кнопку.
А разрушаем ее уже в обработчике сообщения.
То есть получается нечто типа отложенного разрущения - текущий обработчик завершается, окно начинает обрабатывать сообщения дальше, получает ваше, и разрушает кнопку
Код надо приводить?

ЗЫ. В данном случае проблема кстати может быть и не только в этом, больно уж кривой код


 
_Юрий   (2010-12-23 19:57) [13]

В данном случае формы нет, поэтому отправлять надо на собственный Handle


 
nza   (2010-12-23 20:11) [14]


> Код надо приводить?


А какой модуль нужно подключить для postmessage?

Можете помочь с кодом?


 
_Юрий   (2010-12-23 20:17) [15]

uses
 Windows, Messages;

const
 UM_DELETE_BTN = WM_USER + 1
type
  TButtonGrid = class(...)
  private
   procedure DoDeleteBtn(var M: TMessage); message UM_DELETE_BTN;

procedure TButtonGrid.DoDeleteBtn(var M: TMessage);
begin
 TButton(M.LParam).Free;
end;

Удаление:
var
 Btn: TButton;

PostMessage(Handle, UM_DELETE_BTN, 0, LParam(Btn));


 
nza   (2010-12-23 20:22) [16]

Огромное спасибо буду пробовать


 
nza   (2010-12-23 21:10) [17]

Сделал получилось :)



Страницы: 1 вся ветка

Текущий архив: 2011.03.20;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.017 c
1-1249200301
Ruzzz
2009-08-02 12:05
2011.03.20
Создание полупрозрачного компонента


2-1292942706
Gu
2010-12-21 17:45
2011.03.20
Ускорить прокрутку Listview


1-1249031018
Scyth
2009-07-31 13:03
2011.03.20
Отображения объектов DLL по ссылкам


15-1290453194
ProgRAMmer Dimonych
2010-11-22 22:13
2011.03.20
Книга по ADO для не совсем чайника


15-1291469704
xayam
2010-12-04 16:35
2011.03.20
Трансляция шахматных партий