Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.06.2008, 17:39   #1
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,239
Стрелка Метка в динамически созданных пунктах MainMenu

Пользуюсь AlphaControl v5.50.
При загрузке программы, когда создаются кномки в MainMenu с именами файлов скинов, я ставлю программно метку(Chk) на тот пункт что соответствует выбраному скину. Но метка непоявляется, может задавить метку подругому?
Пункты создаются динамически, метка присваивается при создании пункта меню:
Код:
procedure TForm1.MenuAddItm(Lst :TStrings; Mi :TMenuItem);
Var I,II, N :LongInt; Itm :TMenuItem;
begin //добавить кнопки в меню
 If (Lst=nil)Or(Mi=Nil)Or(Lst.Count<=0) Then exit;
  II:=Lst.Count;
 for I:=0 to II-1 do
 begin
  Itm := TMenuItem.Create(Mi);
  Itm.Caption := Lst.Strings[I];
  Itm.OnClick := SkinClk;
   Mi.Add(Itm);
  if UpCaseAll(Lst.Strings[I])=UpCaseAll(SkinNam) then
  begin
   Itm.Checked := True;
   ActSknMenu := Itm; 
  end;
 end;
end;
Вот вырезка из кода(та что стрит меню по списку и ставит метку):
Код:
…………………………………………………..
type
  TForm1 = class(TForm)
    N29: TMenuItem;
  Private
  Public
   SknLst :TStrings; //Список скин файлов
   AppPath :String; // Путь до Программы
   ActSknMenu :TMenuItem; //последний выбранный скин
   SkinNam :String; //имя выбраного скина
   Procedure SkinClk(Sender :TObject);
   Procedure MenuAddItm(Lst :TStrings; Mi :TMenuItem);
 end;
……………………………………………………
  function UpCaseAll(x :string):string;
……………………………………………………

procedure TForm1.FormCreate(Sender: TObject);
begin
 ActSknMenu := Nil;
 ActSknMenu := TMenuItem.Create(Form1);
 SkinNam := '';
 AppPath := ExtractFilePath(ParamStr(0));
   SknLst := TStringList.Create;   SknLst.Clear;
   sSkinManager1.GetSkinNames(SknLst); // список скин файлов
 If SknLst.Count>0 Then
 SknLst.Insert(0, 'Нет скина');
    MenuAddItm(SknLst, N29);

Ini:=TiniFile.Create(AppPath + MainINI);
If ini.ReadBool(SknSek, SknActiv, False) then 
 begin
   N29.Visible := True;
  If (Ini.ReadString(SknSek, SknName, '')<>'')And
   FileExists(AppPath+SknDir+Ini.ReadString(SknSek, SknName, '')+'.asz') then
  begin 
   SkinNam := Ini.ReadString(SknSek, SknName, '');
   sSkinManager1.SkinName := SkinNam;
   sSkinManager1.Active := True;
   N29.Visible := True;
  end
   Else
  begin //доступа к файлу нет
   sSkinManager1.Active := False;
   N29.Visible := False;
   MessageBox(Handle, 'Скин-файл недоступен, или неправильное имя файла!',
              'Ошибка загрузки скин файла', MB_OK+MB_ICONWARNING);
  end;
 end
  Else
 begin
  sSkinManager1.Active := False;
  N29.Visible := False;
 end;
Ini.Free;
End;
 
Procedure TForm1.MenuAddItm(Lst :TStrings; Mi :TMenuItem);
Var I,II, N :LongInt; Itm :TMenuItem;
begin //добавить кнопки в меню
 If (Lst=nil)Or(Mi=Nil)Or(Lst.Count<=0) Then exit;
  II:=Lst.Count;
 For I:=0 To II-1 Do
 begin
  Itm := TMenuItem.Create(Mi);
  Itm.Caption := Lst.Strings[I];
  Itm.OnClick := SkinClk;
   Mi.Add(Itm);
  if UpCaseAll(Lst.Strings[I])=UpCaseAll(SkinNam) then
  begin
   Itm.Checked := True;
   ActSknMenu := Itm; 
  end;
 end;
end;
 
Procedure TForm1.SkinClk(Sender :TObject);
var S :String;
begin //событие выбора скина
 S := TMenuItem(Sender).Caption;
 If Pos('&', S)>0 then //удаляем символ "&"
  Delete(S, Pos('&', S), 1);
 If S<>'Нет скина' Then
 Begin
  IF FileExists(AppPath+SknDir+S+'.asz') then 
  begin
   If sSkinManager1.Active=False Then //скины отключены, включаем
    sSkinManager1.Active := True;
   ActSknMenu.Checked := False; //Удалим старую метку
   sSkinManager1.SkinName := S; //Присвоим другой скин
   TMenuItem(Sender).Checked := True; //Пометим выбранный пункт
   ActSknMenu := TMenuItem(Sender); //Запомним выбранный пункт
    //запись имя файла
   Ini := TIniFile.Create(AppPath + MainINI);
    Try
   Ini.WriteString(SknSek, SknName, S);
    Finally
   Ini.Free;
    End;
  end
   Else
  MessageBox(Handle, 'Скин-файл недоступен, или неправильное имя файла!',
             'Ошибка загрузки скин файла', MB_OK+MB_ICONWARNING);
 End
  Else
 begin //убрать скин
  ActSknMenu.Checked := False; 
   sSkinManager1.Active := False; 
  TMenuItem(Sender).Checked := True; 
  ActSknMenu := TMenuItem(Sender); 
    //запись Отключения скина
   Ini := TIniFile.Create(AppPath + MainINI);
    Try
   Ini.WriteBool(SknSek, SknActiv, False);
    Finally
   Ini.Free;
    End;
 end;
end;
 
function UpCaseAll(x :string):string;
var
  b, w: integer;
  str: string;
begin
  for w := 1 to length(x) do
  begin
    b := ord(x[w]);
    case b of
      0..96, 123..183: x[w] := chr(b);
      97..122: x[w] := UpCase(chr(b));
      184: x[w] := chr(168);
      185..223: x[w] := chr(b);
      224..255:
        begin
          b := b - (Ord('а') - Ord('А'));
          x[w] := chr(b);
        end;
    end;
    str := str + x[w];
  end;
 UpCaseAll := str;
end;
Alter вне форума Ответить с цитированием
Старый 30.06.2008, 20:19   #2
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Не сразу въехал что за метки, начал метки в коде искать ))

Галка в пункте меню, о ней речь? Должна появляться, отладь на тестовом проекте, только меню сделай, а то в этом у тебя много очень кода. Я часто так делаю когда что-то не клеится.

Галка ставится свойством Checked, это точно. Значит просто до адресата не доходит, неправильно обращаешься.
TMenuItem(Sender).Checked := True; вот это смущает, попробуй иначе.

Или при стандартном интерфейсе ставится, а со скином нет? Уточни.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 30.06.2008, 21:49   #3
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,239
Сообщение

Галочка должна появляться при совпадении имени из списка, с именем активного скина(читается из настроек).
Я думаю что что-то неправильно тут написал:
Код:
  Itm := TMenuItem.Create(Mi);   
  Itm.Caption := Lst.Strings[i];   
  Itm.OnClick := SkinClk;   
   Mi.Add(Itm);   
  if UpCaseAll(Lst.Strings[i])=UpCaseAll(SkinNam) then  
  begin  
   Itm.Checked := True;   // вот галочка в добавляемый пункт
   ActSknMenu := Itm;    
  end;
TMenuItem(Sender).Checked := True; <= Это работает, дело не в нём.

При стандартном интерфейсе, пункт выбора скина, вообще недолжен быть виден и он недолжен строиться в принципе.
Вот скрин, с отсутствием метки(хотя выбрат скин: Office12Style):

Последний раз редактировалось Alter; 30.06.2008 в 22:19.
Alter вне форума Ответить с цитированием
Старый 30.06.2008, 22:07   #4
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Поставь точку останова на ту строку где галочка ставится и запусти, если не остановится, значит не выполняется условие UpCaseAll(Lst.Strings[i])=UpCaseAll(SkinNam), или добавь туда ShowMessage третьей строкой. Вобщем отладить нужно и все заработает.

Я для смены регистра использовал AnsiLowerCase, AnsiUpperCase.

Еще попробуй добавлять - Mi.Add(Itm); в последнюю очередь (4-ю строку перенеси в конец). После всех манипуляций с айтемом. А потом обращайся к нему уже по индексу.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог

Последний раз редактировалось mutabor; 30.06.2008 в 22:17.
mutabor вне форума Ответить с цитированием
Старый 30.06.2008, 22:51   #5
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,239
Сообщение

Всё исправил, ошибка была в другом месте, просто SkinNam заполнялся позднее чем создаются пункты меню.
Alter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Логотипы-метка сайта Принц HTML и CSS 1 30.05.2008 13:37
mainmenu prizrak1390 Общие вопросы Delphi 3 17.03.2008 13:08
MainMenu Небесный Общие вопросы Delphi 5 27.11.2007 23:17
MainMenu merax Компоненты Delphi 2 07.02.2007 10:51