Вопрос № 177121: Здравствуйте,уважаемые эксперты! У меня к вам вот какой практический вопрос: Я сделал на форме несколько элементов Image и сделал так чтобы их можно было перемещать по щелчку мыши Вопрос: необходимо будет нарисовать стрелки между этими элем...
Вопрос № 177121:
Здравствуйте,уважаемые эксперты! У меня к вам вот какой практический вопрос: Я сделал на форме несколько элементов Image и сделал так чтобы их можно было перемещать по щелчку мыши Вопрос: необходимо будет нарисовать стрелки между этими элементами (как бы связать их друг с другом-граф построить),но ведь элементы движутся-значит и стрелки должны перемещаться и увеличиваться/уменьшаться в размере Как это реализовать?
Здравствуйте, Миронычев Виталий! Лучше - динамически Каждоя стрелка - ето обект, которой знает кто его Image source и кто его Image target. Конечно, знает и как рисовать себе :) Для меня в подобной ситъации проблема бьила как лучше определить позицию в которою стрекла косается с/в Image.
Ответ отправил: Bochvarov NikB, Студент
Ответ отправлен: 07.03.2010, 17:24
Номер ответа: 259968
Вам помог ответ? Пожалуйста, поблагодарите эксперта за это! Как сказать этому эксперту "спасибо"?
Отправить SMS#thank 259968
на номер 1151 (Россия) |
Еще номера »
Отвечает Евгений/Genia007/, Бакалавр :
Здравствуйте, Миронычев Виталий. Могу предложить свой вариант решения данной задачи, так как image используется только для вывода вершин графа, предлагаю от них избавиться и рисовать весь граф на одном image. При создания программы, для рисования графа, был использован модуль Graph_obj.pas из исходников программы GraphIllustrator 5 Александра Сергеева. Вот главный модуль программы:
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.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.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 (Россия) |
Еще номера »
Оценить выпуск »
Нам очень важно Ваше мнение об этом выпуске рассылки!
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.