Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка понятная, но как исправить? 
V
    Опции темы
Nic442
  Дата 30.4.2006, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 5.4.2006
Где: Советский Союз

Репутация: нет
Всего: нет



Вопрос довольно легкий, но я чего-то не досоображаю.

Код

procedure TIndex_Form.Reopen1_files(Sender: TObject);
var
   NewItem: TMenuItem;
   str:string;
begin
   NewItem:=(Sender as TMenuItem);
   //MessageDlg('1',mtWarning,[mbOk],0);    Но если я здесь ставлю вывод сообщения то работает нормально.
   Reopen1.Delete(Reopen1.IndexOf(Sender as TMenuItem));  // ОШИБКА
   Reopen1.Insert(0,NewItem);
   str:=StringReplace((Sender as TMenuItem).Caption,'&','',[rfReplaceAll]);
   File_Reopen(NIL, str);
end;


Этот код висит у меня на одной из кнопок mainmenu. Повесил его на Toolbar на одну из Toolbutton в свойство MenuItem. Так при щелчке на этом button и выборе пункта меню он выдаёт ошибку. (Хотя из mainmenu нормально работает). Я проверил Reopen1.IndexOf(Sender as TMenuItem)=-1 при вызове через Toolbar. Но весь прикол в том что если я добавляю MessageDlg('1',mtWarning,[mbOk],0); то все работает. Подскажите, пожалуйста, как исправить ошибку. 
PM MAIL   Вверх
seer
Дата 30.4.2006, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 25.4.2006

Репутация: нет
Всего: нет



первое, что напрашивается.. это поставить задержку.. но это непонашенски..
Давай кидай более полную картину. А вообще у меня было нечто такое... в программе память зас%%л и проги выделывали странные штуки. Маловероятно, но бытьтакое может. 
PM MAIL   Вверх
Nic442
Дата 30.4.2006, 00:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 5.4.2006
Где: Советский Союз

Репутация: нет
Всего: нет



Я то кину. Но ошибка то точно в том коде который я написал сверху. Я даже знаю почему, но как исправить??? 
Ведь Reopen1.IndexOf(Sender as TMenuItem)=-1 А он не может удалить несуществующий пункт меню (Reopen1.Delete[-1]) Но как только я ставлю сообщение, то даже пр -1 всё делает правильно.


Код

procedure TIndex_Form.Reopen1_files(Sender: TObject);
var
   NewItem: TMenuItem;
   str:string;
begin
   NewItem:=(Sender as TMenuItem);
   MessageDlg('1',mtWarning,[mbOk],0);
   Reopen1.Delete(Reopen1.IndexOf(Sender as TMenuItem));
   Reopen1.Insert(0,NewItem);
   str:=StringReplace((Sender as TMenuItem).Caption,'&','',[rfReplaceAll]);
   File_Reopen(NIL, str);
end;

procedure TIndex_Form.File_Reopen(Sender: TObject; openfile: string);
var
   stroka: ShortString;
begin
try
  if tab_text1.PageCount<=199 then begin
    Screen.Cursor:= crHourGlass;
    File_NewExecute(File_Open);
    text_GL[tab_text1.ActivePageIndex].Lines.LoadFromFile(openfile);
    stroka:='';
    stroka:=ExtractFileName(openfile);
    if Length(stroka)>=22 then
       stroka:=copy(stroka, 1, 20)+'..'+ExtractFileExt(stroka);
    tab_text1.ActivePage.Caption:=stroka;
    text_GL[tab_text1.ActivePageIndex].Modified:=false;
    file_names.Items.Add(IntToStr(tab_text1.PageCount)+': '+openfile);
    file_names.ItemIndex:=tab_text1.PageCount-1;
    text_GL[tab_text1.ActivePageIndex].hint :='Дата обновления: '
                     +DateTimeToStr(FileDateToDateTime(FileAge(openfile)));
    tab_text1.ActivePage.ImageIndex:=1;
  end else
    MessageDlg('Ошибка! Нельзя одновременно открыть больше 200 окон.'+#10#13
               +'Закройте одно из окон и повторите попытку.',mtError, [mbOK],0);
except
     file_names.Items.Delete(tab_text1.PageCount);
     tab_text1.ActivePage.free;
     i:=i-1;
     MessageDlg('Ошибка при открытия файла "'+openfile+'".',mtError, [mbOK],0);
end; {try .. except}
Screen.Cursor:= crDefault;
Timer_textTimer(OpenDialog);

end;
 
PM MAIL   Вверх
Sunvas
Дата 30.4.2006, 00:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 28
Всего: 89



Цитата(Nic442 @  30.4.2006,  00:19 Найти цитируемый пост)
 Reopen1.Delete(Reopen1.IndexOf(Sender as TMenuItem));  // ОШИБКА

Нужно так
Код

if (Sender is TMenuItem) then Reopen1.Delete(Reopen1.IndexOf(Sender as TMenuItem));


Цитата(Nic442 @  30.4.2006,  00:19 Найти цитируемый пост)
Но весь прикол в том что если я добавляю MessageDlg('1',mtWarning,[mbOk],0);

Че-то я не совесем понял - куда добавишь?? 


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Nic442
Дата 30.4.2006, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 5.4.2006
Где: Советский Союз

Репутация: нет
Всего: нет



Sunvas, В коде на самом верху закоментарено куда,,, 

Ошибка не исправилась :-( 

Это сообщение отредактировал(а) Nic442 - 30.4.2006, 00:56
PM MAIL   Вверх
Sunvas
Дата 30.4.2006, 00:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 28
Всего: 89



Цитата(Nic442 @  30.4.2006,  00:52 Найти цитируемый пост)
Sunvas, В коде на самом верху закоментарено куда,,, 

Да. Не увидел..
Ну а с моим кодом-то работает? 


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Nic442
Дата 30.4.2006, 01:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 5.4.2006
Где: Советский Союз

Репутация: нет
Всего: нет



Не, тоже самое. Вообще непонятно.
Ошибка не исправилась :-( 
 
PM MAIL   Вверх
Sunvas
Дата 30.4.2006, 01:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 28
Всего: 89



Цитата(Nic442 @  30.4.2006,  00:44 Найти цитируемый пост)
едь Reopen1.IndexOf(Sender as TMenuItem)=-1 А он не может удалить несуществующий пункт меню (Reopen1.Delete[-1])

Ну так проверяй - если не равен -1 то удаляй.

Цитата(Nic442 @  30.4.2006,  00:44 Найти цитируемый пост)
Но как только я ставлю сообщение, то даже пр -1 всё делает правильно.

Видать глюк какой-то.. 


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Nic442
Дата 30.4.2006, 01:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 5.4.2006
Где: Советский Союз

Репутация: нет
Всего: нет



Код

Ну так проверяй - если не равен -1 то удаляй. 

Не могу, иначе кнопка в баре будет не нужна.
Так дело в том что -1 идёт от ToolButton при нажатии на Toolbutton на любом пункте выдвигающегося меню. 
PM MAIL   Вверх
Демо
Дата 30.4.2006, 01:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Что такое Reopen1? 


--------------------
    
PM MAIL ICQ Skype   Вверх
Nic442
Дата 30.4.2006, 01:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 5.4.2006
Где: Советский Союз

Репутация: нет
Всего: нет



Файл-->Reopen1-->NewItem
Reopen1 находится в меню, и включает в себя  Items 
PM MAIL   Вверх
Демо
Дата 30.4.2006, 01:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1278
Регистрация: 3.11.2005

Репутация: 30
Всего: 50



Выполни вот это и исходи из того, что Sendere у тебя не TMenuItem:

Код

procedure TIndex_Form.Reopen1_files(Sender: TObject);    
var    
   NewItem: TMenuItem;    
   str:string;    
begin
  ShowMessage(Sender.ClassName);
 


--------------------
    
PM MAIL ICQ Skype   Вверх
Sunvas
Дата 30.4.2006, 01:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 28
Всего: 89



Знаешь Nic442, я думаю это 1 из реальных глюков Борланда.. Попробуй другие компоненты поиспользовать или пойти другим путем..

ЗЫ. У меня даже банальный текст 
Код

showmessage(inttostr(n1.IndexOf(n2)));

на тулбаттоне показывает -1.

Добавлено @ 01:56 
Цитата(Демо @  30.4.2006,  01:47 Найти цитируемый пост)
Выполни вот это и исходи из того, что Sendere у тебя не TMenuItem:

Да нет! Именно Tmenuitem!

Цитата(Демо @  30.4.2006,  01:47 Найти цитируемый пост)
ShowMessage(Sender.ClassName);

Зачем это smile  


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Nic442
Дата 30.4.2006, 02:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 5.4.2006
Где: Советский Союз

Репутация: нет
Всего: нет



ShowMessage(Sender.ClassName);

Имя класса я тоже решил поглядеть. При нажатии на ToolButton и выборе у него пункта меню выдаёт TMenuItem

Добавлено @ 02:07 
Я думаю такая фигня происходит. При нажатии на ToolButton и выборе у него пункта меню. Он посылает какое-то сообщение в меню. Но индекс остаётся -1  

Это сообщение отредактировал(а) Nic442 - 30.4.2006, 02:03
PM MAIL   Вверх
Sunvas
Дата 30.4.2006, 02:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 28
Всего: 89



Цитата(Nic442 @  30.4.2006,  02:00 Найти цитируемый пост)
Я думаю такая фигня происходит. При нажатии на ToolButton и выборе у него пункта меню. Он посылает какое-то сообщение в меню. Но индекс остаётся -1  

Токо меню ведь одно и тоже самое! Я проверял. 


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0917 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.