Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.03.20;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.005 c
4-1246533531
ruben
2009-07-02 15:18
2011.03.20
Не вызываются события при работе с tapi


2-1293449561
сергей2010
2010-12-27 14:32
2011.03.20
Удаление записей из файла


10-1136992618
nastya
2006-01-11 18:16
2011.03.20
сделать activex


2-1293141411
adigozelov
2010-12-24 00:56
2011.03.20
IP address user


15-1291197987
Jacksotnik
2010-12-01 13:06
2011.03.20
Создание инсталятора





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский