Как создать на панеле массив объектов типа Image, только с фокусом...
И чтобы фокус с одного объекта исчезал только если кликаешь на другой...
(Один всегда в фокусе) и что-бы фокус не терялся при получении фокуса другими компонентами (типа Edit, Button usw.)
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
20-03-2007 13:47 | Сообщение от автора вопроса
Спасибо Бел Амор'у за развёрнутый ответ...
Идея с Bevel прикольная ;)
К сожалению проверить смогу не скоро (в отъезде), но думаю вопрос исчерпан...
ЗЫ: А где за ответы голосуют?
Если здесь ("Добавить претендента на конкурс"), то на какой конкурс добавить?
Под фокусом подразумевался просто фокусный (пунктирный) прямоугольник вокруг объекта...
Воспринимать клавиатурный ввод нет необходимости, это просто должно быть визуально похоже на "фокус"
Т.е вам нужно иметь как-бы текущую картинку, которая как-то выделена. Я бы предлодил такой вариант:
При щелчке по картинке вокруг нее отрисовыаете какую-либо рамочку, например, TBevel. Доступ к картинке - через Sender. Чтобы не беспокоиться с убиранием рамочки с предыдущей картинки, просто гоняете по форме один Bevel, тогда с предыдущей картинки он будет убираться автоматически. Чтобы знать текущую картинку, заводите индекс, значение которому берете из тега картинки, по которой кликнули. Соответственно, этот тег сначала надо присвоить. Привожу полностью рабочий пример, правда, опасаясь модераторов, картинки пришлось-таки из ImageList убрать, впрочем, все это легко решается двойным щелчком по ImageList. В качестве картинок я использовал пиктограмки для кнопок, выглядело симпатично.
type
TForm1 = class(TForm)
ImageList1: TImageList;
Bevel1: TBevel;
Label1: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
procedure FormCreate(Sender: TObject);
procedure ImageClick(Sender: TObject);
private
ImgIdx: Integer; // -1: не выбрано
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
i: Integer;
begin
for i := 0 to ImageList1.Count-1 do
with TImage.Create(Self) do
begin
Parent := Self;
ImageList1.GetBitmap(i, Picture.Bitmap);
AutoSize := True;
Top := 50;
Left := 30 + i * (Width+30);
Tag := i;
OnClick := ImageClick;
end;
ImgIdx := -1;
Bevel1.Visible := False;
end;
procedure TForm1.ImageClick(Sender: TObject);
const
Delta = 5;
begin
Bevel1.Visible := False;
with Sender as TImage do
begin
Bevel1.Width := Width + Delta * 2;
Bevel1.Height := Height + Delta * 2;
Bevel1.Left := Left - Delta;
Bevel1.Top := Top - Delta;
ImgIdx := Tag;
end;
Bevel1.Visible := True;
Label1.Caption := 'ImgIdx = ' + IntToStr(ImgIdx);
end;
end.
Unit1.dfm
object Form1: TForm1
Left = 350
Top = 251
Width = 400
Height = 323
Caption = 'Form1'
Color = clBtnFace
Font.Charset = RUSSIAN_CHARSET
Font.Color = clWindowText
Font.Height = -13
Font.Name = 'Arial'
Font.Style = []
OldCreateOrder = False
OnCreate = FormCreate
PixelsPerInch = 96
TextHeight = 16
object Bevel1: TBevel
Left = 10
Top = 30
Width = 50
Height = 50
Shape = bsFrame
end
object Label1: TLabel
Left = 0
Top = 0
Width = 392
Height = 19
Align = alTop
Alignment = taCenter
Caption = 'Картинка не выбрана'
Color = clWhite
Font.Charset = RUSSIAN_CHARSET
Font.Color = clWindowText
Font.Height = -16
Font.Name = 'Arial'
Font.Style = [fsBold]
ParentColor = False
ParentFont = False
end
object Edit1: TEdit
Left = 35
Top = 150
Width = 121
Height = 24
TabOrder = 0
end
object Edit2: TEdit
Left = 35
Top = 190
Width = 121
Height = 24
TabOrder = 1
end
object Edit3: TEdit
Left = 35
Top = 230
Width = 121
Height = 24
TabOrder = 2
end
object ImageList1: TImageList
Left = 105
Top = 40
end
end
Согласен, выразился не совсем корректно...
Под фокусом подразумевался просто фокусный (пунктирный) прямоугольник вокруг объекта...
Воспринимать клавиатурный ввод нет необходимости, это просто должно быть визуально похоже на "фокус"
Два фокуса в одном приложении вы в любом случае не получите, так как неопределенность, кто принимает клавиатурный ввод, впрочем об этом уже сказали. Как вариант - помещать имеджи на панели, которые могут получить фокус.
Вопрос требует уточнения. Под фокусом понимают состояние элемента управления воспринимать клавиатурный ввод. Поэтому
1) В каждый момент времени только один элемент управления может иметь фокус.
2) TImage фокуса иметь не может.
Объясните, что Вы имеете ввиду.
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.