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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 05.08.2015, 07:52
Gareth Gareth вне форума
Активный
 
Регистрация: 21.03.2013
Адрес: Приднестровье
Сообщения: 202
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Проблема с динамическим событием

Здравствуйте!

Пытаюсь на динамической кнопке (SpeedButton) сделать обработчик события Onclick. В котором данный код:
Код:
var
   Icon : TIcon;
   IconIndex: Word;
begin

  if S[SensonTag]='' then
    begin
     if  sOpenDialog1.Execute then
    begin
       S[SensonTag]:=sOpenDialog1.FileName;
         Q[SensonTag].Glyph:=nil;
         Icon:=TIcon.Create;

         StrPCopy (Pch,S[IntToStr(SensonTag)]  );
         Icon.Handle:= ExtractAssociatedIcon(hInstance, Pch, IconIndex);
         Q[SensonTag].Glyph.Width:= Icon.Width;
         Q[SensonTag].Glyph.Height:= Icon.Height;
         Q[SensonTag].Glyph.Canvas.Draw(0, 0, Icon);
         Q[SensonTag].Caption:=ExtractFileName(s[1]);
         Icon.Free;
    end;

      end
      else
          begin
          ShellExecute (Form1.Handle, nil,PChar(S[IntToStr(SensonTag)]), nil, nil, SW_RESTORE);
          end;
end;


Переменные:
Код:
  Q:array [1..25] of  TSpeedButton;
  S:array [1..25] of string;
  I,SensonTag  :Integer; 
   Pch: array[0..256] of Char;

Хочу сделать, что бы по клику динамической кнопки, происходил выбор программы(или любого другого файла) через Opendialog1, далее запуск выбранной программы...

При наведении на динамическую кнопку, в переменную SensorTag передается Tag кнопки. По этому в коде всё ссылается на данную переменную.

У меня проблема в 14 строке. Мне нужно указать в массиве S[] переменную SensorTag. Я пробовал так как в коде - вылетает ошибка.
Пробовал переставлять IntToStr, думая что не там написал - не помогло.

Так же проблема в 26 строке, конкретно в этом отрывке PChar(S[IntToStr(SensonTag)])
Опять же, пытаюсь впихнуть переменную в String массив.

Помогите пожалуйста. Что делаю не так ?
Ответить с цитированием
  #2  
Старый 05.08.2015, 09:40
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

ну для начала, что это такое?

S[IntToStr(SensonTag)] - преобразование числа в строку, а потом пытаемся взять элемент массива с индексом, равным этой строке???.
надо так
S[SensonTag],как правильно сделано в 10 строке.



А саму функцию желательно начинать так

Код:
procedure TForm1.SpeedButtonClick(Sender:TObject);

begin
  SensonTag:=TComponent(Sender).Tag;

А с глифами - много лишней работы

Итого
Код:
procedure TForm1.SpeedButtonClick(Sender:TObject);
var
   Icon : TIcon;
   IconIndex: Word;
begin
  SensonTag:=TComponent(Sender).Tag; 
  if S[SensonTag]='' then
  begin
    if  sOpenDialog1.Execute then
    begin
      S[SensonTag]:=sOpenDialog1.FileName;
      Icon:=TIcon.Create;
      try// приучись писать try-finally для такого использования
         StrPCopy ( Pch, S[SensonTag]  );
         Icon.Handle:= ExtractAssociatedIcon(hInstance, Pch, IconIndex);
         Q[SensonTag].Glyph:=Icon;//внутри этого присваивания делается всё то, что ты написал
         Q[SensonTag].NumGlyphs:= 1;//без этого могут быть глюки
         Q[SensonTag].Caption:=ExtractFileName(s[SensonTag]);
      finally//!!!!!!!1
        Icon.Free;
      end;//!!!!!!!!!
    end;
  end
  else
  begin
     ShellExecute (Form1.Handle, nil,PChar(S[SensonTag]), nil, nil, SW_RESTORE);
   end;
end;
Ответить с цитированием
Этот пользователь сказал Спасибо icWasya за это полезное сообщение:
Gareth (05.08.2015)
  #3  
Старый 05.08.2015, 12:50
Gareth Gareth вне форума
Активный
 
Регистрация: 21.03.2013
Адрес: Приднестровье
Сообщения: 202
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от icWasya
ну для начала, что это такое?

S[IntToStr(SensonTag)] - преобразование числа в строку, а потом пытаемся взять элемент массива с индексом, равным этой строке???.
надо так
S[SensonTag],как правильно сделано в 10 строке.
Попробовал, выдает ошибку в 16 строке вашего кода.
Incompatible types: 'TBitmap' and 'TIcon'
Цитата:
Сообщение от Ildar-tsr
Вообще glyph воспринимает только формат .bmp, а ты в него .ico засунуть пытаешься.
С глифами вернул назад как было - работает.
Спасибо Вам!

И еще 1 вопрос.. У меня будет 25 кнопок. При создании им выдается Tag по возрастанию.
Допустим их всего 5, я удалю 3-ю кнопку.. Получится что на форме 4 кнопки, 1,2,4,5. Как на событие удаление кнопки, сделать перебор так сказать всех существующих кнопок на форме, и задать им правильный Tag? Что бы было 1,2,3,4 а не 1,2,4,5?

Последний раз редактировалось Gareth, 05.08.2015 в 13:29.
Ответить с цитированием
  #4  
Старый 05.08.2015, 14:45
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Код:
 for i :=0 to ControlCount-1 do
  if Controls[i] is TSpeedButton then
    TSpeedButton(Controls[i]).Tag:=..
Ответить с цитированием
Этот пользователь сказал Спасибо icWasya за это полезное сообщение:
Gareth (05.08.2015)
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter