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

Вниз

Вопрос о TList   Найти похожие ветки 

 
KpeHgeJIb   (2003-03-08 13:27) [0]

народ странная чтоука получается. Есль два обьекта Tlist.
List1 и List2.

List1 по ходу программы заполняется данными, а List2 остается пустым. Единственное действие над List2 это List2:=TList.Create.
Потом при попытке связать List2 с элементами List1 (List2.Assign(List1)) получаю ошибку: Access Violation at xxxxxxxxx.

Обьясните пожалуйста где я туплю и что я делаю не так?


 
Palladin   (2003-03-08 13:56) [1]

ты и тупишь (потому что думаешь что тут телепаты) и делаешь не так потому что получаешь ошибку.


 
jack128   (2003-03-08 13:58) [2]

Код предъявите на обозрение публики..


 
Anatoly Podgoretsky   (2003-03-08 14:03) [3]

Ошибка в 17 строке


 
KpeHgeJIb   (2003-03-08 15:17) [4]

Ну вы все конечно шутники.... :).
вот код
Unit Unit1;
intreface
function GetWindowList(var wnds:TList):integer;
function GetPWin(wnd: HWnd; param: lParam): bool; stdcall;

implementation
var
winList:TList;
winCount:integer=0;

function GetPWin(wnd: HWnd; param: lParam): bool; stdcall;
var pvnd:^wnd;
begin
new(Pwnd);
pwnd^:=wnd;
winList.Add(pwnd);
end;

function GetWindowList(var wnds:TList):integer;
begin
WinList:=TList.Crate;
EnumWIndows(@GetPWin,0);
wnds.Assign(winList); // вот сдесь ошибка
winList.Free;
end;



В итоге не важно что делаеш в программе, валетает ошибка и помечена строчка номер 3 в теле функции GetWindowsList

в программе выглядит это приблезительно так
procedure proc;
var
list:TList;
brgin
.....
list:=TList.Create;
GetWindowsList(list);
.....
end;


в итоге я должен получить лист в котором записаны хендлы всех окон.

Всетаки расскажите мне где я туплю.


 
KpeHgeJIb   (2003-03-08 15:22) [5]

ой не скопировалась последняя строчка функции GetPWin.
Там в конце присваевается значение True. GetPWin:=True;


 
theodor_iv   (2003-03-08 15:37) [6]

А wnds создавать кто будет?


 
Palladin   (2003-03-08 15:53) [7]


> theodor_iv © (08.03.03 15:37)

wnds создано уже, тут гдето в другом ошибка...

> KpeHgeJIb (08.03.03 15:17)

очень странное объявление
var pvnd:^wnd;
может стоит так
var pwnd:^HWnd;


 
KpeHgeJIb   (2003-03-08 15:58) [8]


> может стоит так
> var pwnd:^HWnd;


Именно так и есть это я опечатался. Но это все мелочи. Где ошибкак то?


 
Palladin   (2003-03-08 16:14) [9]

ошибка точно не в вышеприведенном коде...


 
KpeHgeJIb   (2003-03-08 16:26) [10]

А что тогда может быть?.

Вот тут вопрос нарисовался...
Я делаю wnds.Assign(winList);
Но winList является глбальной переменной юнита Unit1. Может после завешения функции GetWindowsList(list) и выхода из Unit1 обьект winlist освобождает занятую им память? и соответственно обьект list который к нему приписан тоже пуст и обрашение к нему и вызывает ошибку. Как вы щитаете? и если это так то как это обойти?



 
Романов Р.В.   (2003-03-08 16:34) [11]

А с какой версии Delphi у TList появился метод Assign?


 
KpeHgeJIb   (2003-03-08 16:40) [12]

У меня Delphi 7, а появилс он помойму в начиная с Delphi 5 или 6. Точно не уверен. Но факт в том что он есть и в хелпе про него инфу можно найти, но почемуто вылетает ошибка.


 
theodor_iv   (2003-03-08 16:42) [13]


> Романов Р.В. © (08.03.03 16:34)

с шестой


> KpeHgeJIb (08.03.03 16:26)


попробуй все это упростить вот так:


function GetPWin(wnd: HWnd; param: lParam): bool; stdcall;
begin
TList(param).Add(pointer(wnd));
Result := true;
end;

function GetWindowList(wnds:TList):integer;
begin
EnumWindows(@GetPWin, LParam(wnds));
Result := 0;
end;


и пользуйся HWnd(List[...])


 
Романов Р.В.   (2003-03-08 16:44) [14]

KpeHgeJIb
У меня D5. TList - потомок TObject и соответственно не имеет метода Assign.
Посмотри может он и с потокоми умеет работать. Тогда попробуй копировать его через TMemoryStream


 
KpeHgeJIb   (2003-03-08 16:47) [15]

Вот я тормоз... забудтье про ошибку с wnds.Assign(winList).
Тут то я писал из памяти и написал правельный код а в программе у себя я написял наоборот

сначала GetWindowsList(list);
а потом list:=TList.Create;
и заметил я это только после того как распечатал тест программы.

Но это я исправил. Теперь есть другая трабла. переменная List пуста, тоесть List.Count равен 0.
Что за безобразие и как лечить?


 
Юрий Зотов   (2003-03-08 16:50) [16]

> KpeHgeJIb

Метод Assign появляется у TPersistent (причем во всех Delphi, начиная с D1). И это не просто так, это одна из принципиальных основ VCL. А TList - прямой потомок TObject и к TPersistent не относится. Поэтому у него метода Assign нет и быть не может (если только не сделать его самому, но тогда это будет уже не TList).

Так что, что-то в Ваших словах не соответствует истине. Если действительно хотите получить помощь - описывайте проблему ТОЧНО.


 
theodor_iv   (2003-03-08 17:03) [17]


> Юрий Зотов © (08.03.03 16:50)

Поэтому у него метода Assign нет и быть не может


Метод TList.Assign есть в шестой и седьмой версиях.



 
KpeHgeJIb   (2003-03-08 17:08) [18]


> Юрий Зотов

То что он не относится к TPersistent это не секрет. Но факт остается фактом и оно работает, я отловил ошибку.

Вот тебе кусочек из хелпа по Delphi 7

Assign method (TList)
_____________________
Delphi syntax:

procedure Assign(ListA: TList; AOperator: TListAssignOp = laCopy; ListB: TList = nil);

Description

Call Assign to assign the elements of another list to this one. Assign combines the source list with this one using the logical operator specified by the AOperator parameter.

If the ListB parameter is specified (Delphi) or not NULL (C++), then Assign first replaces all the elements of this list with those in ListA, and then merges ListB into this list using the operator specified by AOperator.

If the ListB parameter is not specified (Delphi) or NULL (C++), then Assign merges ListA into this list using the operator specified by AOperator.


 
Palladin   (2003-03-08 17:50) [19]


> Юрий Зотов © (08.03.03 16:50)

какое смелое заявление по поводу Assign...
можно подумать ввести этот метод в последующих версиях делфи не представляется возможным...

> KpeHgeJIb (08.03.03 16:47)

если TList не пустой, то count не может равнятся нулю...

я воспроизвел твой код и запихал нормально в TListBox заголовки всех окон которые перечислились...


 
KpeHgeJIb   (2003-03-08 18:03) [20]


> Palladin

Да я знаю что все работает. Это я тормозил по мелочам. Я тут некоторые строчки писал из памяти и поэтому они были правельные а в программе стирал добовлял и в итоге получилось что некоторые вещи выполнялись не вовремя. Я все уже разобрал.

Спасибо всем за моральную потдержку.
Тема закрыта


 
Anatoly Podgoretsky   (2003-03-08 18:24) [21]

В дальнейм выбрось свою память и подходи к компьютеру только с листком бумаги с которого и переписывай текст сюда, зачем же ты нам все время даешь неточную информацию, что бы помучались?


 
Юрий Зотов   (2003-03-08 18:53) [22]

> Palladin © (08.03.03 17:50)
> какое смелое заявление по поводу Assign...

Оно не смелое. В D1-D5 оно абсолютно точное, уверяю Вас. И именно потому, что метод Assign НУЖЕН классу TPersistent ПРИНЦИПИАЛЬНО (т.е., исходя из СМЫСЛА и НАЗНАЧЕНИЯ этого класса), а другим классам он ПРИНЦИПИАЛЬНО не нужен. Это значит, что в других классах можно его вводить, а можно и не вводить - в любом случае он не будет КЛЮЧЕВЫМ методом VCL и на ее функциональность В ЦЕЛОМ никак не повлияет. Зато если убрать Assign из TPersistent - немедленно рухнет добрая половина VCL (если не больше). Потому что вместе с Assign рухнет ПРИНЦИП.

А то, что в D6-D7 класс TList был расширен - вот этого я действительно не знал. Поскольку на D6 еше не перешел (и пока не собираюсь).

> KpeHgeJIb

То, что проблема решена - это хорошо. Теперь можно подумать о следующем шаге. Насколько я понял, в списке Вы храните только хэндлы окон. В таком случае - зачем Вам дополнительная динамическая память? С необходимостью вызова (и отслеживания парности New-Dispose) и с двойным расходом памяти?

Храните в списке не УКАЗАТЕЛИ, а сами ХЭНДЛЫ. И то, другое - беззнаковое целое, так что размер совпадает и проблем нет. Надо только явно указать компилятору преобразование типа, вот и все. И код упростится, и расход памяти уменьшится.



 
KpeHgeJIb   (2003-03-08 18:56) [23]

Да ладно вам что вы разшумелись, я же не спициально вам работу давал, чтоб вы мучались. Человеку свойственно ошибатся. Я сам не мог разобратся а вы мне помогли разобратся в собственных ошибках, зачто большое вам спасибо. А память у меня кокораз хорошая. Правильный код я по памяти написал. А вот вниматнльность это и есть моя проблемма.

Извените если что нетак.


 
Anatoly Podgoretsky   (2003-03-08 19:01) [24]

Во всяком случае это не тот Assign, который приведен в коде ( wnds.Assign(winList);), у TList.Assign три параметра.


 
Gigabyte   (2003-03-08 19:14) [25]

>>Anatoly Podgoretsky
И 2 последние из них с парамертами ПО умолчанию


 
Anatoly Podgoretsky   (2003-03-08 20:06) [26]

Извиняюсь не посмотрел


 
Yuri-7   (2003-03-08 22:04) [27]

Для List-ов вполне подходит использование простого присвоения -
List2:=List1; и совсем необязательно мучиться на счет Assign. Естественно, что List2 должен быть создан.


 
Anatoly Podgoretsky   (2003-03-08 22:32) [28]

Это хачем, что бы потерять память?


 
Palladin   (2003-03-08 22:32) [29]


> Yuri-7 © (08.03.03 22:04)

а что? в делфи уже ввели перекрытие операндов?
у тебя в данном случает теряется ссылка на List2 и List1 и List2 ссылаются на один и тот же объект...


 
KpeHgeJIb   (2003-03-09 01:38) [30]


> Юрий Зотов

Спасибо за совет с хранением Хендлов, без добывания памяти. Идея интерестная, я попробую.


 
theodor_iv   (2003-03-09 08:11) [31]


> KpeHgeJIb (09.03.03 01:38)


Хранение хэндлов без добывания памяти, а также создание списка вообще без использования второго TList"a уже есть и даже пробовать ничего не нужно. Внимательно см. theodor_iv © (08.03.03 16:42)


 
Yuri-7   (2003-03-09 09:19) [32]

Anatoly Podgoretsky © (08.03.03 22:32)
Это где же Вы умудрились потерять память?


 
Yuri-7   (2003-03-09 09:27) [33]

Palladin © (08.03.03 22:32)
> Yuri-7 © (08.03.03 22:04)
>а что? в делфи уже ввели перекрытие операндов?
>у тебя в данном случает теряется ссылка на List2 и List1 и >List2 ссылаются на один и тот же объект...

Посмотри 1-й вопрос, что хочет Крендель - "связать элементы двух списков". Если List2 изначально пустой, то пусть теряется ссылка, кому она нужна?


 
Anatoly Podgoretsky   (2003-03-09 09:42) [34]

Yuri-7 © (08.03.03 22:04)
Это где же Вы умудрились потерять память?
Вообще то это не я, а ты следующим предложением

Для List-ов вполне подходит использование простого присвоения - List2:=List1; и совсем необязательно мучиться на счет Assign. Естественно, что List2 должен быть создан.


 
Yuri-7   (2003-03-09 09:51) [35]

>Anatoly Podgoretsky © (09.03.03 09:42)
Согласен, лишнее действие.


 
Anatoly Podgoretsky   (2003-03-09 10:15) [36]

Нет не лишнее, а грубая ошибка, постоянная потеря памяти


 
Palladin   (2003-03-09 13:01) [37]


> Yuri-7 © (09.03.03 09:27)


> Если List2 изначально пустой, то пусть теряется ссылка,
> кому она нужна?

ну а на кой черт тогда Create делать у List2?
Крендель хочет не связать элементы двух списков, а перенисти эти элементы из одного в другой... и если ты не заметил то он потом освобождает временный список с получеными значениями... и по этому проколется твой List2:=List1;


 
Palladin   (2003-03-09 13:23) [38]


> Anatoly Podgoretsky © (09.03.03 10:15)
> Нет не лишнее, а грубая ошибка, постоянная потеря памяти

что самое печальное не только грубая, но и осознаная...



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

Форум: "Основная";
Текущий архив: 2003.03.20;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.008 c
14-64283
крот
2003-03-06 05:55
2003.03.20
Принципиальный вопрос по TControl


14-64378
HanIP
2003-03-05 19:34
2003.03.20
quickreport


1-64155
Baxs/B
2003-03-07 10:21
2003.03.20
Кое что ещё про компоненты


6-64275
KeLT
2003-01-29 13:17
2003.03.20
Помогите с ExitWindowsEx


3-64007
AlexanderSK
2003-02-28 17:18
2003.03.20
Сервер на базе WebSnap (Midas)





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