Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.11.2011, 16:23   #1
SovereignSun
Форумчанин
 
Регистрация: 22.11.2011
Сообщений: 127
По умолчанию Как run-time создать от руки компонент?

Собственно такой трудный вопрос:
1.При нажатии на speed button, открывается диалоговое окно с полем edit куда пользователь пишет название нового компонента (в моем случае TImage), по нажатию Ок, курсор меняется на crosshair тип, и пользователю разрешается рисовать этот компонент (TImage), пользователь указывает шелчком первую точку, потом водит мышкой и отрисовывается любого вида прямоугольник (предпросмотр готового компонента), потом по второму шелчку, TImage создается того размера что нарисовал пользователь, в том месте где он его нарисовал. Следом открывает OpenDialog для выбора картинки для этого компонента. И после выбора уже, вставляется компонент с картинкой, а в treeview записывается его название, введеное в начале пользователем. При выборе компонента в treeview, этот компонент на форме выделяется рамкой, также он рамкой выделяется, если один раз кликнуть прямо на него, слева будет распологаться меню, где пользователь может в любое время изменить название, картинку загрузить другую, и всякое другое. Для обьекта должна быть возможность редактирование размера, например если пользователь с краю зацепит, то можно изменять размер передвижение мыши, а также перетаскивать компонент нажав и зажав кнопку мыши. Как это осуществлить? Также можно удалить объект, нажав delete или нажав кнопку удалить в меню. Как обращаться к run-time созданому объекту в run-time?
SovereignSun вне форума Ответить с цитированием
Старый 22.11.2011, 16:40   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Подарите пользователю Дельфи, пусть играется )

Если серъёзно, то всё это муторно и долго надо ручками программировать. Вряд ли есть готовые решения, хотя хз.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 22.11.2011, 16:55   #3
SovereignSun
Форумчанин
 
Регистрация: 22.11.2011
Сообщений: 127
По умолчанию

Да суть в том, что человеку хочеться программу. в которой можно было бы создавать мини альбом, со свободным расположением картинок и текста, и сохранять его в файл, и дать возможность печати в pdf, jpeg, а также на принтер. А я с таким еще не работал.
SovereignSun вне форума Ответить с цитированием
Старый 22.11.2011, 17:02   #4
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Такая программа уже есть, называется Фотошоп )

Возможно, получится заюзать какой-нибудь репортопостроитель, включающий в себя рантайм построитель шаблонов. Типа фастрепорт. Надо смотреть по фичам.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 22.11.2011, 17:16   #5
SovereignSun
Форумчанин
 
Регистрация: 22.11.2011
Сообщений: 127
По умолчанию

FastReport не позволяет такое вытворять, я его уже пробовал, в остальных тоже не наблюдалось, а собственно идея заложенная в photoshope подходит, только вот узнать бы как она осуществленна?
SovereignSun вне форума Ответить с цитированием
Старый 22.11.2011, 17:21   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Если задачу разбить на мелкие задачи, то она станет проще, но программировать придется больше.
Цитата:
1.При нажатии на speed button,
создаем обработчик данного события. и в нем описываем последовательность действий пользователя.
Цитата:
открывается диалоговое окно с полем edit куда пользователь пишет название нового компонента (в моем случае TImage), по нажатию Ок,
делаем свою (новую) форму с нужными полями и кнопками.
показываем ее в нужный момент
проверяем что нажал пользователь
showModal =mrok
Цитата:
курсор меняется на crosshair тип,
меняем курсор Screen.Cursor:=
правило хорошего тона.
Все что меняли надо в конце восстанавливать. для воостановления куроса запоминаем старое значения.
Цитата:
и пользователю разрешается рисовать этот компонент (TImage), пользователь указывает шелчком первую точку,
устанавливаем флаг нам нужна первая точка (меняем состояние объекта (формы).
ловим щелчок мыши OnMouseUp
проверяем наш флаг ( состояние формы первая точка) и запоминаем место (координаты). и ставим флаг нужна вторая точка (другое состояние )
пригодятся методы clienttoScreen / ScreenToClient.
Цитата:
потом водит мышкой
ловим движения мыши OnMouseMove
и второй щелчок.OnMouseUp
и проверяем флаг (состояние вторая точка)
Цитата:
и отрисовывается любого вида прямоугольник
рисуем
Цитата:
(предпросмотр готового компонента),
потом по второму шелчку, TImage создается того размера что нарисовал пользователь, в том месте где он его нарисовал.
восстанавливаем курсор( см правило хорошего тона).
Код:
var
  r: TControl;
Код:
r:=Timage.Create(?);
r.Left:=?
r.Top:=?
r.width:=?
r.height:=?
// координаты достаем из сохраненного в OnMouseUp
r.parent:=?
Цитата:
Следом открывает OpenDialog для выбора картинки для этого компонента.
И после выбора уже, вставляется компонент с картинкой,
Код:
r.LoadFromFile( OpenDialog.Filename);
Цитата:
а в treeview записывается его название, введеное в начале пользователем.
форма где вводили есть TreeView тоже. методы компонента TreeView известны (Help, литература).

Цитата:
При выборе компонента в treeview, этот компонент на форме выделяется рамкой, также он рамкой выделяется, если один раз кликнуть прямо на него, слева будет распологаться меню, где пользователь может в любое время изменить название, картинку загрузить другую, и всякое другое. Для обьекта должна быть возможность редактирование размера, например если пользователь с краю зацепит, то можно изменять размер передвижение мыши, а также перетаскивать компонент нажав и зажав кнопку мыши. Как это осуществлить? Также можно удалить объект, нажав delete или нажав кнопку удалить в меню.
тоже можно разбить на мелкие кусочки.
Цитата:
Как обращаться к run-time созданому объекту в run-time?
что бы обращаться вы(программа) должна о нем знать. Объект при создании должен быть присвоен какой-либо переменной \элементу массива\ полю какого другого известного объекта откуда при необходимости его можно будет вытащить.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 22.11.2011 в 17:28.
evg_m вне форума Ответить с цитированием
Старый 22.11.2011, 17:28   #7
SovereignSun
Форумчанин
 
Регистрация: 22.11.2011
Сообщений: 127
По умолчанию

Предположим, первый этап:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, jpeg, ComCtrls;

type
TForm1 = class(TForm)
btn1: TButton;
dlgOpen1: TOpenDialog;
tv1: TTreeView;
procedure btn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
ImageName: String;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);
Var
Node : TTreeNode;
begin
Form2.ShowModal;
with TImage.Create( Form1 ) do
Begin
Parent := Form1; // this is important
Canvas.Handle;
Left := 244; // X coordinate
Top := 155; // Y coordinate
Name := 'imagename'; // this is important
Width := 255;
Height := 255;
Stretch := True;
Visible := True;
Visible := True;
dlgOpen1.Execute;
Picture.LoadFromFile(Form1.dlgOpen1 .FileName);
end;
Node:=tv1.Items.Add(nil,imagename);
Node.ImageIndex:=0;
end;

end.

unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm2 = class(TForm)
edt1: TEdit;
lbl1: TLabel;
btn1: TButton;
procedure btn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form2: TForm2;

implementation

uses Unit1;

{$R *.dfm}

procedure TForm2.btn1Click(Sender: TObject);
begin
ImageName:=edt1.Text;
Close;
end;

end.

Собственно от этого как плясать?
SovereignSun вне форума Ответить с цитированием
Старый 22.11.2011, 18:29   #8
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

Набросал за 5 минут...
Развивайте логику, мсье...

За отдельную плату - сделаю строго по ТЗ и с красивым оформлением... контакты в профиле.
Вложения
Тип файла: rar Новая папка.rar (190.3 Кб, 41 просмотров)
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}
Johnson вне форума Ответить с цитированием
Старый 23.11.2011, 11:35   #9
SovereignSun
Форумчанин
 
Регистрация: 22.11.2011
Сообщений: 127
По умолчанию

А кто нибудь видел исходник программы типа Photoshop простенькой? я бы оттуда содрал.
SovereignSun вне форума Ответить с цитированием
Старый 23.11.2011, 12:02   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
я бы оттуда содрал.
вы думаете сможете легко разобраться в чужом коде?(еще GIMP есть)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создать record в Run-time ebuchiysayt_ebuchi Общие вопросы Delphi 7 31.07.2011 19:02
Обработка событий компонент, созданных в Run-Time Рик Компоненты Delphi 1 29.03.2011 14:50
Run-time error 13 olimpus Microsoft Office Excel 11 25.12.2010 22:49
Как создать TPageControl в run-time tonatas Общие вопросы Delphi 4 13.08.2010 22:57
Ошибка Run-Time error 13 DEZuv Microsoft Office Access 0 03.04.2009 12:25