Клубове Дир.бг
powered by diri.bg
търси в Клубове diri.bg Разширено търсене

Вход
Име
Парола

Клубове
Dir.bg
Взаимопомощ
Горещи теми
Компютри и Интернет
Контакти
Култура и изкуство
Мнения
Наука
Политика, Свят
Спорт
Техника
Градове
Религия и мистика
Фен клубове
Хоби, Развлечения
Общества
Я, архивите са живи
Клубове Дирене Регистрация Кой е тук Въпроси Списък Купувам / Продавам 08:20 27.06.24 
Компютри и Интернет
   >> Delphi
Всички теми Следваща тема *Кратък преглед

Тема 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 се прихваща натискането на определен клавиш и се премахва въпросния контрол, то грешката идва от съобщението към вече несъществуващия контрол. Как да го избегна това?




Всички темиСледваща тема*Кратък преглед
Клуб :  


Clubs.dir.bg е форум за дискусии. Dir.bg не носи отговорност за съдържанието и достоверността на публикуваните в дискусиите материали.

Никаква част от съдържанието на тази страница не може да бъде репродуцирана, записвана или предавана под каквато и да е форма или по какъвто и да е повод без писменото съгласие на Dir.bg
За Забележки, коментари и предложения ползвайте формата за Обратна връзка | Мобилна версия | Потребителско споразумение
© 2006-2024 Dir.bg Всички права запазени.