Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.01.2011, 13:50   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию TlistView и Tlist непоучается массово удалять выбранные обьекты...

Всем привет!

Проблема:
пытаюсь удалить выбранные итемы из списков:
Код:
{
AppsList - TListVew
AppList - наследник класса Tlist
}

          for i := 0 to Appslist.Items.Count -1 do
          begin
            if AppsList.Items[i].Selected then
            begin
              AppList.DeleteApp(i);
              Appslist.Items[i].Delete;
              //Appslist.DeleteSelected;
              AppList.Save;
            end;
          end;
        end;
пробовал даже через For i:=0 to TListView.SelCount
Во всех вариантах массового удаления, Вылетаю в AccesViolation на строке:
Код:
              AppList.DeleteApp(i);
Собственно вот как оно изнутри:
Код:
....
  TAppsList = class(TList)
  private
    function GetApp(Indx: integer): TApp;
  public
    destructor Destroy; override;
    property Apps[Indx: Integer]: TApp read GetApp;
    procedure DeleteApp(Indx: Integer);
....
  end;

implementation

uses MainUnit, GlobalConsts, GlobalStrings;

var
  i: Integer;

.....

{ TAppsList }
....
procedure TAppsList.DeleteApp(Indx: Integer);
begin
//Овоождаем а затем удаляем переданный индекс элемента из списка
  Apps[indx].Free;
  Delete(indx); 
end;

//вызывется только при разрушении формы
destructor TAppsList.Destroy; 
begin
  while Count > 0 do
  begin
    TApp(Items[0]).Free; //Освобождаем нулевой элемент списка
    Delete(0);//удаляем нудевой элемент.
  end;
  inherited;
end;
собственно как правильно удалять из TlistView и Tlist одновременно?
Как я сообразимил что нумерация Tlist и TlistView сильно отличается...
И я не поподаю в нужный индекс когда удаляю первый и последний элемент списка TlistView а в Tlist этого элемента уже и нет(Нумерация с 1цы?).

Последний раз редактировалось Человек_Борща; 09.01.2011 в 13:54.
Человек_Борща вне форума Ответить с цитированием
Старый 09.01.2011, 13:53   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Надежнее обратно писать:
Код:
 for i := Appslist.Items.Count-1 downto 1...
Цитата:
Appslist.DeleteSelected;
А чего это не помогло? Оставь только ее и убери цикл.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.01.2011, 14:33   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Цикл нужен для удаления из Tlist...

Ну вот опять в AV:
Код:
          for i :=Appslist.SelCount downto 1 do
          begin
              AppList.DeleteApp(i);
              Appslist.Items[i].Delete;
              //Appslist.DeleteSelected;
              AppList.Save;
          end;
Код:
exception number  : 1
exception class   : EListError
exception message : List index out of bounds (1).

main thread ($820):
00469b81 +015 HLR.exe    Classes       2790  +1 TList.Error
00469be5 +039 HLR.exe    Classes       2795  +1 TList.Error
00469c83 +02b HLR.exe    Classes       2826  +2 TList.Get
0060e021 +00d HLR.exe    AppsListUnit   166  +1 TAppsList.GetApp
0060dfb5 +00d HLR.exe    AppsListUnit   150  +1 TAppsList.DeleteApp
00610174 +0ac HLR.exe    MainUnit       483  +8 TMainForm.AppsDeleteBtnClick
004f0e3a +086 HLR.exe    Controls      4705  +9 TControl.Click
00490cea +00a HLR.exe    Buttons       1159  +1 TSpeedButton.Click
00490ccb +10f HLR.exe    Buttons       1152 +25 TSpeedButton.MouseUp
0055520c +074 HLR.exe    sSpeedButton   977  +8 TsSpeedButton.MouseUp
004f1341 +041 HLR.exe    Controls      4831  +2 TControl.DoMouseUp
004f13c8 +07c HLR.exe    Controls      4843  +8 TControl.WMLButtonUp
004f0c0f +1df HLR.exe    Controls      4645 +53 TControl.WndProc
00554cbc +21c HLR.exe    sSpeedButton   839 +45 TsSpeedButton.WndProc
004f091a +036 HLR.exe    Controls      4552  +5 TControl.Perform
004f4778 +0a8 HLR.exe    Controls      6301 +15 TWinControl.IsControlMouseMsg
004f4884 +0f4 HLR.exe    Controls      6327 +18 TWinControl.WndProc
004ba89a +252 HLR.exe    ComCtrls     18694 +80 TToolBar.WndProc
00535c37 +223 HLR.exe    sToolBar       574 +42 TsToolBar.WndProc
004f44f0 +034 HLR.exe    Controls      6237  +3 TWinControl.MainWndProc
0047653c +014 HLR.exe    Classes      10966  +8 StdWndProc
7e3696c2 +00a user32.dll                        DispatchMessageA
004dd058 +0ac HLR.exe    Forms         6872 +13 TApplication.ProcessMessage
004dd09f +00f HLR.exe    Forms         6891  +1 TApplication.HandleMessage
004dd33a +0a6 HLR.exe    Forms         6975 +16 TApplication.Run
006123c6 +396 HLR.exe    HLR            142 +65 initialization

disassembling:
[...]
0044ef15         mov     [eax+$b4], ebx
0044ef1b         mov     [eax+$b8], edx
0044ef21         mov     [eax+$bc], ecx
0044ef27         mov     [eax+$c4], ebp
0044ef2d         mov     [eax+$c8], edx
0044ef33         mov     [eax+$d4], esp
0044ef39         jmp     loc_40788c
0044ef39
0044ef39       ; ---------------------------------------------------------
0044ef39
00469b6c       public Classes.TList.Error:      ; function entry point
00469b6c 02789   push    ebp
00469b6d         mov     ebp, esp
00469b6f         add     esp, -$14
00469b72         mov     [ebp-$c], ecx
00469b75         mov     [ebp-8], edx
00469b78         mov     [ebp-4], eax
00469b7b 02790   push    ebp
00469b7c         call    -$1d ($469b64)         ; Classes.ReturnAddr
00469b7c
00469b81       > pop     ecx
00469b82         push    eax
00469b83         mov     eax, [ebp-$c]
00469b86         mov     [ebp-$14], eax
00469b89         mov     byte ptr [ebp-$10], 0
00469b8d         lea     eax, [ebp-$14]
00469b90         push    eax
00469b91         push    0
00469b93         mov     ecx, [ebp-8]
00469b96         mov     dl, 1
00469b98         mov     eax, [$466aec]
00469b9d         call    -$110c2 ($458ae0)      ; SysUtils.Exception.CreateFmt
00469b9d
00469ba2         jmp     loc_404400

Последний раз редактировалось Человек_Борща; 09.01.2011 в 14:40.
Человек_Борща вне форума Ответить с цитированием
Старый 09.01.2011, 15:18   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
AppList.Save;
Вынеси за цикл.
Цитата:
Ну вот опять в AV:
На какой именно строчке то?
Заметь несуразицу - ты в цикле пользуешь Appslist, а в теле не проверяя вызываешь AppList.DeleteApp(i), которая вполне может не содержать такое же кол-во элементов как Appslist.
Поставь проверку на попадание i в рамки AppList
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.01.2011, 16:28   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

все, вот как я сделал...
Код:
          for i:=0 to Appslist.SelCount -1  do
          begin
            for i2:=0 to AppList.Count -1 do
            begin
              if (i = i2) then
              begin
              AppList.DeleteApp(i2);
              Appslist.Items[i].Delete;
              end;
            end;
          end;
          AppList.Save;
i,i2 - Integer...

но опять проблема, она удаляет не то и не так... Опять почему?
Человек_Борща вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
удалить выбранные в listview элементы Человек_Борща Общие вопросы Delphi 3 07.01.2011 12:27
Обьекты Rio309 PHP 1 06.12.2010 15:23
Массово "перегнать" файлы из 2007 в 2003 kzld Microsoft Office Excel 1 09.11.2010 23:28
Липкие обьекты dmitriegorovih Общие вопросы Delphi 16 06.09.2010 15:12
Знак абзаца, как удалить массово? SoFuWa Microsoft Office Word 3 21.02.2010 21:03