Мне необходимо создать контейнер с изображениями (визуально что-то типо галереи, но подписи совсем не нужны, разве что Хинты). Ну так вот, у меня вопрос, что лучше для этого использовать. Вчера опробовал различные способы:
1) TDrawGrid, не совсем понял как сделать там все нормально, но похоже нужно постоянно отрисовывать картинки в ячейках
2) Элемент TPanel c динамическим созданием TImage (из-за не опытности возникает много вопросов, но думаю они все решаемы). Но самый главный вопрос, взаимодействие с этими TImage так, чтобы можно было переносить один из TImage в другой контейнер (с убиранием его из первого контейнера, возможно самым простым будет скрытие TImage через свойство Visible). Ну и еще один вопрос, как сделать массив их этих TImage, чтобы можно было легче с ними работать (ну или как-нибудь по другому им задать индекс).
Я не прошу написать за меня код, я просто хочу чтобы меня подтолкнули к правильной мысли, с кодом, надеюсь, справлюсь. Ну если что и пойдет не так, попрошу помощи))
Контейнер для изображений (что-то типо галереи)
Модератор: Модераторы
- alexs
- долгожитель
- Сообщения: 4069
- Зарегистрирован: 15.05.2005 23:17:07
- Откуда: г.Ставрополь
- Контактная информация:
Если 2-й метод - то доступ можно через свойство Panel.Controls - это и есть массив всех компонентов, которые находятся на панеле.
По первому методу - надо добавлять событие на отрисовку изображения в ячейке - тоже не сложно.
По первому методу - надо добавлять событие на отрисовку изображения в ячейке - тоже не сложно.
В общем, контейнер получился, но какая-то ошибка с присвоением обработчика на OnClick:
Вот код
ругается на сточку: Arr[i].OnClick:=ImClick;
Пишет: unit1.pas(57,32) Error: Wrong number of parameters specified for call to "ImClick".
Я не могу понять на какое количество параметров он ругается, ведь у процедуры один параметр - выбранный объект
Извиняюсь, ответ уже нашел. Не внимательно искал первый раз.
Вызов процедуры осуществляется через знак @: Arr[i].OnClick:=@ImClick;
Вот код
Код: Выделить всё
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
StdCtrls, Buttons, Unit3;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Frame1_1: TFrame1;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
procedure Image1Click(Sender: TObject);
procedure ImClick(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
Arr: array of TImage;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.ImClick(Sender: TObject);
begin
Label1.caption:=(Sender as TImage).Name;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i,n,k:integer;
begin
n:=StrtoInt(Edit1.Text);
SetLength(Arr,n);
for i:=0 to n-1 do
begin
Arr[i]:=TImage.Create(Frame1_1);
Arr[i].Parent:=Frame1_1;
Arr[i].Top:=Trunc(i/4)*64;
Arr[i].Left:=(i mod 4)*64;
Arr[i].Picture.LoadFromFile('D:\Desktop\ProARA\Tal_img\1.png');
Arr[i].OnClick:=ImClick;
end;
end;
end.
ругается на сточку: Arr[i].OnClick:=ImClick;
Пишет: unit1.pas(57,32) Error: Wrong number of parameters specified for call to "ImClick".
Я не могу понять на какое количество параметров он ругается, ведь у процедуры один параметр - выбранный объект
Извиняюсь, ответ уже нашел. Не внимательно искал первый раз.
Вызов процедуры осуществляется через знак @: Arr[i].OnClick:=@ImClick;
ВизГ писал(а):Извиняюсь, ответ уже нашел. Не внимательно искал первый раз.
Вызов процедуры осуществляется через знак @: Arr[i].OnClick:=@ImClick;
если {$mode objfpc}{$H+} то через собаку, если {$mode delphi}{$H+} то без нее можно.
Sharfik писал(а):если {$mode objfpc}{$H+} то через собаку, если {$mode delphi}{$H+} то без нее можно.
А если делать через 2е кроссплатформенность сохранится?
