Win32 API BUG

13 отговора 426 прегледа
#1

Win32 API BUG

Nqkoj probval li e da sloji pove4ko TComboBox control-i v'v form-ata na
prilojenieto si ... da re4em 80.. e na men mi se naloji i ne ostanah
mnogo dovolen ot rezultata a toj e povdigane na izklju4enie
EWin32Error s's s'obshtenie edno ot slednite :
1. 'A Win32 API function failed'
2. 'Win32 Error. Code: 87. The parameter is incorrect'

Ako nqkoj mi kaje ot kakvo se polu4ava taq BUG-otiq shte mu b'da mnogo
blagodaren, a ako razreshi problema nqma da ima raven.

(*
Ne priemam za otgovor -
"Ne izpolzvaj tolkova mnogo control-i!" ili neshto ot sorta,
za6toto sa neobhodimi.
*)

Moga da pomogna samo s tova da vi kaja 4e problema v'znikva pri/sled
ukazvaneto na roditelq na control-a a ne pri s'zdavaneto mu (t.e. v
constructor-a).

Eto vi example da vidite za kakvo stava v'pros... mojete estestveno
da probvate i r'4no kato copy-paste-nete ComboBox control-ite direktno
v'v form-ata i sled tova da run-nete programata.

Ako ste se spreli na 1-viq variant probvajte da smenite st-sta na
"class reference" promenlivata s drugi proizlqzli ot TControl
class-ove i shte zabelejite 4e se izd'nnva samo na TComboBox i TListBox.

procedure TForm1.Button1Click(Sender: TObject);

type TControlClass = class of TControl;

var i : integer;
List : TList;
TheClass : TControlClass;
TheObject : TControl;

begin
TheClass := TComboBox;
List := TList.Create;
try
for i := 1 to 1000 do
begin
TheObject := TheClass.Create(nil);
TheObject.Parent := self;
List.Add(TheObject);
Caption := IntToStr(i);
end
finally
while (List.Count > 0) do
begin
TControl(List.Items[0]).Free;
List.Delete(0);
Caption := IntToStr(List.Count);
end;
FreeAndNil(List);
end;
end;

Отговор
в отговор на NiL^ #2

Re: Win32 API BUG

Направих, гола форма с един бутон и ти копнах процедурката за събитие на бутона. (без FreeandNIL). Работи... Delphi 3

Отговор
в отговор на NiL^ #3

Re: Win32 API BUG

TComboBox и Win32 нямат нищо общо, освен, очевидно, извикването на функции във второто от първото. Явно TComboBox не е читав клас, за това направи си свой.

Si Vis Pacem, Para Bellum
Отговор
в отговор на GoodMan_bg #4

Re: Win32 API BUG

Za s'jalenie nqmam Delphi3, no mi se struva nev'zmojno
sled kato go probvah na D4, D5, CB3, CB5 na 2-e razli4ni PC-ta i rezultata e
edin i s'sht.

Отговор
в отговор на MиГ-31 #5

Re: Win32 API BUG

Samo tova ostana... da sedna da pisha TComboBox

Отговор
в отговор на NiL^ #6

Re: Win32 API BUG

Ами... нали ти казах, копирах го 1 към 1 от теб без freeandnil() и работи... между другото съм с NT 4.0 Workstation...

Отговор
в отговор на GoodMan_bg #7

NiL^,

Пейстнах го и при мен също работи -- D4, W2000, без FreeAndNil(List). Дори си се изобразяват:

procedure TForm1.Button1Click(Sender: TObject);
var i : integer;
List : TList;
TheClass : TControlClass;
TheObject : TControl;
begin
TheClass := TComboBox;
List := TList.Create;
try
for i := 1 to 1000 do
begin
TheObject := TheClass.Create(nil);
TheObject.Parent := self;
TheObject.Top := i*10;
TheObject.Left := 1;
TheObject.Visible := true;
List.Add(TheObject);
Caption := IntToStr(i);
end;
Application.ProcessMessages;
ShowMessage('tralala');
finally
while (List.Count > 0) do
begin
TControl(List.Items[0]).Free;
List.Delete(0);
Caption := IntToStr(List.Count);
end;
// FreeAndNil(List);
end;
end;



Отговор
в отговор на Xypodilec #8

Re: NiL^,

O ne, slu4i se naj-loshoto... tova ozna4ava 4e e ot OS-a. I na 2-te PC-ta sa instalirani Win98SE

Отговор
в отговор на Xypodilec #9

Re: NiL^,

Ako nqkoj s's Win9x probva shte mu b'da mnogo blagodaren ...

Отговор
в отговор на NiL^ #10

при w98, 128MB RAM:

същото .exe изгърмява на 154-тия combobox с грешката, която споменаваш.

Всъщност защо са ти толкова много? Кажи нещо по-подробно и току-виж сме измислили някакво решение мамицата му виндовска.

?

Отговор
в отговор на NiL^ #11

Da si 4uwal za poniatieto resource

pod Win9x - menaziraneto i oswobozdawaneto na grafin4nite resursi e mnogo (ama rabiraj tragi4no) losho - tam naj weroitno e problema - podobni rezultati se polu4awat i pri otwarianeto na 2(ili ako mozesh powe4e ) broia D5 pri naka4eni okolo 1000 br. komponenta - ne moga da ti opisha kakwa kartina stawa - ne moze i da se "zasneme" daze - da ne gowrim ako si pusnesh D5 + niakolko IE -ta i se opitash da prawish nesto

mezdu dr. sistemata mi ne e mnogo losha ama problema si e w Win9
A sam s PIII 650 + 256, ne sam s WinSE ama i s nego sam probwal - sega sam s Me - tam ima problemi, W2K - advansed server - tam oste ne sam pusnal D5 - ama skoro ste ia testwam - waw wida w kojto ti kazah - s okolo 80MB bpl ka4eni (towa sa okolo 1400 komponenta) fajlowe.

---
IN VINO VERITAS!
Отговор
в отговор на Xypodilec #12

Re: при w98, 128MB RAM:

Takaaa... iskam da blagodarq na vsi4ki koito pomognaxa za raznishtvaneto
na problema... qvno programata mi shte raboti na NT (samo tam da ne izleze drug BUG).

Xypodilec - Ami nalojitelni sa tolkova mnogo ComboBox-ove ama ne iskam da te
zanimavam dop'lnitelno s programata mi... Estestveno moje da se realizira i po drug na4in oba4e taka shte b'de po-udobno... BTW ako se pozamislish shte se setish za kakva programa stava duma.

Отговор
в отговор на NiL^ #13

нещо като идея:

Тъй като проблема явно е със заделянето на графични ресурси (както каза PhantomAS), може да направиш следното:

Правиш си колкото ти трябват stringlist-ове, а combobox -- колкото се събират визуално. Прикачаш към всяко combo по един списък, а като си скролваш (ако нещо такова ще има) -- прехвърляш само списъците. Т.е. нещо като плъзгане ще се получи.

Отговор
в отговор на Xypodilec #14

Re: нещо като идея:

ili nai dobre si pokazwai editbox i samo tozi koito e na fokus go zamazwash s
combo? che shte izglejda i po izchisteno na wynshen wid :)

Отговор