Delphi speedbutton картинка - IT Справочник
Llscompany.ru

IT Справочник
4 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Delphi speedbutton картинка

Delphi speedbutton картинка

Кнопки SpeedButton имеют возможность отображения пиктограмм и могут использоваться как обычные управляющие кнопки или как кнопки с фиксацией нажатого состояния (см. на рис. 5.1). Обычно они используются в качестве быстрых кнопок, дублирующих различные команды меню, и в инструментальных панелях, в которых требуется фиксация нажатого состояния.

У кнопок SpeedButton, как и у других кнопок, имеется свойство Caption — надпись, но в этих кнопках оно обычно оставляется пустым, так как вместо надписи используется пиктограмма.

Изображение на кнопке задается свойством Glyph точно так же, как описано в разделе 5.2 для кнопок BitBtn. И точно так же свойство NumGlyphs определяет число используемых пиктограмм, свойства Layout и Margin определяют расположение изображения, а свойство Spacing — расстояние между изображением и надписью (если, конечно, вы все-таки хотите использовать надпись на кнопке).

Особенностью кнопок SpeedButton являются свойства GroupIndex (индекс группы), AllowAllUp (разрешение отжатого состояния всех кнопок группы) и Down (исходное состояние — нажатое). Если GroupIndex = 0, то кнопка ведет себя так же, как Button и BitBtn. При нажатии пользователем кнопки она погружается, а при отпускании возвращается в нормальное состояние. В этом случае свойства AllowAllUp и Down не влияют на поведение кнопки.

Если Grouplndex > 0 и AllowAllUp = true, то кнопка при щелчке пользователя на ней погружается и остается в нажатом состоянии. При повторном щелчке пользователя на кнопке она освобождается и переходит в нормальное состояние (именно для того, чтобы освобождение кнопки состоялось, необходимо задать AllowAllUp = true). Если свойство Down во время проектирования установлено равным true, то исходное состояние кнопки — нажатое.

Если есть несколько кнопок, имеющих одинаковое ненулевое значение GroupIndex, то они образуют группу взаимосвязанных кнопок из которых нажатой может быть только одна. Если одна кнопка находится в нажатом состоянии и пользователь щелкает на другой, то первая кнопка освобождается, а вторая фиксируется в нажатом состоянии. Поведение нажатой кнопки при щелчке на ней зависит от значения свойства AllowAllUp. Если оно равно true, то кнопка освободится, поскольку в этом случае возможно состояние, когда все кнопки группы отжаты. Если же AllowAllUp равно false, то щелчок на нажатой кнопке не приведет к изменению вида кнопки. Впрочем, и в этом случае, как и при любом щелчке на кнопке, возникает событие OnClick, которое может быть обработано.

Состояние кнопки во время выполнения можно определить по значению свойства Down: если значение равно true, то кнопка нажата. Во время события OnClick значение Down уже равно тому состоянию, которое примет кнопка в результате щелчка на ней.

Delphi speedbutton картинка

Привет мастерам.
Изменение картинки в SpeedButtonе.
Организую работу с документом. Документ может быть в положение на доработке(1), на проверку(2), закрыть(3), закончен(4). Для каждого случая есть свая картинка и для каждого состояния есть свой ключ состояния. В компоненте ImageList загрузил подходящие картинки. Как можно изменить картинки в SpeedButtonе по ключу состояния. Например есть документ с ключом состояния 1, и когда выбирается документ в SpeedButtonе отражался картинка из ImageList а с индексом 1.


Palladin © ( 2011-02-24 10:05 ) [1]

а поменять индекс религия не позволят?


Xmen ( 2011-02-24 10:38 ) [2]


> а поменять индекс религия не позволят?

А где именно, я не нашел этот пункт и как можно связать SpeedButton и ImageList


Ywoman ( 2011-02-24 10:58 ) [3]

Ищи. Там есть. Точно. Так что ищи. Ищущий да обрящет.


И. Павел © ( 2011-02-24 11:40 ) [4]

> [3] Ywoman (24.02.11 10:58)
> Ищи. Там есть. Точно. Так что ищи. Ищущий да обрящет.

Если у ищущего Delphi 7 и SpeedButton не связан с Action, то не обрящет.


И. Павел © ( 2011-02-24 11:46 ) [5]

> Xmen

Попробуйте эту функцию. Писал давно. Необходимость возникала из за того, что при смене ImageIndex в Action не менялся глиф на кнопке. Параметры: битмап вашей кнопки, ImageList и индекс картинки в ImageList, которую нужно разместить на кнопке.

procedure TMainForm.SetImage(B:TBitmap; IL:TImageList; Index:integer);
var Bitmap:Graphics.TBitmap;
begin
Bitmap:=Graphics.TBitmap.Create;
try
Bitmap.Width:=IL.Width;
Bitmap.Height:=IL.Height;
IL.Draw(Bitmap.Canvas, 0, 0, Index);
B.Assign(Bitmap);
finally
Bitmap.Free;
end;
end;


И. Павел © ( 2011-02-24 11:47 ) [6]

> битмап вашей кнопки

Ну т.е. свойство Glyph.


Ywoman ( 2011-02-24 11:51 ) [7]

Читать еще:  Ячейка таблицы ссылка css

procedure TMainForm.SetImage(B:TBitmap; IL:TImageList; Index:integer);
begin
IL.Draw(B.Canvas, 0, 0, Index);
end;


И. Павел © ( 2011-02-24 12:10 ) [8]

> [7] Ywoman (24.02.11 11:51)

Вы прочитали, то что я написал в [5]? Там я написал, почему это не работает.


Xmen ( 2011-02-24 15:10 ) [9]

Всем спосибо
Особенно Гуглу.

ImageList1.Tag := ImageList1.Tag + 1;
SpeedButton1.Glyph.Assign(nil);
ImageList1.GetBitmap(ImageList1.Tag,SpeedButton1.Glyph);


Xmen ( 2011-02-25 13:10 ) [10]

Дополнительный вопрос.
при смены картинки в SpeedButton1 картинки получаются в белом фоне хотя они в ImageList1 прозрачные.


KilkennyCat © ( 2011-02-25 13:14 ) [11]

указать цвет прозрачности, или использовать clMaroon фоном


Xmen ( 2011-02-25 13:54 ) [12]

Это где нужно указать
в ImageList1 при изменении?
или SpeedButton1


Renderer ( 2011-02-25 23:19 ) [13]

> в ImageList1 при изменении?
> или SpeedButton1

Какой-то из тебя программист ну совсем плохой.
С причинно-следственными связями у тебя совсем туго.
Садись и думай: прозрачность чего тебе нужна?
Пока не придумаешь — даже не появляйся.


Xmen ( 2011-02-28 08:14 ) [14]


> Какой-то из тебя программист ну совсем плохой.С причинно-
> следственными связями у тебя совсем туго.Садись и думай:
> прозрачность чего тебе нужна?Пока не придумаешь — даже
> не появляйся.

Мне прозрачность в SpeedButton1 нужен.
а в ImageList1 все картинки прозрачные. Когда я их использую в кнопках то нормально получается. Если я программно меняю картинки в SpeedButton1не то картинки получаются в белом фоне 🙁


sniknik © ( 2011-02-28 09:27 ) [15]

> а в ImageList1 все картинки прозрачные.
у битмапа нет призрачности. в ImageList это просто тебе так их отображают. т.что хочешь не хочешь, а подумать насчет призрачности SpeedButton-е придется.


Dennis I. Komarov © ( 2011-02-28 11:27 ) [16]

SpeedButton.Visible := not(1 and 4 = 0) ; — полная прозрачность 🙂


Xmen ( 2011-02-28 14:33 ) [17]


> SpeedButton.Visible := not(1 and 4 = 0) ; — полная прозрачность
> 🙂

Шутка?


> у битмапа нет призрачности. в ImageList это просто тебе
> так их отображают. т.что хочешь не хочешь, а подумать насчет
> призрачности SpeedButton-е придется.

У меня картинки в формате png.


sniknik © ( 2011-02-28 14:36 ) [18]

> У меня картинки в формате png.
на диске, в файлах, может быть. но файл не есть битмап.


Xmen ( 2011-02-28 15:03 ) [19]

Ну блин где же его поставит прозрачность не мог пока найти


Renderer ( 2011-02-28 16:01 ) [20]

> Xmen (28.02.11 14:33) [17] Шутка?

Вполне корректный ответ на твой совсем некорректный вопрос.

> Xmen (28.02.11 15:03) [19] Ну блин где же его поставит прозрачность не мог пока найти

Delphi speedbutton картинка

Кнопки SpeedButton имеют возможность отображения пиктограмм и могут использоваться как обычные управляющие кнопки или как кнопки с фиксацией нажатого состояния (см. на рис. 5.1). Обычно они используются в качестве быстрых кнопок, дублирующих различные команды меню, и в инструментальных панелях, в которых требуется фиксация нажатого состояния.

У кнопок SpeedButton, как и у других кнопок, имеется свойство Caption — надпись, но в этих кнопках оно обычно оставляется пустым, так как вместо надписи используется пиктограмма.

Изображение на кнопке задается свойством Glyph точно так же, как описано в разделе 5.2 для кнопок BitBtn. И точно так же свойство NumGlyphs определяет число используемых пиктограмм, свойства Layout и Margin определяют расположение изображения, а свойство Spacing — расстояние между изображением и надписью (если, конечно, вы все-таки хотите использовать надпись на кнопке).

Особенностью кнопок SpeedButton являются свойства GroupIndex (индекс группы), AllowAllUp (разрешение отжатого состояния всех кнопок группы) и Down (исходное состояние — нажатое). Если GroupIndex = 0, то кнопка ведет себя так же, как Button и BitBtn. При нажатии пользователем кнопки она погружается, а при отпускании возвращается в нормальное состояние. В этом случае свойства AllowAllUp и Down не влияют на поведение кнопки.

Если Grouplndex > 0 и AllowAllUp = true, то кнопка при щелчке пользователя на ней погружается и остается в нажатом состоянии. При повторном щелчке пользователя на кнопке она освобождается и переходит в нормальное состояние (именно для того, чтобы освобождение кнопки состоялось, необходимо задать AllowAllUp = true). Если свойство Down во время проектирования установлено равным true, то исходное состояние кнопки — нажатое.

Если есть несколько кнопок, имеющих одинаковое ненулевое значение GroupIndex, то они образуют группу взаимосвязанных кнопок из которых нажатой может быть только одна. Если одна кнопка находится в нажатом состоянии и пользователь щелкает на другой, то первая кнопка освобождается, а вторая фиксируется в нажатом состоянии. Поведение нажатой кнопки при щелчке на ней зависит от значения свойства AllowAllUp. Если оно равно true, то кнопка освободится, поскольку в этом случае возможно состояние, когда все кнопки группы отжаты. Если же AllowAllUp равно false, то щелчок на нажатой кнопке не приведет к изменению вида кнопки. Впрочем, и в этом случае, как и при любом щелчке на кнопке, возникает событие OnClick, которое может быть обработано.

Читать еще:  Ячейка ссылка css

Состояние кнопки во время выполнения можно определить по значению свойства Down: если значение равно true, то кнопка нажата. Во время события OnClick значение Down уже равно тому состоянию, которое примет кнопка в результате щелчка на ней.

SpeedButton — кнопка быстрого доступа в Дельфи

Кнопка быстрого доступа представлена в Delphi компонентом SpeedButton, который по своему виду и функциональным возможностям в общем похож на кнопку с рисунком BitBtn. Однако, в отличие от кнопки с рисунком, кнопка SpeedButton происходит от класса TGraphicControl и является неоконным элементом управления. Поэтому кнопка быстрого доступа не может получать фокус ввода, но зато требует для своего функционирования меньше ресурсов, чем другие виды кнопок. Наиболее часто кнопки быстрого доступа, или быстрые кнопки, применяются для создания панелей инструментов.

Cвойство Down — включена кнопка или нет

В отличие от других кнопок, кнопка SpeedButton может использоваться как переключатель. Поэтому, помимо обычного нажатого состояний, она имеет третье состояние — утопленное, или выбранное (включенное). Включена быстрая кнопка или нет, определяет свойство Down типа Boolean. Если свойство имеет значение True, то кнопка выбрана, если False — не выбрана.

Cвойство GroupIndex — принадлежность кнопки к группе

Использование быстрых кнопок в качестве переключателей имеет определенные особенности. Все быстрые кнопки объединяются в группы, и каждая такая кнопка должна принадлежать к одной из групп. Принадлежность кнопки к группе определяет свойство GroupIndex типа Integer. По умолчанию свойство имеет нулевое значение, и быстрая кнопка не относится к группе. Определяя одинаковое значение для свойств GroupIndex различных кнопок, их можно сгруппировать. При этом все кнопки группы будут работать согласованно — если одна из кнопок выбрана и находится в фиксированном нижнем положении, то выбор других автоматически отменяется. Группирование кнопок снимает необходимость организовывать взаимодействие элементов управления вручную.

На скриншоте показана панель инструментов Форматирование текстового процессора Microsoft Word.

На этой панели зависимыми кнопками, входящими в одну группу, являются кнопки управления выравниванием текста.

Cвойство AllowAllUp

Для случая, когда быстрая кнопка может быть выбрана, свойство AllowAllUp типа Boolean определяет, можно ли повторным щелчком вернуть эту кнопку в невыбранное состояние. Если свойство AllowAllUp имеет значение True, то такое переключение возможно, в противном случае кнопка выключается только при выборе другой кнопки в составе группы. По умолчанию свойство AllowAllUp имеет значение False.

Если кнопка не входит в группу (GroupIndex = о), то она не может работать как переключатель и находиться в выбранном состоянии. Поэтому в случае, когда необходимо, чтобы быстрая кнопка могла находиться во включенном состоянии и работала независимо от других кнопок, создается группа из одной кнопки. С этой целью значению свойства GroupIndex такой быстрой кнопки присваивается уникальный номер, а свойство AllowAllUp устанавливается в значение True.

В связи с тем, что быстрая кнопка по сравнению с кнопкой BitBtn имеет еще одно состояние, рисунок на ее поверхности может состоять не из трех, а из четырех отдельных изображений. Четвертое изображение на ее поверхности появляется в случае, когда кнопка находится в утопленном (выбранном) состоянии (свойство Down имеет значение True). Поэтому для кнопки SpeedButton максимальное значение свойства NumGlyph равно 4.

Delphi SpeedButton (Делфипроблемы)

Хочу на спид баттоне картинку сделать. Там есть свойство Glyph для этого. Но у меня кнопок стопицот штук с одной картинкой, поэтому хочу иметь одну инстанцию картинки и чтобы все кнопки имели указатель на неё.
SpeedButton не умеет работать с ImageList, выдирать картинку из ImageList можно, но ImageList не отдаёт напрямую картинку, а отдаёт её копию в уже созданный Bitmap.
Ладно, я допустим создам свой Bitmap и туда помещу копию нужной мне картинки. Но встаёт проблема с тем, что в реализации SpeedButton сделано так, что когда ты отдаёшь ему глиф, он его копирует у себя. То есть взяв 100 кнопок и присвоив каждой из них один и тот же глиф, я получу 100 копий одной и той же картинки!
Я понимаю, что VCL писали те ещё упорыши, но неужели никак это не обойти без написания своей кнопки?

Читать еще:  Система си состоит из

UPD: Delphi 2010

  • kipar
  • Участник

С ImageList умеет работать TToolBar — он не подойдет? Но копирует он внутри или нет не знаю, сам пользуюсь нестандартным компонентом.

  • DekaSoft
  • Постоялец

Стопиццот кнопок с одной картинкой? А зачем? Может какой grid лучше подошёл бы?

  • 0iStalker
  • Модератор

Дельфи давно забыл, но на C++ Builder делал так.

Думаю, переписать с цпп на паскаль не трудно.

  • kipar
  • Участник

0iStalker
Но Executor пишет что
> Но встаёт проблема с тем, что в реализации SpeedButton сделано так, что когда
> ты отдаёшь ему глиф, он его копирует у себя.
т.е. внутри

  • Executor
  • Удалён

Ну чтож, пусть копируется, хоть это и не прикольно, но думаю не большая проблема. Писать свой велосипед думаю смысла нет.

kipar
> С ImageList умеет работать TToolBar — он не подойдет?

Не, у меня кнопки не подряд расположены.

DekaSoft
> Стопиццот кнопок с одной картинкой? А зачем? Может какой grid лучше подошёл бы?

Не подошёл бы.
Стопицот я конечно не в буквальном смысле. Ну штук 20 наберётся.

0iStalker
Да, вот так и думал сделать, но как я уже сказал, картинка копируется. Пруф:

FOriginal это TBitmap.
Assign copies the bitmap image contained in Source to the bitmap object.

  • *vmr
  • Постоялец

Ставь третьесторонние компоненты (Toolbar2000 вроде, но я пользовался «внутрикорпоративными» на основе его)
То что сейчас идет в стандартной поставке — хуита полная, никак не развивается со времен Delphi7

ЗЫ: это совет вообще. заодно и проблема с иконками решится

  • kipar
  • Участник

Executor
> Не, у меня кнопки не подряд расположены.
[madskills]Сделать по одному toolbar на каждую кнопку[/madskills]
А вообще, раз их всего 20 — в чем проблема что они скопируются? Байтоптимизация?

  • 0iStalker
  • Модератор

kipar
> т.е. внутри buttons[i]->Glyph = bmbutton; происходит копирование картинки и ему
> это не нравится.

ЧО? Какое копирование?! bmbutton — сырой указатель. Проблемы у SpeedButton и встроенного редактора Glyph в том, что для каждой кнопки в файле ресурсов будет выделена новая битова карта под изображение, даже если это изображение на каждой кнопке одинаковое.

  • 0iStalker
  • Модератор

*vmr
> третьесторонние компоненты

Это такой геморр, каждый раз, при необходимости скомпилировать на новом компе проект, — доинсталлировать кучу хрени в IDE. Вдобавок, Delphi-source компоненты, будучи прилинковаными статически к C++ Builder приложению, — стабильно крашат его при запуске.

  • kipar
  • Участник

0iStalker
Это не поле, а свойство. Т.е. при присвоении вызывается SetGlyph. Код для SetGlyph приведен Executorом выше.

  • 0iStalker
  • Модератор

kipar
> Это не поле, а свойство. Т.е. при присвоении вызывается SetGlyph. Код для
> SetGlyph приведен Executorом выше.

Ок, но это, похоже, плата за компонентность и возможность каждому контролу рисовать самому себя. Но, по крайней мере, можно сэкономить хотя бы место в файле ресурсов и на размере EXE, не пихать в него 20-ть одинаковых картинок.

  • ASP
  • Постоялец

Assign copies the bitmap image contained in Source to the bitmap object.

В битмапе есть объект Source — class, который копируется как указатель с подсчетом ссылок, так что само изображение как таковое не копируется при Graphics.Assign, так что ничего страшного за FOriginal.Assign(Value) не скрывается.
А если уж лезешь в исходники, то уж лезь до конца и смотри как происходит Assign, а не утверждай, то чего не знаешь.

  • Executor
  • Удалён

kipar
> А вообще, раз их всего 20 — в чем проблема что они скопируются?
> Байтоптимизация?

Согласен, что может не большая проблема, но просто хочется красивого кода.

ASP
Да, недоглядел. Спасибо большое.
Тогда вопрос про ImageList, по сути мне придётся иметь свой список битмапов, дублирующих содержимое листа?
Или тогда уж вообще избавится от ImageList и хранить битмапы в ресурсах самостоятельно?

  • *vmr
  • Постоялец

Toolbar2000 + PNGImageList
у меня было так, подобных проблем не знал.
что делать со стандартными говонокомпонентами — не знаю (

Ссылка на основную публикацию
ВсеИнструменты 220 Вольт
Adblock
detector