Главная страница
    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.071 c
15-1331988168
Дмитрий С
2012-03-17 16:42
2013.03.22
Задачу подкинули интересную


2-1339657502
AntiUser
2012-06-14 11:05
2013.03.22
Как правильно создать наследников фрейма


15-1342992635
Pavlik
2012-07-23 01:30
2013.03.22
Посоветуйте цену


15-1352731709
Kerk
2012-11-12 18:48
2013.03.22
Всякие полезные услуги в социальных сетях


6-1258114919
stas
2009-11-13 15:21
2013.03.22
ICS SMTP клиент





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