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

Вниз

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 вся ветка

Форум: "KOL";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.45 MB
Время: 0.053 c
15-1347085902
Опять я
2012-09-08 10:31
2013.03.22
H.264


2-1332098665
ProgRAMmer Dimonych
2012-03-18 23:24
2013.03.22
IDropTarget и TListView: конфликт с именем метода в TControl в D7


2-1343380872
Люда
2012-07-27 13:21
2013.03.22
Вопрос по StringList


2-1328181215
harisma
2012-02-02 15:13
2013.03.22
Корректно освободить память


15-1344801222
Jeer
2012-08-12 23:53
2013.03.22
Как молоды мы были...





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский