powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Создание компонента сложной формы (аккуратной контурной стрелки).
25 сообщений из 110, страница 1 из 5
Создание компонента сложной формы (аккуратной контурной стрелки).
    #39854799
Вопрос несколько шире, чем можно написать в заголовке и требует некоторого пояснения.
В моей программке есть рисовалка, которая показывает результаты расчетов пример на картинке. Но всё что отображается по сути обычный рисунок на канве. Интерактивность обеспечивается перехватом координат по клику, сравнивание с изображенным на рисунке и вызовом соответствующих процедур.



Но в определенный момент мне захотелось большей "интерактивности" (информация при наведении на элемент, информация при клике по тексту или рисунку, т.п.).
Так же когда объемы и форматы выводимой информации стали весьма значительными
(рисунки для примера)




добавление любых новых данных стало ну очень сложным (так как всё один рисунок + интерактивность + куча условий + каждый раз данные подгружаются разные, надо всё учитывать, ну и т.п.) решил попробовать сделать свой компонент наследника от панели (из-за удобной возможности "ручного" перетаскивания и широкого выбора событий) с лейблами для вывода текста и прочим подобным.

Сделать это на первый взгляд оказалось не сложно (на картинки каждый шестигранник - компонент)...
пример - картинка
,
но только на первый взгляд, одним из очень важных элементов визуального отображения результатов являются стрелки
картинка - пример тут всё является одним рисунком

и вот тут возникла сложность, а как рисовать стрелки поверх панелек не перекрывая доступ к ним (яж хочу "интерактивность"). Ну и в общем основной вопрос в этом. Как реализовать такие стрелки?
Наиболее очевидным для меня было сделать контурную стрелку и вырезать панельку по ней, так я и сделал, но результат сильно разочаровал:
пример со стрелками вырезанными из панелек

Во первых ужасное "сглаживание" наклонных линий (есть ли способ уменьшить эти лесенки?).
Во вторых я никак не могу понять почему основания стрелок сужаются/расширяются? Что-то с округлением и непопаданием пикселей, вроде тригонометрия правильная? Почему криво обрезаются...
Из решений пока думаю сделать панельку прозрачной(теми или иными способами) и рисовать стрелки старым способом.

Я резонно предполагаю, что способ реализации выбранный мной ну очень спорный, потому открыт для любых адекватных предложений.
Отдельные вопросы:
1. Создания сотен панелей потенциально не опасно для работы программы? Что-нибудь может поломаться? В принципе что по памяти, что по отклику проблем никаких не замечено.
2. Имеет ли смысл включать канвас на панели вместо создания на ней Image, это даст какие-то ресурсные преимущества, ну или, возможно, это правильнее?
3. Как можно ускорить создание панелек, несколько сотен панелек создается несколько секунд, что не много, но не мгновенно.
4. Можно ли рисовать прям поверх всех панелей при этом не ограничивая взаимодействия.
5. Почему
Код: pascal
1.
2.
CreatePolygonRgn (pt,NPoint,1); 
SetWindowRgn(Handle,CirRgn,true);

при использовании динамического массива просто уничтожает работу системы. Винда зависает почти в ноль даже на многоядерном процессоре, данные на входе проверял - правильны.
То есть такой код работает нормально:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
    Var
  pt      :array[0..5]  of TPoint;
  ...
 begin
  CirRgn:= CreatePolygonRgn (pt,6,1);
  SetWindowRgn(Handle,CirRgn,true);
 end

А вот такой убивает винду (по крайней мере на Delphi7), почему?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
    Var
  pt      :array  of TPoint;
  ...
 begin
  Setlength (pt,6)
  CirRgn:= CreatePolygonRgn (pt,6,1);
  SetWindowRgn(Handle,CirRgn,true);
 end



Если интересен код, вот, сильно не бейте, писалось просто что в голову придет и я пока просто учусь:
код
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

TArrow = array [0..6] of TPoint;

type
  TestPanel = class (TPanel)
  private
     Image:TImage;
     Numb:integer;
     procedure MovePanelMouseDown(Sender: TObject; Button: TMouseButton;  Shift: TShiftState; X, Y: Integer);
  public
     property Index:Integer read Numb write Numb;
  end;

TFA = class
 private
    TextLabel:array [1..5] of TLabel;
    Arrow:TestPanel;
    Hex:TestPanel;
    X,Y:Real;
    RDes:Integer;
    Numb:integer;
    Parent :  TWinControl;
    function BodyArrow(X1,Y1,X2,Y2: Integer; LW: Extended):TArrow;
 public
    DeltX,DelTY:Real;
    property PosX:real write X;
    property PosY:real write Y;
    procedure DrawArrow (DeltX,DeltY:Real; Wdt:integer);
 Published
    constructor  Create(AOwner: TWinControl; PosX, PosY : real; RadDes, Index  : Integer);
 end;

TRPoint = record
x,y:real;
end;

var
  Form1: TForm1;
  RPoint: array [1..163] of TRPoint;
  FA:array [1..163] of TFA;
  
implementation

{$R *.dfm}

constructor TFA.Create(AOwner: TWinControl; PosX, PosY : real; RadDes, Index : Integer); //ñîçäàþ ìíîãîóãîëüíèê ñ òåêòîì
var
  i       :integer;
  CirRgn  :HRGN;
  pt      :array[0..5]  of TPoint;
const
  NPoint=6;
begin
  X:=PosX;  Y:=PosY;
  RDes:=RadDes;
  Parent:=AOwner;
  Numb:=Index;

  Hex:=TestPanel.Create(AOwner);
  Hex.Index:=Numb;
  Hex.Parent:=AOwner;
  Hex.SendToBack;

 with  Hex do
   begin
      BevelInner:=bvNone;  BevelOuter:=bvNone;  BorderStyle:=bsNone; //ïàðàìåíòðû ïàíåëè
      Height:=RDes*2;    Width:=RDes*2;
      Top:=Round(Y);     Left:=Round(X);

      Image:=TImage.Create(Hex);
      Image.Parent:=Hex;
      Image.Align:=alClient;
      Image.OnMouseDown:=Hex.MovePanelMouseDown;

      for i:=1 to 5 do     //òåêñò
       begin
        TextLabel[i]:=Tlabel.Create(Hex);
        TextLabel[i].Parent:=Hex;
        TextLabel[i].Caption:=inttostr(i);
        TextLabel[i].Left:=RDes-Round(TextLabel[i].width/2);
        TextLabel[i].Top:=Round(i*(2*RDes-12)/(5)-6);
        TextLabel[i].Transparent:=True;
       end;

      for i:=0 to NPoint-1 do  //ôîðìà ìíîãîóãîëüíèêà
        begin
          pt[i].Y:=Round((Sin(2*i*pi/NPoint+pi/NPoint)+1)*RDes);
          pt[i].X:=Round((Cos(2*i*pi/NPoint+pi/NPoint)+1)*RDes);
        end;
      CirRgn:= CreatePolygonRgn (pt,NPoint,1);
      SetWindowRgn(Handle,CirRgn,true);
      Image.Canvas.Pen.Width:=4;

      Image.Canvas.Brush.Color:=RGB(random(255), random(255), random(255));
      Image.Canvas.Brush.Style:=bsSolid;
      Image.Canvas.Pen.Color:=clBlack;
      Image.Canvas.Polygon(pt);
   end;
end;


function TFA.BodyArrow(X1,Y1,X2,Y2: Integer; LW: Extended):TArrow; //ðèñóþ ñòðåëêó
  var
    Angle: Extended;
    A1,A2: Extended;
    Body:  TArrow;
    SinA,CosA,AbsA:Extended;
  const
    WidthLen=2.2;
    LineLen=4.74;
    ArrAngl=0.28322;
    HeadLenght=4.5;
begin
  Angle:=ArcTan2(Y1-Y2,X2-X1);
  AbsA:=Sqrt(Sqr(Y2-Y1)+Sqr(X2-X1));
  SinA:=(Y2-Y1)/AbsA;
  CosA:=(X2-X1)/AbsA;

  Angle:=Pi+Angle;
  A1:=Angle-ArrAngl; A2:=Angle+ArrAngl;
  Body[0]:=Point(Round(X1+WidthLen*SinA),Round(Y1-WidthLen*CosA));
  Body[1]:=Point(Round(X1-WidthLen*SinA),Round(Y1+WidthLen*CosA));
  Body[2]:=Point(Round(X2-WidthLen*SinA -LW*HeadLenght*CosA),Round(Y2+WidthLen*CosA-LW*HeadLenght*SinA));
  Body[3]:=Point(X2+Round(LineLen*LW*Cos(A2)),Y2-Round(LineLen*LW*Sin(A2)));
  Body[4]:=Point(X2,Y2);
  Body[5]:=Point(X2+Round(LineLen*LW*Cos(A1)),Y2-Round(LineLen*LW*Sin(A1)));
  Body[6]:=Point(Round(X2+WidthLen*SinA -LW*HeadLenght*CosA),Round(Y2-WidthLen*CosA-LW*HeadLenght*SinA));

  BodyArrow:=Body;
end;

procedure TFA.DrawArrow (DeltX,DeltY:Real; Wdt:integer);
var
  CirRgn:HRGN;
  RecPoint:TArrow;
  Line: array [1..2] of TPoint;
  i:Integer;
  SinA,CosA,AbsA,dX,dY:Real;
  TempInteger:Integer;
begin
 AbsA:=Sqrt(Sqr(DeltX)+Sqr(DeltY));
 SinA:=(DeltY)/AbsA;
 CosA:=(DeltX)/AbsA;
 dX:=(SinA*Wdt)/2;
 dY:=(CosA*Wdt)/2;

 Arrow:=TestPanel.Create(Parent);
 Arrow.Parent:=Parent;
 Arrow.Index:=0;

with  Arrow do
  begin
   BevelInner:=bvNone; BevelOuter:=bvNone;  BorderStyle:=bsNone;   //óáèðàåì ãðàíèöû

   if DeltX>=0 then  Left:=Round(X+RDes-abs(dX))  else  Left:=Round(X+RDes+DeltX-abs(dX)); //ðàçåìðû ïàíåëè
   if DeltY>=0 then  Top:= Round(Y+RDes-abs(dY))  else  Top:= Round(Y+RDes+DeltY-abs(dY));
   Width:=Round(Abs(DeltX)+2*abs(dX));       Height:=Round(Abs(DeltY)+2*abs(dY));

   Image:=TImage.Create(Arrow);      //ñîçäàåì ïàíåëü
   Image.Parent:=Arrow;
   Image.Align:=alClient;
   Image.Canvas.Brush.Color:=clRed;
   Image.Canvas.Pen.Width:=2;

   if (DeltX>=0) then begin  Line[1].X:=Round(DeltX+abs(dX)); Line[2].X:=Round(0+abs(dX) )      end
                else  begin  Line[1].X:=Round(0+abs(dX));     Line[2].X:=Round(-DeltX+abs(dX) ) end;

   if (DeltY>=0) then begin  Line[1].Y:=Round(DeltY+abs(dY)); Line[2].Y:=Round(0+abs(dY))   end
                 else begin  Line[1].Y:=Round(0+abs(dY));     Line[2].Y:=Round(-DeltY+abs(dY)) end;

   RecPoint:=    BodyArrow(Line[1].X,Line[1].Y,Line[2].X,Line[2].Y,3);

   CirRgn:= CreatePolygonRgn (RecPoint,7,1);
   Image.Canvas.Polygon(RecPoint);
   SetWindowRgn(Handle,CirRgn,true);

   Image.OnMouseDown:=Arrow.MovePanelMouseDown;
  end;
end;

procedure TestPanel.MovePanelMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  ReleaseCapture;
  (Sender as TImage).Parent.Perform(WM_SYSCOMMAND, $F012, 0);
end;

procedure LoadData;
 var
  sl,dmsl:TStringList;
  i:integer;
begin
  sl:=TStringList.Create;
  sl.LoadFromFile('fa_locations.c1');
  dmsl:=TStringList.Create;
  dmsl.Delimiter:=' ';
  for i:=0 to 162 do
  begin
   dmsl.DelimitedText:=sl[i];
   RPoint[i+1].x:=StrToFloat (dmsl[1]);
   RPoint[i+1].y:=StrToFloat (dmsl[2]);
  end;
  dmsl.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i:Integer;
begin
Panel1.Visible:=false;
 if FileExists('fa_locations.c1') then LoadData
    else for i:=1 to 163 do begin RPoint[i].x:=Random(3000)/1000-1.5; RPoint[i].y:=Random(3000)/1000-1.5; end;


 for i:=1 to 163 do if FA[i]=nil then  FA[i]:=TFA.Create(Panel1,RPoint[i].x*220+400,RPoint[i].y*220+350,30,i);
Panel1.Visible:=True;
Button2.Enabled:=True;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  i:Integer;
begin
Panel1.Visible:=false;
 for i:=1 to 163 do   FA[i].DrawArrow(Random(50)+50,Random(50)+50,10);
Panel1.Visible:=True;
end;

End.



Ну а теперь отдельно.
Если мои вопросы слишком глупы для данного форума, то, вроде, есть более лояльные к новичкам форумы, просто это мне показался наиболее живым из существующих, если считаете что не стоит тут задавать, то более не буду.
Если же мои вопрос слишком сложны и надо писать их в разделе "работа", то поясню, всё что я делаю, по сути делаю для "научного интереса", то есть мне за это никто не платит, я за это ничего не получу (кроме, возможно, благодарности). Можно сказать что я просто учусь и заодно что-то делаю облегчая жизнь себе и коллегам. Банально мне это интересно и нравится.
П.С. Мне на форуме советовали книгу по типам данных Delphi, теперь никак не могу найти где именно мне её посоветовали. Скачал несколько по алгоритмам, хорошие книги, но пока не совсем то, что мне надо. Чтож за книгу там мне посоветовали...
...
Рейтинг: 0 / 0
Создание компонента сложной формы (аккуратной контурной стрелки).
    #39854801
Сомневаюсь, что кому-то нужно, но прицепил программку. Зато можно стрелочки порисовать :).
...
Рейтинг: 0 / 0
Создание компонента сложной формы (аккуратной контурной стрелки).
    #39854830
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ИгоревичП.С. Мне на форуме советовали книгу по типам данных Delphi, теперь никак не могу найти где именно мне её посоветовали. Скачал несколько по алгоритмам, хорошие книги, но пока не совсем то, что мне надо. Чтож за книгу там мне посоветовали...
Я вам писал о вот этой книжке:
https://royallib.com/book/baknell_dgulian/fundamentalnie_algoritmi_i_strukturi_dannih_v_Delphi.html
Но может быть вы что-то другое имеете в виду.
...
Рейтинг: 0 / 0
Создание компонента сложной формы (аккуратной контурной стрелки).
    #39854835
s62Андрей ИгоревичП.С. Мне на форуме советовали книгу по типам данных Delphi, теперь никак не могу найти где именно мне её посоветовали. Скачал несколько по алгоритмам, хорошие книги, но пока не совсем то, что мне надо. Чтож за книгу там мне посоветовали...
Я вам писал о вот этой книжке:
https://royallib.com/book/baknell_dgulian/fundamentalnie_algoritmi_i_strukturi_dannih_v_Delphi.html
Но может быть вы что-то другое имеете в виду.
А, эту книгу я уже скачал. Хорошая, но некоторая сложность в том, что алгоритмы из книги я нигде пока не использую (ну из начала кнаги по крайней мере), а что не использовал, то почти сразу забываю (треклятая дырявая память), сейчас добью "Библию Делфи" (ничего нового особо не узнал, но некоторое систематизировал) и попробую эту ещё раз уже пытаясь куда-нибудь применив.
...
Рейтинг: 0 / 0
Создание компонента сложной формы (аккуратной контурной стрелки).
    #39854849
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ИгоревичСделать это на первый взгляд оказалось не сложно (на картинки каждый шестигранник - компонент)...
Ну ты, брат, силен. Основную работу работать-то успеваешь? :)

зы. если честно, ЯНХНП. Но, если суть вопроса в корректной и оптимальной отрисовке, дождись, пока ответит Соколинский Борис , он в этом вопросе продвинут, КМК.
...
Рейтинг: 0 / 0
Создание компонента сложной формы (аккуратной контурной стрелки).
    #39854860
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй вместо панелек отрисовку в Tshape с перекрытым Draw и Brush.Style=bsClear. Да, регионы очень тормознутые, тем более когда их сотни.
...
Рейтинг: 0 / 0
Создание компонента сложной формы (аккуратной контурной стрелки).
    #39854864
ДокАндрей ИгоревичСделать это на первый взгляд оказалось не сложно (на картинки каждый шестигранник - компонент)...
Ну ты, брат, силен. Основную работу работать-то успеваешь? :)

зы. если честно, ЯНХНП. Но, если суть вопроса в корректной и оптимальной отрисовке, дождись, пока ответит Соколинский Борис , он в этом вопросе продвинут, КМК.
Лето, пара отпусков, всё начальство отдыхает, вот и ковыряюсь пока время есть. По факту я уже раза 3-4 почти всё переделывал, на это (и на поиск ошибок от выхода за пределы массива) уходить куда больше времени, чем на создание чего-то нового :).

Суть вопроса достаточно проста:
как нарисовать красивую стрелочку поверх всего(панелек, имеджей, ...) на форме при том чтоб стрелка не перекрывала доступ к компонентам под ней .

Остальное уже так, заранее ответил на возможные вопросы :) (по опыту). Нашел несколько готовых решений, но там везде идет перекрытие (стрелка на прозрачном фоне). Наверняка в сети "тыщу" раз это обсуждалось, но я не всегда умею грамотно спросить у гугла (обычно знаешь что спрашивать уже зная ответ).
Ну и просто может кто по опыту скажет, что я вообще не правильно всё делаю и надо делать не так (ну там не панельки использовать, не так компоненты рисловать, и т.п.).
...
Рейтинг: 0 / 0
Создание компонента сложной формы (аккуратной контурной стрелки).
    #39854875
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
и на поиск ошибок от выхода за пределы массива



Программа сама найдет

Range checking
...
Рейтинг: 0 / 0
Создание компонента сложной формы (аккуратной контурной стрелки).
    #39854878
X-Cite
Код: pascal
1.
и на поиск ошибок от выхода за пределы массива


Программа сама найдет
Range checking
Спасибо, попробую, нужная вещь. Вроде и знал о данной возможности, а вроде и ленился найти как включить. Ведь каждый раз думаешь "ну в чем же ошибка, ну в этот раз точно не динамический массив", а по факту постоянно из-за него :), как я не люблю динамические массивы, будь они неладны...

Василий 2Попробуй вместо панелек отрисовку в Tshape с перекрытым Draw и Brush.Style=bsClear. Да, регионы очень тормознутые, тем более когда их сотни.
Попробую, пока что-то не разобрался как её на передний план вывести и будет ли прямоугольник компонента перекрывать доступ, но поковыряюсь.
...
Рейтинг: 0 / 0
Создание компонента сложной формы (аккуратной контурной стрелки).
    #39854890
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему в пользу "интеракивности" был выбран TWinControl + SetWindowRgn, а не просто TGraphicsControl ?
...
Рейтинг: 0 / 0
Создание компонента сложной формы (аккуратной контурной стрелки).
    #39854909
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич,

ЖСТКО
Такие вещи только вручную рисуют, через промежуточный буфер - двойная буферизация называется, в сети полно примеров
Ссли уж так охота всё отдельынми компонентами, то наследуйтесь от TGraphicsControl, он у вас хоть окна создавать не будет (дискрипторы окон лимитированный ресурс)

а CreatePolygonRgn у вас выпадает из-за того, что вы ему адрес не буфера передаёте, а условно "мусор", используйте с ним [0]
Код: pascal
1.
CreatePolygonRgn (pt[0],6,1);
...
Рейтинг: 0 / 0
Создание компонента сложной формы (аккуратной контурной стрелки).
    #39854915
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kealon(Ruslan)(дискрипторы окон лимитированный ресурс)
Насколько я помню, со времён Windows 95 ситуация несколько изменилась.
...
Рейтинг: 0 / 0
Создание компонента сложной формы (аккуратной контурной стрелки).
    #39854952
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
softwarerkealon(Ruslan)(дискрипторы окон лимитированный ресурс)
Насколько я помню, со времён Windows 95 ситуация несколько изменилась.если к делу подходят специалисты :-)
...
Рейтинг: 0 / 0
Создание компонента сложной формы (аккуратной контурной стрелки).
    #39854978
DimaBrПочему в пользу "интеракивности" был выбран TWinControl + SetWindowRgn, а не просто TGraphicsControl ?
Что на текущий момент знал, то и использовал. Сейчас, по мере наличия свободного времени, буду про предложенное вами читать и пробовать.
kealon(Ruslan)Андрей Игоревич,
ЖСТКО
Такие вещи только вручную рисуют, через промежуточный буфер - двойная буферизация называется, в сети полно примеров
Ссли уж так охота всё отдельынми компонентами, то наследуйтесь от TGraphicsControl, он у вас хоть окна создавать не будет (дискрипторы окон лимитированный ресурс)
а CreatePolygonRgn у вас выпадает из-за того, что вы ему адрес не буфера передаёте, а условно "мусор", используйте с ним [0]
Код: pascal
1.
CreatePolygonRgn (pt[0],6,1);


Спасибо, попробую поискать примеры в сети "двойной буферизации".
На счет "лимитированного ресурса", вроде пару тысяч для теста создавал, ничего не падало (хотя программка и начала тормозить), но буду иметь в виду и попробую предложенные способы.
...
Рейтинг: 0 / 0
Создание компонента сложной формы (аккуратной контурной стрелки).
    #39855097
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич,

На стандартном канвасе красивой графики не получить. Нужно делать на GDI+, или еще лучше на Direct2D.
Никаких контролов, все рисовать самому, все объекты свои, каждый умеет отрисовываться и обрабатывать события.
При желании, за пол года вполне сможете сделать нормальную версию.
...
Рейтинг: 0 / 0
Создание компонента сложной формы (аккуратной контурной стрелки).
    #39855115
Фотография Kast2K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич,

Попробуйсте с TpaintBox, но качественной графики от него не ждите.

Демка с просторов интернета.
...
Рейтинг: 0 / 0
Создание компонента сложной формы (аккуратной контурной стрелки).
    #39855174
stanilar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос делится на два: сделать в дельфи и сделать хорошо и быстро.

Насчет первого вопроса... Ну, раз Вы начали сами программировать то, что хотите - то продолжайте, это полезно. Создать своего наследника панели это очень круто, на него можно кинуть фрейм - удобство дельфовой визуальной разработки засверкает новыми красками. Стрелочки можно нарисовать на холсте того компонента, на котором лежат Ваши наследники панели.

Правда знание особенностей дельфовой объектной обертки над WIN API вроде как мало востребовано. Думаю что даже меньше востребовано чем просто хорошее знание WIN API. IMHO хорошее знание WIN API лучше сочетается с билдером.

Насчет второго... Тут нужно подобрать хорошую технологию. Из известных мне - SVG. Он не только стрелочки сможет рисовать. Но для интерактивности потребуется работать с компонентом TWebBrowser или поискать полную реализацию под дельфан. А такого, скорее всего нет, потому что SVG по возможностям почти как HTML(тока css не нужен, таки картинка).
...
Рейтинг: 0 / 0
Создание компонента сложной формы (аккуратной контурной стрелки).
    #39855177
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stanilarSVG по возможностям почти как HTML(тока css не нужен, таки картинка).

Еще как нужен.
...
Рейтинг: 0 / 0
Создание компонента сложной формы (аккуратной контурной стрелки).
    #39855196
stanilar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asviridenkovЕще как нужен.

При использовании в рамках HTML - можно поставить корню ширину, высоту и позицию. А в остальном у него все свое, это ведь картинка. Зачем картинке css?
...
Рейтинг: 0 / 0
Создание компонента сложной формы (аккуратной контурной стрелки).
    #39855206
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stanilarasviridenkovЕще как нужен.

При использовании в рамках HTML - можно поставить корню ширину, высоту и позицию. А в остальном у него все свое, это ведь картинка. Зачем картинке css?

Это не картинка, это набор векторных элементов с CSS стилями.
...
Рейтинг: 0 / 0
Создание компонента сложной формы (аккуратной контурной стрелки).
    #39855215
stanilar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asviridenkovЭто не картинка, это набор векторных элементов с CSS стилями.

Вот постоянно сталкиваюсь с SVG. Даже либу для построения графиков написал. Но не понимаю тебя.

SVG, это аналог HTML. В нем есть место и для CSS, если кому хочется. Кому не хочется - тот обходится без CSS. Код с примером можешь привести, зачем нужен CSS в SVG?
...
Рейтинг: 0 / 0
Создание компонента сложной формы (аккуратной контурной стрелки).
    #39855224
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stanilarasviridenkovЭто не картинка, это набор векторных элементов с CSS стилями.

Вот постоянно сталкиваюсь с SVG. Даже либу для построения графиков написал. Но не понимаю тебя.

SVG, это аналог HTML. В нем есть место и для CSS, если кому хочется. Кому не хочется - тот обходится без CSS. Код с примером можешь привести, зачем нужен CSS в SVG?

Для всего. Атрибут style у элементов SVG, это тоже CSS. А, например, интерактивность вроде

.vbar g:hover {fill-opacity: 0.7}

только через глобальный stylesheet делается.

Да, какие-то свойства в SVG можно задавать через атрибуты, но не все, не всегда, и вообще не лучший вариант.
...
Рейтинг: 0 / 0
Создание компонента сложной формы (аккуратной контурной стрелки).
    #39855235
stanilar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asviridenkov.vbar g:hover {fill-opacity: 0.7}

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
<rect id="rect1" class="bar" x="20" y="60" width="80" height="120">
    <set attributeName="fill" to="#ec008c"
         begin="rect1.mouseover"
         end="rect1.mouseout"/>
    <set attributeName="opacity" to="0.4"
         begin="rect2.mouseover"
         end="rect2.mouseout"/>
    <set attributeName="opacity" to="0.4"
         begin="rect3.mouseover"
         end="rect3.mouseout"/>
</rect>



asviridenkovДа, какие-то свойства в SVG можно задавать через атрибуты, но не все, не всегда, и вообще не лучший вариант.
IMHO самый лучший вариант. Такую SVG картинку всегда можно экспортировать/импортировать. А при программировании интерактивной картинки со стороны js - вообще только так. Как ты каллбек mouseleave/mouseenter из SVG в js пробросишь, если у тебя hover из css задается?
...
Рейтинг: 0 / 0
Создание компонента сложной формы (аккуратной контурной стрелки).
    #39855261
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stanilar,

В моем примере устанавливалось для всех элементов определенного класса, а здесь для конкретных.
...
Рейтинг: 0 / 0
Создание компонента сложной формы (аккуратной контурной стрелки).
    #39855272
asviridenkovАндрей Игоревич,
При желании, за пол года вполне сможете сделать нормальную версию.
Это очень жестоко (пол года)... Но по возможности попробую поизучать GDI+.
Kast2KАндрей Игоревич,
Попробуйсте с TpaintBox, но качественной графики от него не ждите.
Демка с просторов интернета.
Пока поверхностно потыкал пример (но, кстати, на 7й не работал, только на 10), но там перекрытие прямоугольником компонентов за линией, с TPaintBox тоже, но надо повникать, как я понял он позже 7ки появился (нашел его только в 10ке).

stanilarПравда знание особенностей дельфовой объектной обертки над WIN API вроде как мало востребовано. Думаю что даже меньше востребовано чем просто хорошее знание WIN API. IMHO хорошее знание WIN API лучше сочетается с билдером.

На текущий момент меня востребованность не очень волнует, приложение пишется "для себя". Более обидно будет, если Делфи окончательно прикроют (грустно изучать то, что уже не будет развиваться).
А вопрос, а как Чарт в 10й делфе рисует свои картинки? Ну просто для сравнения графики в нем в 7ке и 10ке:
для понимания разницы картинки надо смотреть без масштабирования браузером

Ну и другие вещи (всякие скругленные бары и прочее) они рисует просто прекрасно.

asviridenkovstanilarпропущено...
Вот постоянно сталкиваюсь с SVG. Даже либу для построения графиков написал. Но не понимаю тебя.
SVG, это аналог HTML. В нем есть место и для CSS, если кому хочется. Кому не хочется - тот обходится без CSS. Код с примером можешь привести, зачем нужен CSS в SVG?
Для всего. Атрибут style у элементов SVG, это тоже CSS. А, например, интерактивность вроде
.vbar g:hover {fill-opacity: 0.7}
только через глобальный stylesheet делается.
Да, какие-то свойства в SVG можно задавать через атрибуты, но не все, не всегда, и вообще не лучший вариант.
...
Рейтинг: 0 / 0
25 сообщений из 110, страница 1 из 5
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Создание компонента сложной формы (аккуратной контурной стрелки).
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]