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

Вниз

KOL TabControl Error   Найти похожие ветки 

 
Jon ©   (2009-05-25 15:31) [0]

I am experiencing a problem using TabControl. Here is a minimum program to demonstrate the bug:


program TabTest;

uses KOL;

var TabControl: PControl;

procedure btnCloseClick(Dummy: Pointer; Sender: PObj);
begin
 TabControl.TC_Delete(TabControl.CurIndex);
 TabControl.CurIndex := 0; // <--- Error!
end;

procedure btnNewClick(Dummy: Pointer; Sender: PObj);
var
 TabPage: PControl;
begin
 TabPage := TabControl.TC_Insert(TabControl.Count,Int2Str(TabControl.Count),0);
 with NewButton(TabPage,"Close")^ do
   OnClick := TOnEvent(MakeMethod(nil,@btnCloseClick));
 TabControl.CurIndex := TabControl.Count -1;
end;

begin
 Applet := NewForm(nil,"TabTest").SetSize(320,240);
 TabControl := NewTabControl(Applet,[""],[],nil,0).SetAlign(caClient);
 with NewButton(TabControl.Pages[0],"New")^ do
   OnClick := TOnEvent(MakeMethod(nil,@btnNewClick));
 Run(Applet);
end.


A runtime error occurs in the tab close procedure and is marked above.

Using Windows XP SP3, KOL 2.88, Delphi 7. No conditional defines, tried with PAS_VERSION too. Can anyone confirm?


 
Galkov   (2009-06-10 23:04) [1]

Владимир, есть такая фигня...

В своей "правленной" версии я обнаружил отличие в TControl.SetCurIndex, и отсутствие баги (AV при удалении последнего таба)
У меня это выглядит так:

{$IFDEF ASM_VERSION}
//[procedure TControl.SetCurIndex]
procedure TControl.SetCurIndex(const Value: Integer);
asm
       MOVZX    ECX, [EAX].fCommandActions.aSetCurrent
       JECXZ    @@set_item_sel
       PUSH     ECX            //+aSetCurrent
       PUSH     EAX            //+self
       PUSH     0
       PUSH     EDX
       PUSH     ECX
       PUSH     EAX
       CALL     Perform
       POP      EDX            //+self
       POP      ECX            //+aSetCurrent
       CMP      CX, TCM_SETCURSEL
       JNE      @@exit
       MOV      [EDX].fCurIndex,EAX
       PUSH     TCN_SELCHANGE  // NMHdr.code
       PUSH     EDX            // NMHdr.idfrom - doesn"t matter
       PUSH     [EDX].fHandle  // NMHdr.hwndFrom
       PUSH     ESP
       PUSH     0
       PUSH     WM_NOTIFY
       PUSH     EDX
       CALL     Perform
       ADD      ESP,12         //NMHdr destroy
@@exit:
       RET
@@set_item_sel:
       INC      ECX
       CALL     SetItemSelected
end;
{$ELSE ASM_VERSION} //Pascal
procedure TControl.SetCurIndex(const Value: Integer);
var NMHdr: TNMHdr; idx:integer;
begin
 if fCommandActions.aSetCurrent <> 0 then
 begin
    idx := Perform( fCommandActions.aSetCurrent, Value, 0 );
    if fCommandActions.aSetCurrent = TCM_SETCURSEL then begin
      fCurIndex := idx;
      NMHdr.code := TCN_SELCHANGE;
      NMHdr.hwndFrom := fHandle;
      Perform( WM_NOTIFY, 0, Integer( @NMHdr ) );
    end;
 end else
    ItemSelected[ Value ] := True;
end;
{$ENDIF ASM_VERSION}

когда правил, и по какому поводу - не помню уже....


 
D[u]fa   (2009-06-11 11:12) [2]

Сталкивался с такой проблемой.. просто перед удалением делал TabControl.CurIndex := 0;

Но лучше ипользовать фикс



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

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

Наверх




Память: 0.47 MB
Время: 0.06 c
15-1336738041
alexdn
2012-05-11 16:07
2013.03.22
Лицензии


15-1349072562
NailMan
2012-10-01 10:22
2013.03.22
Что то не было давно весте с небесного фронта


2-1337876849
Тарас
2012-05-24 20:27
2013.03.22
Веб Браузер


15-1347628556
Baks
2012-09-14 17:15
2013.03.22
Подскажите функцию сравнения чисел


2-1333344537
SvK.droNe
2012-04-02 09:28
2013.03.22
Рациональная интерполяция с помощью непрерывных дробей.