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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.07.2015, 14:50   #1
Kiten
Пользователь
 
Аватар для Kiten
 
Регистрация: 31.07.2012
Сообщений: 15
По умолчанию Как сделать объект растягиваемым?

Всем привет!
Я не силен в программировании, и сделал необычную программу для проведения собственных исследований. Суть простая: в окне отрисовывается спираль, само окно прозрачное.
Нужно сделать пару вещей:
1. Чтобы объект, т.е. спираль был растягиваемым в горизонтальном или вертикальном направлении, по аналогии с трансформацией в фотошопе. Растягивать можно, изменяя окно, или выделив объект щелчком мыши. Как это реализовать я не знаю.
2. Изменить толщину линий.
Не судите строго) Буду рад за любую помощь)
Вот листинг:

Код:
unit Coil;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Buttons, Vcl.ExtCtrls;

type
  TForm1 = class(TForm)
    Image1: TImage;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  h,a,b,k,r:real;
  x,y : Integer;
  startx,starty : Integer;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
 begin
 //Form1.AlphaBlend:=true;
 //Form1.AlphaBlendValue :=10;
 //TransparentColor := true;
 //Color := clWhite;
 //TransparentColorValue := clWhite;
 //BorderStyle := bsToolWindow;
 k:=0;
 h:=0.005;
 a:=0.1;
 b:= 0.1;
 startx := Image1.ClientWidth div 2;
 starty := Image1.ClientHeight div 2;
 repeat
  r:=a*Exp(k*b);
  x:=Round(r*cos(k)) + startx;
  y:=Round(-r*sin(k)) + starty;
  Image1.canvas.Pixels[x,y] := clBlack;
  k:=k+h;
 until k>66*pi;
end;

end.
Серьезное лицо - это еще не признак ума
Kiten вне форума Ответить с цитированием
Старый 14.07.2015, 16:44   #2
ResourceSpace
Форумчанин
 
Аватар для ResourceSpace
 
Регистрация: 30.06.2015
Сообщений: 353
По умолчанию

Переменные нужно объявлять или локально в процедуре или как поле класса (при необходимости).
Рисование всегда лучше выводить в отдельную процедуру.

гм... Ну про первое - варианта два: либо рисовать на битмапе и включить растягивание, тогда сама картинка будет исходного размера, но растянуто. Или рисовать на самом окне векторно, с учётом размеров клиентской области.
Смотря что именно нужно...

А про второе - во-первых не следует использовать Pixels[x,y] никогда вообще никогда, а во-вторых графики всегда рисуйте линиями (и им можно задавать толщину):
Код:
Unit Unit1;

Interface

Uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons, ExtCtrls;

Type
      TForm1 = Class(TForm)
            Image1: TImage;
            Procedure FormCreate(Sender: TObject); 
            Procedure FormResize(Sender: TObject);
            Procedure FormPaint(Sender: TObject);
      Private { Private declarations }
            Procedure Draw(C: TCanvas);
      Public { Public declarations }
      End;

Var Form1: TForm1;

Implementation

{$R *.dfm}

Procedure TForm1.Draw(C: TCanvas);
Var x0, y0, x, y: Integer; h, a, b, k, r: Real;
Begin
C.Lock;
C.FillRect(C.ClipRect); // очистка (если нужна)
k:=0;
h:=0.6;
a:=0.1;
b:= 0.1;
x0:=(C.ClipRect.Right-C.ClipRect.Left) Div 2;
y0:=(C.ClipRect.Bottom-C.ClipRect.Top) Div 2;
C.MoveTo(x0, y0);
C.Pen.Color:=clRed;
C.Pen.Width:=2;
Repeat
      r:=a*Exp(k*b);
      x:=Round(r*Cos(k))+x0;
      y:=Round(-r*Sin(k))+y0;
      C.LineTo(x, y);
      k:=k+h;
Until k>66*Pi;
C.Unlock;
End;

Procedure TForm1.FormCreate(Sender: TObject);
Begin
DoubleBuffered:=True;
//AlphaBlend := True;
//AlphaBlendValue :=10;
//TransparentColor := True;
//Color := clWhite;
//TransparentColorValue := clWhite;
//BorderStyle := bsToolWindow;
Draw(Image1.Canvas);
End; 

Procedure TForm1.FormResize(Sender: TObject);
Begin
Repaint;
End;

Procedure TForm1.FormPaint(Sender: TObject);
Begin
Draw(Canvas);
End;

End.

Последний раз редактировалось ResourceSpace; 14.07.2015 в 21:03. Причина: мелкие правки
ResourceSpace вне форума Ответить с цитированием
Старый 14.07.2015, 17:27   #3
Kiten
Пользователь
 
Аватар для Kiten
 
Регистрация: 31.07.2012
Сообщений: 15
По умолчанию

Спасиииибо!
Такой вариант мне гораздо больше нравится!
Попробую разобраться с растягиванием. Если будут вопросы, может еще побеспокою, с Вашего позволения)
Серьезное лицо - это еще не признак ума
Kiten вне форума Ответить с цитированием
Старый 14.07.2015, 19:58   #4
Kiten
Пользователь
 
Аватар для Kiten
 
Регистрация: 31.07.2012
Сообщений: 15
По умолчанию

А можно просто сделать следующим образом?
1. TImage1 подгоняется под размер клиентской области, а нарисованная в ней спираль масштабируется под TImage?
Таким образом, при изменении размеров окна спираль будет "сжиматься", подгоняясь под размер окна?
У меня на харде 60 часов лекций по Delphi, потихоньку изучаю, но добить бы этот код поскорей((( мне бы это помогло в моих исследованиях.
Я изучаю трейдинг на форексе, и разрабатываю расширенную систему на базе КАФ (Комплексного анализа Фибоначчи), с применением дополнительных визуальных инструментов, недоступных в стандартном терминале Metatrader 4.
Последнее что мне осталось добить на данном этапе - это свойство растяжения.
Серьезное лицо - это еще не признак ума
Kiten вне форума Ответить с цитированием
Старый 14.07.2015, 21:02   #5
ResourceSpace
Форумчанин
 
Аватар для ResourceSpace
 
Регистрация: 30.06.2015
Сообщений: 353
Лампочка

Этого можно добиться и рисуя на окне, просто масштаб правильно рассчитать. Я же не знаю что именно нужно - сколько витков, как именно вмещаться, что делать если W>H (и наоборот).

А для того, чтобы TImage подгонялось под размер нужно или в его свойствах или программно задать:
  • Image1.Align:=alClient;
  • Image1.Stretch:=True;
  • Image1.Center:=True; // думаю пригодится, раз уж Stretch
  • Image1.Proportional:=True; // а это уже как требуется настроить
Сперва задать размеры картинки:
Код:
Image1.Picture.Bitmap.Width:=800;
Image1.Picture.Bitmap.Height:=600;
А уж потом рисовать: Draw(Image1.Canvas);
Я ещё пару строк поменял в предыдущем сообщении, мелкие правки.
ResourceSpace вне форума Ответить с цитированием
Старый 14.07.2015, 22:14   #6
Kiten
Пользователь
 
Аватар для Kiten
 
Регистрация: 31.07.2012
Сообщений: 15
По умолчанию

Опа!
Щикарно!
То что надо.
Если интересует тема трейдинга - всегда пожалуйста!
Серьезное лицо - это еще не признак ума
Kiten вне форума Ответить с цитированием
Старый 15.07.2015, 08:55   #7
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

1. Никогда... нет, не так... НИКОГДА !!!! ничего не рисуй на TImage!!! И не спрашивай почему!!!
2. Покажи скриншот спирали.
3. Что означают у тебя все эти коэффициенты типа

Код:
h,a,b,k,r:real;
  x,y : Integer;
  startx,starty : Integer;
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 15.07.2015, 11:07   #8
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

А к какому параметру (каким параметрам) спирали привязать соотношение сторон прямоугольника отрисовки?

Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 15.07.2015, 12:26   #9
Kiten
Пользователь
 
Аватар для Kiten
 
Регистрация: 31.07.2012
Сообщений: 15
По умолчанию

Всем привет! Спасибо за помощь, рад видеть столько откликов. Попробую объяснить суть подхода, и все ключевые моменты.
Данный метод построения представлен в книге Р. Фишера "New_methods_of_trade_on_Fibonachch i". Она переведена на русский язык.



Это частный случай логарифмической спирали с применением соотношений Фибоначчи. Расстояние от предыдущего витка равно 0.618 расстояния до следующего. А расстояние до следующего равно 0.618 от расстояния между предыдущим и последующим. Схематично я представил это на картинке:



Это не "золотая спираль", в которой используется тот же принцип, но по-другому.

Также, используется принцип "растяжения":



Необходимость данного подхода объясняется тем, что графики торговых инструментов сами масштабируются по соотношению "цена-время", но не буду засорять этим ветку. Если кому-то будет интересно, подскажу, что где найти и т.д. Ближе всего к этой теме КАФ: cfa-forex.livejournal.com

В принципе, на данном этапе я близок к тому, что хотел видеть. Delphi знаю на начальном уровне, код отрисовки взял из другой статьи. Наверное, есть более эффективные способы выполнения данной задачи, с возможностью изменения параметров на уровне приложения, а не кода. В любом случае, спасибо за Ваши подсказки!
Серьезное лицо - это еще не признак ума
Kiten вне форума Ответить с цитированием
Старый 15.07.2015, 12:35   #10
zvygin1964
Старожил
 
Аватар для zvygin1964
 
Регистрация: 19.06.2013
Сообщений: 2,463
По умолчанию

И это всё?
А на каких площадках вы торгуете?
Ваши рекомендации по инвестициям на год.
Даже Лившиц говорил:"Надо делиться".
Голубые фишки через десять лет, это какие компании?
Где прикупить золотых динаров и юаней?
Репутация: полный "0"
zvygin1964 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать так, чтобы при наведении мышкой на объект, который находится под другим, этот объект выходил на первый план? Zaza7 HTML и CSS 3 17.01.2013 10:23
как сделать что бы объект не выходил за пределы формы artem_degtev Помощь студентам 3 18.12.2011 00:11
С++ Builder. БД как объект pasha_hoy C++ Builder 0 17.01.2011 09:15
Компонент как 3D объект AsmodElial Мультимедиа в Delphi 1 19.09.2009 12:12
Народ,помогите пожалуйста.Объект и иерархию не могу сделать KirILLA90 Помощь студентам 1 18.12.2008 20:09