Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 3 
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Необходимо написать программу-редактор. В окне программы строится схема релейной защиты (типа электрической схемы), а потом по нажатию кнопки, допустим, старт происходил бы расчет схемы.
Как реализоват расчет схемы я придумал. А вот как сделать, что-то наподобие редактора векторной графики для построения не знаю. Есть идея реализовать это при помощи DirectX или OpenGL, но в графике не бум-бум.
Так вот как реализовать это как можно проще и желательно на Delphi, но можно и на других языках. Подскажите хоть направление



Партнер
 

Member
Статус: Не в сети
Регистрация: 05.01.2005
Vic-Tor
Vic-Tor писал(а):
Необходимо написать программу-редактор.

Сочувствую… :)

Vic-Tor писал(а):
А вот как сделать, что-то наподобие редактора векторной графики для построения не знаю.

Все очень, очень и очень просто. :wink:
Нужно создать ряд классов - для каждого элемента свой класс, чтобы он мог сам себя правильно рисовать ну и ессно знал - шо он такое есть.
И соответственно иметь список (TList) всех этих рисуемых объектов, чтобы в случае удаления какого-то элемента, ты мог просто удалить его из списка и все перерисовать по-новому.
Это в общих чертах. Короче начать и кончить. :D

Vic-Tor писал(а):
Так вот как реализовать это как можно проще и желательно на Delphi

Используя метафайлы - EMF aka Extended Metafile Format.
Delphi с помощью классов TMetafile и TMetafileCanvas поддерживает метафайлы Винды.
Собсно ими все и разруливается.
Набросал пример рисования, в обработчике события для Button1 создается виртуальный холст, рисуется, и сохраняется в файл, в обработчике события для Button2 загружается из файла.
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
  public
    PB: TPaintBox;
    Emf: TMetafile;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  PB:= TPaintBox.Create(Self);
  PB.Left:= 4; PB.Top:= 4; PB.Width:= 200; PB.Height:= 200;
  PB.Parent:= Self;
  Emf:= TMetafile.Create;
  Emf.Width:= PB.Width; Emf.Height:= PB.Height;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Emf.Free; PB.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  EmfCanvas: TMetafileCanvas;
  arr: array of TPoint;
  i, Size: Longword;
begin
  Size:= 11;
  SetLength(arr, 9);
  EmfCanvas:= TMetafileCanvas.CreateWithComment(Emf, 0, 'бла-бла-бла...', 'художник из меня... мдя...(C)_SGK');
  with EmfCanvas do
  begin
    Brush.Color := clWhite;
    FillRect(EmfCanvas.ClipRect);
    try
      Font.Size:= 10;
      Font.Style:= EmfCanvas.Font.Style + [fsBold];
      Font.Color:= clGray;
      TextOut(3, 3, 'бла-бла-бла...');
      Pen.Color:= clBlue;
      Pen.Width:= 2;
      for i:= Low(arr) to High(arr) do
      begin
        arr[i].X:= Random(PB.Width - Size);
        arr[i].Y:= Random(PB.Height - Size);
        Rectangle(arr[i].X, arr[i].Y, arr[i].X + Size, arr[i].Y + Size);
      end;
      Pen.Color:= clRed;
      Pen.Width:= 1;
      for i:= Low(arr) to High(arr)-1  do
      begin
        MoveTo(arr[i].X + Size div 2, arr[i].Y + Size div 2);
        LineTo(arr[i+1].X + Size div 2, arr[i+1].Y + Size div 2);
      end;
    finally
      Free;
    end;
  end;
  PB.Canvas.Draw(0, 0, Emf);
  Emf.SaveToFile('C:\бла-бла-бла.emf');
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  if FileExists('C:\бла-бла-бла.emf') then
  begin
    Emf.LoadFromFile('C:\бла-бла-бла.emf');
    PB.Canvas.Draw (0, 0, Emf);
  end
  else
    MessageBox(Application.Handle, 'Не сложилось, однако…', 'Мдя...', MB_OK + MB_ICONWARNING);
end;

end.


Удачи… ;)


 

2 _SGK

Спасибо ограмное. Честно говоря не надеялся на такой подробный ответ. Скоро опробую.


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 3 
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan