|
Тема
|
FormShortCut
|
|
Автор | Desso (Нерегистриран) |
Публикувано | 27.09.06 18:47 |
|
Използвам функцията FormShortCut за да прихващам натискането на функционалните клавиши F1 - F12, но на един от тях е прикачена функция която се забавя около 5 секунди и след това има:
PageControl.Pages[1].Free();
и след това излиза съобщение за грешка - Access Violation....
Предполагам че става въпрос за съобщения към вече несъщесвуващ обект. Как да го избегна това?
| |
Тема
|
Re: FormShortCut
[re: Desso]
|
|
Автор | lmmanuel (Нерегистриран) |
Публикувано | 27.09.06 21:58 |
|
Здравей,
така както си изложил нещата не става ясно какво искаш да направиш, каква е целта на програмата, на каква ОС се изпълнява, на кой клавиш се получава това и ако може сорс кода на подпрограмата за да разберем за какво става дума(в повечето форуми ще ти кажата че не са "Ясновидци, за да отгатнат горните неща"). Ето каво мога да ти кажа за сега:
1. Използвай събитието на формта OnKeyDown за да прихванеш клавишна кобинация на формта.
Проблема може да се дължи на това че класа на формaта TForm e наследник на ТCustomForm и TWinControl, в който някой клавиши се разглеждата като системни (вкл. Функционалните клавиши F1-F12), как може да се преодолее това не мога да ти кажа, щото не си го спомням вече
2. Ти пробвай да разделиш нещата, като асоциираш безопасни клавишни комбинации от рода "Ctrl + Shift + 1" и ни кажи още ли го има забавянето и съобщението Access Violetion.
| |
Тема
|
Re: FormShortCut
[re: lmmanuel]
|
|
Автор | Desso (Нерегистриран) |
Публикувано | 28.09.06 10:55 |
|
Използвам следната процедура върху форма с TabSheet върху нея:
procedure TabCreate(const sName,sCaption:string; var ChildPageControl:TPageControl);
begin
with TTabSheet.Create(ChildPageControl) do
begin
PageControl := ChildPageControl;
Name := sName;
Caption := sCaption;
end;
end;
която създава и визуализира нов ТабШиит, а върху него създавам фрейм с контроли:
NewFrame:=TNewFrame.Create(ChildPageControl.Pages[1]);
NewFrame.Parent:=ChildPageControl.Pages[1];
идеята е когато трябва да се въвежда информация - създава се TabSheet, създава се фрейма, попълват се контролите и се дава запис с някой от функционалните клавиши F1 - F10, премахва се фрейма, премахва се TabSheeta. OnKeyDown не върши работа, защото не действа когато фокъсът не е върху формата. След запис (самият запис причинява забавянето което споменах) използвам следния код за да затворя TabSheet - а:
SlavePageControl.Pages[1].Free;
който се извиква от:
procedure TForm1.FormShortCut(var Msg: TWMKey; var Handled: Boolean);
begin
Handled:=true;
case Msg.CharCode of
VK_ESCAPE:Exit();
VK_F10:Save.Click();
else
Handled:=false;
end;
end;
но от време на време ми изкарва въпросния Access Violation. Не е ясно дали юзъра не натиска два клавиша едновременно и с това да предизвиква странни обработки на събитията (примерно F10+F11 или F10+F9), което обаче не знам как да избегна. Лошото е че няма property Release на TabSheet-a, иначе всичко си става автоматично...
| |
Тема
|
Re: FormShortCut
[re: Desso]
|
|
Автор | lmmanuel (Нерегистриран) |
Публикувано | 28.09.06 13:32 |
|
Нямам идея как да ти помогна но мога да ти препоръчам нещо за начало, там където освобождаваш TabSheet-та да добавиш нещо от рода на:
1)
NewFrame.Enabled:=False;
NewFrame.Free;
NewFrame:=Nil; // може и с FreeAndNil(NewFrame) и след това
SlavePageControl.Pages[1].Free;
до колкото знам има правило в Делфи, че щом създаваш екземпляр на обект, то ти си и отговорен за неговото освобождаване, най-вероятно на това се дължи Access Violetion.
2)Не виждам никъде да правиш проверки за Nil стойност на обектните променливи преди да ги освободиш, нещо от рода на Assigned(SlavePageControl.Pages[1]), не приемай на доверие!!! че всичко ще е наред - Проверявай !!!
3) Проблема най-вероятно е комполексен и след като решиш подпроблема с Access Violation, трябва да направиш това с клавишните комбинации от предишния пост за да видим има ли проблем с тях.
| |
Тема
|
Re: FormShortCut
[re: Desso]
|
|
Автор | lmmanuel (Нерегистриран) |
Публикувано | 28.09.06 15:44 |
|
... а, още нещо грешката Access Violation може да се дължи и на това че пишеш
SlavePageControl.Pages[1].Free;
а, може би имаш в предвид
SlavePageControl.Pages[0].Free;
индексите на масивите в Делфи започват от 0 не от 1, но ако не забравяш да слагаш Nil на обектните променливи ще избегнеш подобен вид грешки (имайки в предвид гореизложеното)
| |
Тема
|
Re: FormShortCut
[re: lmmanuel]
|
|
Автор | Desso (Нерегистриран) |
Публикувано | 28.09.06 15:48 |
|
Индекса си е наред, индекс 0 е за статичен таб. Благодаря за помощта, сега ще пробвам :)
| |
Тема
|
Re: FormShortCut
[re: Desso]
|
|
Автор | Desso (Нерегистриран) |
Публикувано | 29.09.06 15:15 |
|
Грешките се появяват по-рядко, но пак си ги има....
| |
Тема
|
Re: FormShortCut
[re: Desso]
|
|
Автор | Desso (Нерегистриран) |
Публикувано | 03.10.06 14:28 |
|
Успях да изкопча още информация за проблема. След йато дебъгвах сума време, се оказа че проблема е във съобщение, което е предназначено за един от контролите върху TabSheeta. Понеже на FormShortcut се прихваща натискането на определен клавиш и се премахва въпросния контрол, то грешката идва от съобщението към вече несъществуващия контрол. Как да го избегна това?
| |
|
|
|
|