количествово кликов на картинке
примерный код программы:
Left = 75
Top = 258
Width = 976
Height = 749
Caption = 'Rasl project'
Color = clLime
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = 'MS Sans Serif'
Font.Style = []
Menu = MainMenu1
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object Memo1: TMemo
Left = 0
Top = 16
Width = 353
Height = 33
Lines.Strings = (
'Нажимайте на кнопки,и сумма ваших кликов автоматически будут '
'отображаться '
'в окнах')
TabOrder = 0
end
object Edit1: TEdit
Left = 360
Top = 656
Width = 225
Height = 21
Color = clMenuHighlight
TabOrder = 1
Text = 'Все права защищены (C) 2006 Rasl project'
end
object MainMenu1: TMainMenu
Left = 592
Top = 40
object ertrtrt1: TMenuItem
Caption = 'Сохранить:'
object N6: TMenuItem
Caption = 'Сохранить как...'
end
end
object N1: TMenuItem
Caption = 'Подсчет маска периферической крови:'
object N2: TMenuItem
end
end
object N3: TMenuItem
Caption = 'Нормобласты:'
end
object N4: TMenuItem
Caption = 'Клетки Боткина-Гумиряхта:'
end
object N5: TMenuItem
Caption = 'Автор:'
end
end
end
[COLOR=red][COLOR=black][size=2][/COLOR]Давай темем смысловые названия, используй теги code. почитай правила форума Делфи.[/COLOR][COLOR=black][/size][/COLOR]
Я знаю.
Кому тут нужен текст формы? И что-то в ней не видно пресловутого "picture".
Делай класс-наследник, например от TPanel, на котором положи TPicture. И поле-счётчик. И publish-property к этому свойству, в котором будет храниться количество кликов. Соответственно, в OnClick инкременируй значение. Ну и подумай, как это можно сохранить.
var
i : Integer;
begin
Tag := Tag + 1;
i := TAg;
Edit1.Text := IntToStr(i);
end;
Этоже нада?
TMyPicture = class(TImage)
private
FClickCounter: Integer;
FOnCounterChange: TNotifyEvent;
procedure SetClickCounter(const Value: Integer);
procedure Click(Sender: TObject);
public
constructor Create(AOwner: TComponent); override;
property ClickCounter: Integer read FClickCounter write SetClickCounter;
published
property OnCounterChange: TNotifyEvent
read FOnCounterChange write FOnCounterChange;
end;
TForm1 = class(TForm)
Edit1: TEdit;
procedure FormCreate(Sender: TObject);
private
procedure ImageCounterChange(Sender: TObject);
public
Image1: TMyPicture;
end;
var
Form1: TForm1;
implementation
{ TMyPicture }
procedure TMyPicture.Click(Sender: TObject);
begin
ClickCounter := ClickCounter + 1;
if Assigned(FOnCounterChange) then
FOnCounterChange(Self);
end;
constructor TMyPicture.Create(AOwner: TComponent);
begin
inherited;
Parent := TWinControl(AOwner);
OnClick := Click;
end;
procedure TMyPicture.SetClickCounter(const Value: Integer);
begin
FClickCounter := Value;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Image1 := TMyPicture.Create(Self);
Image1.OnCounterChange := ImageCounterChange;
Image1.Top := 100;
Image1.Left := 100;
Image1.Width := 300;
Image1.Height := 300;
Image1.Picture.LoadFromFile('.....путь к файлу....');
end;
procedure TForm1.ImageCounterChange(Sender: TObject);
begin
Edit1.Text := IntToStr(Image1.ClickCounter);
end;
end.
begin
with Image1 do
begin
Inc(Tag);
Edit1.Text := IntToStr(Tag);
end;
end;
Так что, всё очень относительно... Ведь согласись, что все компоненты из VCL применяются в самых различных ситуациях, и мне кажется, что гораздо удобнее зачастую написать их наследников с нужным функционалом, чем в TForm1 писать горы года для каждого компонента...
Естественно, я с тобой согласен. Просто был задан вопрос именно про Edit, а твое решение для него ну очень замороченное :)
А что там замороченного? Класс с тремя методами...
А ещё можно "фрейм" сделать.
В главном меню выбираем: "File \ New \ Frame"
Создаётся модуль с файлами "Frame1.cpp", "Frame1.h" и "Frame1.dfm". На изображаемой форме раскладываем компоненты, устанавливаем связи, пишем код. При необходимости для класса фрейма дополнительно объявляем поля, методы, свойства и события.
Потом переключаемся на форму окна и выбираем в списке компонентов "Frame" (первый элемент на панели стандартных визуальных компонентов). И созданный объект одним щелчком мыши кладётся на форму.
Ведь представьте себе, что вам нужно создать десяток элементов, содержащих кнопку, при нажатии которой открывается окно выбора файла, имя которого потом выводится в текстовое поле. Что вы будете делать: распологать десяток наборов компонентов, давая каждому индивидуальное имя и прописывая для каждой кнопки вывод в соответствующее поле? Или создадите один класс фрейма, объекты которого будут использоваться легко и просто?
begin
with Image1 do
begin
Inc(Tag);
Edit1.Text := IntToStr(Tag);
end;
end;
Я написал этот код... но у меня не компилируется :(
TForm1 = class(TForm)
Memo1: TMemo;
MainMenu1: TMainMenu;
ertrtrt1: TMenuItem;
N6: TMenuItem;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
Image1: TImage;
Image2: TImage;
Image3: TImage;
Image4: TImage;
Edit1: TEdit;
Edit2: TEdit;
LabeledEdit1: TLabeledEdit;
LabeledEdit2: TLabeledEdit;
procedure Image1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Image1Click(Sender: TObject);
begin
with Image1 do
begin
// Inc(Tag); здесь скорей всего какая то ошибка...,что это за поцедура...
Edit1.Text := IntToStr(Tag);
end;
end;
end.
выдает ошибку Left side cannot be assigned to
var
i : Integer;
begin
Tag := Tag + 1;
i := TAg;
Edit1.Text := IntToStr(i);
end;
спасиб :) ..
Этот код работает!
Щас вродебы разобрался... :)
выдает ошибку Left side cannot be assigned to
Гм... с Inc я наверное погорячился...
А что там замороченного? Класс с тремя методами...
Вот именно, что целый класс.. Кроме того, это еще и, фактически, новый компонент. А если его надо использовать в design-time, то еще и надо добавлять в палитру. Может быть для тебя и меня это тривиально, но для автора топика, боюсь все далеко не просто (прошу не обижаться автору)...
Кстати, да. Мне вот тоже ещё ни разу не удалось задействовать Inc()... Странно как-то всё это...
Нет, ну в поллитру его прописывать не стоит... Я так вообще предпочитаю всё расписать руками - юнитов больше, но .exe - в десятки раз меньше. А кое-то вообще в dll упаковываю - то чем часто пользуюсь и доволен работоспособностью и функциональностью.
А потому что применяете его к свойству объекта класса. Скорее всего, функция Inc (var Value: Integer) требует именно изменяемого значения.
Кстати, сишные операторы ++ в этой ситуации работают правильно :D
TForm1 = class(TForm)
Image1: TImage;
Edit1: TEdit;
procedure Image1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
i: integer;
implementation
{$R *.dfm}
procedure TForm1.Image1Click(Sender: TObject);
begin
inc(i);
edit1.Text:=inttostr(i);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
i:=0;
edit1.Text:='0';
end;
end.
Вот ещё умный человек пришол с упрощением...
2Toxin_F: а если таких картинок две штуки на форме? Делать две глобальных переменные? А если сто картинок?
Сто, говоришь, эту проблему можно решить простым ARRAY'ем:
Form1: TForm1;
i: array[0..100] of integer;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
edit1.Text:='0';
edit2.Text:='0';
end;
procedure TForm1.Image1Click(Sender: TObject);
begin
i[0]:=strtoint(edit1.Text);
inc(i[0]);
edit1.Text:=inttostr(i[0]);
end;
procedure TForm1.Image2Click(Sender: TObject);
begin
i[1]:=strtoint(edit1.Text);
inc(i[1]);
edit2.Text:=inttostr(i[1]);
end;
Когда кликаешь быстро, обрабатывается не OnClick, а OnDblClick. Самое правильное - обрабатывать в OnMouseDown.
Поставить на форму компонент TDBEdit, с обработчиком, например, OnChange...
Отлично! И как в TDBEdit учесть количество кликов??? В TAg? В глобальных переменных? А если каритнок сто?....
Ребята, не морочте людям голову. Гораздо проще написать наследыша, чем выдумывать всякое говно.
Да не... погоди... Вот еще одно супер мега решение:
Предлагаю написать наследника от TImage, который будет фиксировать факт клика на картинке. Он будет создавать объект класса TImageClick (который будет однозначно идентифицироать нужный Image) и передавать его классу TImageClickSender, который будет сериализовать TImageClick в формат XML и посылать его через TCP/IP серверу. Сервер при получении такого сообщения десериализует его обратно в объект и увеличит счетчик кликов - поле БД, соответствующее картинке, на сервере БД. После этого вернет сообщение клиенту, что счетчик увеличен. Клиент получит такое сообщение классом TImageClickReceiver, который изменит соответствующим образом нужный Edit.
Преимущество такого подхода:
1. Можно иметь хоть миллион картинок.
2. Количество кликов сохраняется от запуска к запуску.
3. Можно работать через Internet.
4. Поскольку используется трехзвенка (клиент<->сервер<->сервер БД), мы получаем офигительную масштабируемость и производительность.
О как! :)
Тоже тема! :D