Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на Delphi и Lazarus


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный платный хостинг на базе Windows 2008

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Чемпионы рейтинга экспертов в этой рассылке

Boriss
Статус: Академик
Рейтинг: 1836
∙ повысить рейтинг »
star9491
Статус: 10-й класс
Рейтинг: 874
∙ повысить рейтинг »
Евгений/Genia007/
Статус: Бакалавр
Рейтинг: 627
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И ПО / Программирование / Delphi и Lazarus

Номер выпуска:1502
Дата выхода:12.03.2010, 21:00
Администратор рассылки:Калашников О.А., Руководитель
Подписчиков / экспертов:553 / 229
Вопросов / ответов:1 / 2

Вопрос № 177121: Здравствуйте,уважаемые эксперты! У меня к вам вот какой практический вопрос: Я сделал на форме несколько элементов Image и сделал так чтобы их можно было перемещать по щелчку мыши Вопрос: необходимо будет нарисовать стрелки между этими элем...



Вопрос № 177121:

Здравствуйте,уважаемые эксперты!
У меня к вам вот какой практический вопрос:
Я сделал на форме несколько элементов Image и сделал так чтобы их можно было перемещать по щелчку мыши
Вопрос: необходимо будет нарисовать стрелки между этими элементами (как бы связать их друг с другом-граф построить),но ведь элементы движутся-значит и стрелки должны перемещаться и увеличиваться/уменьшаться в размере
Как это реализовать?

Спасибо!!!

Отправлен: 07.03.2010, 17:16
Вопрос задал: Миронычев Виталий, Посетитель
Всего ответов: 2
Страница вопроса »


Отвечает Bochvarov NikB, Студент :

Здравствуйте, Миронычев Виталий!
Лучше - динамически
Каждоя стрелка - ето обект, которой знает кто его Image source и кто его Image target.
Конечно, знает и как рисовать себе :)
Для меня в подобной ситъации проблема бьила как лучше определить позицию в которою стрекла косается с/в Image.

Ответ отправил: Bochvarov NikB, Студент
Ответ отправлен: 07.03.2010, 17:24
Номер ответа: 259968

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 259968 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:

  • Отвечает Евгений/Genia007/, Бакалавр :
    Здравствуйте, Миронычев Виталий.
    Могу предложить свой вариант решения данной задачи, так как image используется только для вывода вершин графа, предлагаю от них избавиться и рисовать весь граф на одном image. При создания программы, для рисования графа, был использован модуль Graph_obj.pas из исходников программы GraphIllustrator 5 Александра Сергеева. Вот главный модуль программы:
    Код:
    unit Process;

    interface

    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls, Grids, DBGrids, ComCtrls, DBCtrls, Menus, Mask,
    Buttons, ExtCtrls, Graph_obj;

    type
    TForm1 = class(TForm)
    Button1: TButton;
    StringGrid1: TStringGrid;
    Label1: TLabel;
    BitBtn1: TBitBtn;
    Image5: TImage;
    BitBtn2: TBitBtn;
    procedure Button1Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    procedure StringGrid1KeyPress(Sender: TObject; var Key: Char);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Image5MouseDown(Sender: TObject; Button: TMouseButton;
    Shift: TShiftState; X, Y: Integer);
    procedure Image5MouseMove(Sender: TObject; Shift: TShiftState; X,
    Y: Integer);
    procedure Image5MouseUp(Sender: TObject; Button: TMouseButton;
    Shift: TShiftState; X, Y: Integer);
    procedure BitBtn2Click(Sender: TObject);
    private
    { Private declarations }
    public
    { Public declarations }
    g1, lastgraph: Tgraph;
    procedure imagerefresh;
    end;


    var
    Form1: TF orm1;
    lastx, lasty: integer;


    implementation

    uses Unit2;

    var
    //состояния матрицы переходов опишем массивом
    matr:array[1..5,1..5]of Integer;
    matrcorxy: array [1..5, 1..2] of integer; // строка х или y столбец номер картинки

    {$R *.dfm}

    procedure CopyGraph(gr1: Tgraph; var gr2: Tgraph);
    var
    cyc1: integer;
    pt1: Tedgepoint;
    begin
    gr2.vertnum:= gr1.vertnum;
    gr2.edgenum:= gr1.edgenum;
    gr2.directed:= gr1.directed ;
    gr2.weighted:= gr1.weighted ;
    gr2.created:= gr1.created ;
    gr2.renamed:= gr1.renamed ;
    gr2.docking:= gr1.docking ;
    gr2.moving:= gr1.moving ;
    gr2.pictmoving:= gr1.pictmoving ;
    gr2.vertexadding:= gr1.vertexadding ;
    gr2.edgeadding:= gr1.edgeadding ;
    gr2.vertexdeleting:= gr1.vertexdeleting;
    gr2.edgedeleting:= gr1.edgedeleting;
    gr2.edgeadded:= gr1.edgeadded ;
    gr2.fselver:= gr1.fselver ;
    gr2.sselver:= gr1.sselver ;
    gr2.do ckvert:= gr1.dockvert ;
    gr2.basecolor:= gr1.basecolor ;
    gr2.selectedcolor:= gr1.selectedcolor ;
    gr2.filename:= gr1.filename ;
    for cyc1:= 1 to gr2.vertnum do
    begin
    gr2.vertex[cyc1]:= gr1.vertex[cyc1];
    gr2.edges[cyc1]:= nil;
    pt1:= gr1.edges[cyc1];
    while pt1 <> nil do
    begin
    gr2.addedge(pt1^.parentvert, pt1^.vertex, '/*' + pt1^.weight + '*/');
    pt1:= pt1^.next;
    end;
    end;
    end;

    procedure TForm1.imagerefresh;
    begin
    if g1.created then
    begin
    Image5.Canvas.Brush.Color:= clBtnFace;
    Image5.Canvas.Rectangle(-1, -1, image5.Width + 1, image5.height + 1);
    lastgraph.removegraph(image5.canvas);
    g1.drawgraph(image5.canvas);
    copygraph(g1, lastgraph);
    end
    else
    begin
    Image5.Canvas.Brush.Color:= clLtGray;
    Image5.Canvas.Rectangle(0, 0, image5.Width, image5. height);
    end;
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    Close;
    end;

    procedure TForm1.F ormShow(Sender: TObject);
    var
    i, j: integer;
    begin
    //заполняем значениями первую колонку
    StringGrid1.Cells[0,1]:='1';
    StringGrid1.Cells[0,2]:='2';
    StringGrid1.Cells[0,3]:='3';
    StringGrid1.Cells[0,4]:='4';
    StringGrid1.Cells[0,5]:='8';
    //заполняем значениями первую строку
    StringGrid1.Cells[1,0]:='1';
    StringGrid1.Cells[2,0]:='2';
    StringGrid1.Cells[3,0]:='3';
    StringGrid1.Cells[4,0]:='4';
    StringGrid1.Cells[5,0]:='8';
    for i:=1 to 5 do
    for j:=1 to 5 do
    begin
    StringGrid1.Cells[j,i]:= IntToStr(Random(2));
    end;
    end;

    procedure TForm1.BitBtn1Click(Sender: TObject); //построение графа
    var
    cyc1, tmv: integer;
    pt1: Tedgepoint;
    i, j: word;
    begin
    // записываем значения в массив
    for i:=1 to 5 do
    begin
    for j:=1 to 5 do
    begin
    matr[j, i]:= StrToInt(StringGrid1.Cells[j,i]);
    end;
    end;
    //
    g1.directed:= true;
    g1.weighted:= false;
    g1.basecolor:= clblack;
    for cyc1:=1 to g1.vertnum do
    g1.edges[cyc1]:= nil;
    g1.filename:= '';
    g1.vertnum:= 0;
    g1.edgenum:= 0;
    g1.created:= true;
    imagerefresh;
    //
    if g1.created then
    begin
    g1.edgeadding:=false;
    g1.vertexdeleting:=false;
    g1.edgedeleting:=false;
    g1.vertexadding:=true;
    end;
    //
    if (g1.created) and (not g1.renamed) then
    begin
    for cyc1:=1 to g1.vertnum do
    begin
    pt1:= g1.edges[cyc1];
    while pt1 <> nil do
    begin
    if pt1^.selected then
    begin
    pt1^.color:= clblack;
    end;
    pt1:=pt1^.next;
    end;
    end;
    // Строим вершины графа
    for i:= 1 to 5 do
    begin
    inc(g1.vertnum);
    if i = 5 then
    g1.vertex[g1.vertnum].name:= 'S8'
    else
    g1.vertex[g1.vertnum].name:= 'S' + inttostr(g1.vertnum);
    g1.vertex[g1.vertnum].radius:= 30;
    g1.vertex[g1.vertnum].x:= matrcorxy[i, 1];
    g1.vertex[g1.vertnum].y:= matrcorxy[i, 2];
    g1.drawgraph(image5.canvas);
    g1.vertexadding:= false;
    imagerefresh;
    end;
    end;
    g1.renamed:= false;
    //
    If g1.created then
    begin
    g1.fselver:= 0;
    g1.sselver:= 0;
    g1.vertexadding:= false;
    g1.edgeadding:= true;
    g1.vertexdeleting:= false;
    g1.edgedeleting:= false;
    end;
    //Анализ значений массива, по которому будем формировать граф
    for i:=1 to 5 do
    begin
    for j:=1 to 5 do
    begin
    if matr[i, j]=1 then
    begin
    g1.fselver:= 0;
    g1.sselver:= 0;
    tmv:= 0;
    for cyc1:= 1 to g1.vertnum do
    if (sqr(matrcorxy[j, 1] - g1.vertex[cyc1].x) + sqr(matrcorxy[j, 2] - g1.vertex[cyc1].y) <=
    sqr(g1.vertex[cyc1].radius)) then
    tmv:= cyc1;
    if tmv <> 0 then
    begin
    if g1.fselver = 0 then
    g1.fselver:= tmv
    else
    g1.sselver:= tmv;
    if (g1.fselver * g1.sselver <> 0) then
    begin
    g1.addedge(g1.fselver, g1.sselver, g1.colorstr(clblack));
    inc(g1.edgenum);
    imagerefresh;
    g1.edgeadding:= false;
    end;
    end;
    tmv:= 0;
    for cyc1:= 1 to g1.vertnum do
    if (sqr(matrcorxy[i, 1] - g1.vertex[cyc1].x) + sqr(matrcorxy[i, 2] - g1.vertex[cyc1].y ) <=
    sqr(g1.vertex[cyc1].radius)) then
    tmv:= cyc1;
    if tmv <> 0 then
    begin
    if g1.fselver = 0 then
    g1.fselver:= tmv
    else
    g1.sselver:= tmv;
    if (g1.fselver * g1.sselver <> 0) then
    begin
    g1.addedge(g1.fselver, g1.sselver, g1.colorstr(clblack));
    inc(g1.edgenum);
    imagerefresh;
    g1.edgeadding:= false;
    end;
    end;
    end;
    end;
    end;
    end;

    procedure TForm1.StringGrid1KeyPress(Sender: TObject; var Key: Char);
    var
    s: string;
    begin
    if Not (Key in ['0','1', #8]) then Key:=#0;
    s:= StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row];
    if length(s) >= 1 then
    begin
    delete(s, 2, 1);
    StringGrid1.Cells[StringGrid1.Col, StringGrid1.Row]:= s;
    end;
    //Этот оператор подменит все символы, кроме цифр и запятой, нулевым символом,
    end;

    procedure TForm1.FormCreate(Sender: TObject);
    begin
    doublebuffered := true;
    randomize;
    g1.create;
    g1.created:=false;
    // Получаем координаты вершин
    matrcorxy[1, 1]:= 248;
    matrcorxy[1, 2]:= 230;
    matrcorxy[2, 1]:= 105;
    matrcorxy[2, 2]:= 322;
    matrcorxy[3, 1]:= 248;
    matrcorxy[3, 2]:= 421;
    matrcorxy[4, 1]:= 416;
    matrcorxy[4, 2]:= 395;
    matrcorxy[5, 1]:= 440;
    matrcorxy[5, 2]:= 290;
    //
    end;

    procedure TForm1.Image5MouseDown(Sender: TObject; Button: TMouseButton;
    Shift: TShiftState; X, Y: Integer);
    var
    cyc1: integer;
    begin
    if not g1.renamed then
    begin
    g1.docking:=false;
    g1.moving:=false;
    g1.dockvert:=0;
    for cyc1:=1 to g1.vertnum do
    if (sq r(x-g1.vertex[cyc1].x)+sqr(y-g1.vertex[cyc1].y)<=sqr(g1.vertex[cyc1].radius)) then
    begin
    g1.docking:=true;
    g1.dockvert:=cyc1;
    end;
    lastx:=x;
    lasty:=y;
    g1.moving:= not g1.docking;
    end;
    g1.renamed:=false;
    end;

    procedure TForm1.Image5MouseMove(Sender: TObject; Shift: TShiftState; X,
    Y: Integer);
    var
    cyc1:integer;
    pt1:Tedgepoint;
    fl1,fl2:boolean;
    begin
    if not g1.renamed then
    begin
    if g1.docking then
    begin
    g1.vertex[g1.dockvert].x:=g1.vertex[g1.dockvert].x+x-lastx;
    g1.vertex[g1.dockvert].y:=g1.vertex[g1.dockvert].y+y-lasty;
    lastx:=x;
    lasty:=y;
    imagerefresh;
    end;
    if g1.moving then
    begin
    for cyc1:=1 to g1.vertnum do
    begin
    g1.vertex[cyc1].x:=g1.vertex[cyc1].x+x-lastx;
    g1.vertex[cyc1].y:=g1.vertex[cyc1].y+y-lasty;
    end;
    lastx:=x;
    lasty: =y;
    imagerefresh;
    end;
    if (not g1.docking)and(not g1.moving) then
    begin
    fl1:=false;
    for cyc1:=1 to g1.vertnum do
    begin
    pt1:=g1.edges[cyc1];
    while pt1<>nil do
    begin
    fl2:=pt1^.selected;
    pt1^.selected:=g1.marktest(x,y,cyc1,pt1);
    fl1:=fl1 or (fl2 xor pt1^.selected);
    pt1:=pt1^.next;
    end;
    end;
    if fl1 then
    begin
    imagerefresh;
    end;
    end;
    end;
    end;

    procedure TForm1.Image5MouseUp(Sender: TObject; Button: TMouseButton;
    Shift: TShiftState; X, Y: Integer);
    begin
    g1.docking:= false;
    g1.moving:= false;
    end;

    procedure TForm1.BitBtn2Click(Sender: TObject);
    var
    i, j: word;
    begin
    for i:=1 to 5 do
    for j:=1 to 5 do
    begin
    StringGrid1.Cells[j,i]:= IntToStr(Random(2)) ;
    end;
    end;

    end.
    Весь проект здес ь.
    -----
    Помогли тебе, помоги и ты.

    Ответ отправил: Евгений/Genia007/, Бакалавр
    Ответ отправлен: 10.03.2010, 18:43
    Номер ответа: 260036

    Оценка ответа: 5
    Комментарий к оценке:
    СУПЕР-ответ!!!
    Я очень признателен этому эксперту за такой грамотный ответ, все разложено детально,по полочкам
    Спасибо вам огромное...!

    Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 260036 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:

  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2010, Портал RFpro.ru, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2010.6.14 от 03.03.2010

    В избранное