Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 27.01.2011, 06:11
Doctor_Che Doctor_Che вне форума
Прохожий
 
Регистрация: 25.01.2011
Сообщения: 36
Репутация: 10
По умолчанию Подменю Reopen в меню File

Как выполнить следующее?

Команда Open открывает диалоговое окно открытия файла и, в случае выбора файла, добавляет его в подменю Reopen в качестве нулевого пункта и помечает этот пункт. При добавлении нового имени весь список имён смещается вниз.
В обработчике события OnClick пункта меню Open должно быть реализовано следующее:
Открывается диалоговое окно открытия файла. Если пользователь выбрал файл для открытия, то выполняется следующее:

Для пункта Reopen (максимальный размер которого ограничен 4 пунктами) необходимо:
- Установить доступность.
- Выполнить смещение в имеющемся списке имен файлов на одну позицию вниз с сохранением свойства Visible от предыдущего элемента. При смещении списка изменяется нумерация в названии пунктов меню. Для изменения этой нумерации используйте процедуру Delete из модуля System.
- В качестве нулевой строки вложенного меню установить подчеркнутую цифру 0, а за ней полное имя файла, полученное из диалогового окна. Свойство Visible этой строки установить равным True.
- Убрать старую пометку в списке имен файлов и установить пометку в нулевой строке.

Сделал вот так. Дальше не идёт...
Код:
procedure TForm1.Open1Click(Sender: TObject);
begin
  OpenDialog1.Execute;
  Save1.Enabled := True;
  SaveAs1.Enabled := True;
  Close1.Enabled := True;
  Reopen1.Enabled := True;
  Reopen1.Items[0].Visible:= True;
  Reopen1.Items[0].Caption:= OpenDialog1.FileName;
  Reopen1.Items[0].Checked:= True;
end;
Ответить с цитированием
  #2  
Старый 27.01.2011, 08:08
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Вот примерно так, но код не проверял, писал на коленке:
Код:
procedure TForm1.Open1Click(Sender: TObject);
Var i: Integer;
begin
  if not OpenDialog1.Execute then Exit;
  Save1.Enabled := True;
  SaveAs1.Enabled := True;
  Close1.Enabled := True;
  Reopen1.Enabled := True;
  Reopen1.Items[0].Caption := '0:' + OpenDialog1.FileName;
  for i := 3 downto 1
  do begin
      if Reopen1.Items[i-1].Caption = '' then Continue;  
      Reopen1.Items[i].Caption := Reopen1.Items[i-1].Caption;
      Delete(Reopen1.Items[i].Caption,1,1);
      Reopen1.Items[i].Caption := IntToStr(i) + Reopen1.Items[i].Caption;
      end;
end;
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 27.01.2011, 10:59
Аватар для EvilRussian
EvilRussian EvilRussian вне форума
Начинающий
 
Регистрация: 21.12.2010
Адрес: Россия, Красноярский край
Сообщения: 177
Репутация: 22
По умолчанию

Неплохой пример, однако!
А к чему пишешь? Видно, что пишешь оснавательно.
Любопытно!
__________________
Если не ты, то кто?
(с) Терри Пратчетт

Не забывайте ставить плюсы и говорить спасибо!
Ответить с цитированием
  #4  
Старый 27.01.2011, 11:25
Doctor_Che Doctor_Che вне форума
Прохожий
 
Регистрация: 25.01.2011
Сообщения: 36
Репутация: 10
По умолчанию

Изначально поля Reopen1.Items[i].Caption не пустые, а вида '&0 Name0', '&1 Name1', '&2 Name2', '&3 Name3
пытаюсь сделать так, не выходит
Код:
procedure TForm1.Open1Click(Sender: TObject);
Var i: Integer;
    s: String;

begin
  if not OpenDialog1.Execute then Exit;
  Save1.Enabled := True;
  SaveAs1.Enabled := True;
  Close1.Enabled := True;
  Reopen1.Enabled := True;

  for i := 3 downto 1
  do begin
      if not Reopen1.Items[i-1].Caption in ['&0 Name0', '&1 Name1', '&2 Name2', '&3 Name3']
        then Continue;
      Reopen1.Items[i].Caption := Reopen1.Items[i-1].Caption;
      s := Reopen1.Items[i].Caption;
      Delete(s,2,1);
      Reopen1.Items[i].Caption := IntToStr(i) + s;
      Reopen1.Items[i].Visible:= True;
  end;

  Reopen1.Items[0].Caption := '&0' + OpenDialog1.FileName;
  Reopen1.Items[0].Visible:= True;
  Reopen1.Items[0].Checked:= True;

  if OpenDialog1.FileName<>'' then Self.Caption := 'Form1' + '  ' +
   ExtractFileName(OpenDialog1.FileName)
    else Self.Caption := 'Form1';

end;
говорит Operator not applicable
Цитата:
if not Reopen1.Items[i-1].Caption in ['&1 Name1', '&2 Name2', '&3 Name3']
Ответить с цитированием
  #5  
Старый 27.01.2011, 13:07
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Нельзя строки в множестве использовать
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #6  
Старый 28.01.2011, 01:14
Doctor_Che Doctor_Che вне форума
Прохожий
 
Регистрация: 25.01.2011
Сообщения: 36
Репутация: 10
По умолчанию

А можно ещё как-то проверить?
Ответить с цитированием
  #7  
Старый 28.01.2011, 02:40
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,096
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от Doctor_Che
А можно ещё как-то проверить?

Можно хранить список где-то в памяти и из пунктов меню просто ссылаться на этот список (кстати. из пунктов списка так-же можно ссылаться на соотв. пункты меню). тогда тебе не надо будет мучаться с меню, а просто работать со списком строк. А все меню reopen можно просто пересоздавать полностью (некрасиво, но более надежно).
Ответить с цитированием
  #8  
Старый 28.01.2011, 03:11
Doctor_Che Doctor_Che вне форума
Прохожий
 
Регистрация: 25.01.2011
Сообщения: 36
Репутация: 10
По умолчанию

Не получается создать нормальную нумерацию в подменю.
Пока что удалил свойства Caption из Reopen1.Items[i].Caption
Получилось вот что
Код:
procedure TForm1.Open1Click(Sender: TObject);
Var i: Integer;
    s: String;
 
begin
  if not OpenDialog1.Execute then Exit;
  Save1.Enabled := True;
  SaveAs1.Enabled := True;
  Close1.Enabled := True;
  Reopen1.Enabled := True;
  for i := 3 downto 1
  do begin
      if Reopen1.Items[i-1].Caption = '' then Continue;
      Reopen1.Items[i].Caption := Reopen1.Items[i-1].Caption;
      s := Reopen1.Items[i].Caption;
      MessageDlg(IntToStr(i) + 's=' + s, mtInformation, [mbOK], 0);
      Delete(s,1,1);
      MessageDlg(IntToStr(i) + 's delete=' + s, mtInformation, [mbOK], 0);
      Reopen1.Items[i].Caption := IntToStr(i) + s;
      Reopen1.Items[i].Visible:= True;
  end;
 
  Reopen1.Items[0].Caption := '0 ' + OpenDialog1.FileName;
  Reopen1.Items[0].Visible:= True;
  Reopen1.Items[0].Checked:= True;
 
  if OpenDialog1.FileName<>'' then Self.Caption := 'Form1' + '  ' +
   ExtractFileName(OpenDialog1.FileName)
    else Self.Caption := 'Form1';
end;

Получается вот что:
После открытия первого файла
1_1.png
переменная s принимает значение
2_1.png
"0 имя файла"
! Ноль подчеркнут
после
Код:
Delete(s,1,1);
переменная s принимает значение
3_1.png
"0 имя файла"
! Ноль НЕ подчеркнут
А в подменю записывается вот-так
4_1.png
Как создать нормальную нумерацию: 0, 1, 2, 3?
И что бы цифра была подчеркнута.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 03:37.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025