Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ошибки при добавлнии элемента в TListView [WinXP]


Димон ©   (2007-03-28 02:58:00) 

type
 TMainForm = class(TForm)
   ListInformation: TListView;
    procedureFormActivate(Sender: TObject);
    procedureFormDestroy(Sender: TObject);
  private
    type
     TObjectInformation = record
       Handle: HWND;
       WindowText, ClassName: WideString;
    end;
   TObjectsInformation = array ofTObjectInformation;
  public
   ObjectsInformation: TObjectsInformation;
  end;

var
 MainForm: TMainForm;
 Window: HWND;
 lpString: PWideChar;
 Index: Word = 0;

implementation

{$R *.dfm}

procedureTMainForm.FormActivate(Sender: TObject);
var
 MyItem: TListItem;
begin
 New(lpString);
 EnumWindows(@EnumWindowsProc, 0);
 EnumChildWindows(Window, @EnumChildProc1, 0);
 SetLength(MainForm.ObjectsInformation, Index);
 Index := 0;
 EnumChildWindows(Window, @EnumChildProc2, 0);
 lpString := nil;
 Dispose(lpString);
 Index := 0;
  repeat
 MyItem := MainForm.ListInformation.Items.Add; // Вот здесь происходит ошибка EAccessViolation, когда Index = 1
 MyItem.Caption := IntToStr(Index);
 MyItem.SubItems.Add(IntToStr(MainForm.ObjectsInformation[Index].Handle));
 MyItem.SubItems.Add(MainForm.ObjectsInformation[Index].WindowText);
 MyItem.SubItems.Add(MainForm.ObjectsInformation[Index].ClassName);
   Index := Index + 1;
  untilIndex = Length(MainForm.ObjectsInformation);
end;
// Если в ListInformation перед компиляцией добавляю один элемент, то ошибки нет. Если элементов изначально нет, то при добавлении элементов во время выполнения программы происходит ошибка. Что не так?


_Аноним   (2007-03-28 15:38:00) [1]


> MyItem := MainForm.ListInformation.Items.Add;// Вот здесь
> происходит ошибка EAccessViolation, когда Index = 1

Зачем здесь указание переменной?
Она не нужна. Она кстати инициализирована?

С другой стороны, вчера поймал AV на безобидной строке
ListView1.Items.Add.Caption:=Format('Элемент %d', [N]);

надо разбираться, возможно, в генофонде не все гладко


zap8   (2007-03-28 09:01:00) [2]

Чему равно вот это значение   Length(MainForm.ObjectsInformation);

не понятно чему равен index если 0 зачем тогда
SetLength(MainForm.ObjectsInformation, Index);


Loginov Dmitry   (2007-03-28 08:02:00) [3]

> Если в ListInformation перед компиляцией добавляю один элемент,
> то ошибки нет. Если элементов изначально нет, то при добавлении
> элементов во время выполнения программы происходит ошибка.
> Что не так?


Скорее всего, это приведенная ошибка. На самом деле ошибка возникает раньше, в другом месте, а здесь она лишь себя проявляет. Это и не удивительно при таком сомнительном коде. Index объявлена как глобальная, но зачем-то используется еще и как счетчик цикла (так нельзя). Зачем-то вызывается Dispose(nil). Перепиши все по уму, глядишь, заработает.


Наверх

Титульная страница Поиск, карта сайта Написать письмо