Редактор блок схем
подскажите, как можно реализовать программу для построения блок схем, и генерации из нее кода, рисовать необходимо в stringgrid, небольшие наброски в прикрепленном архиве.
Не понятно зачем использовать stringgrid, компонент, предназначенный для отображения табличной информации. Или Вы хотите использовать его также как многие используют тег table в html, т.е. как сетку, в которую можно вставлять изображения с элементами блок-схемы. По-моему, будет не очень сложно рисовать на холсте все необходимое, но таблицу тоже можно, конечно.
Соответственно, генерация и редактирование кода должны происходить по событиям добавления и удаления элементов блок-схемы.
Зачем? Можно генерацию вынести в конечный этап.
От автора хотелось бы услышать, как он себе представляет всю программу в целом? Какое ТЗ и какая архитектура?. Пока я увидел только похвальное желание использовать классы. Но рано писать классы пока нет четкой ясности их назначения и взаимодействия. Опять же - StringGrid. Что, он навязан в ТЗ или автор сам выбрал? StringGrid накладывает определенные "правила игры", придется подстраиваться под взаимодействие именно с этим компонентом.
StringGrid-требование, а программу представляю так, на stringgrid рисуется какие-либо элементы(выбираем через speedbutton.glyph), в ячейку элемента вписывается значения, после этого проверяем все ячейки stringgrid, смотрим что в них и выводим соответственный код в memo.
Насчет рисования вот, по-моему, правильный подход здесь (в самом конце).
Так проще с обработчиком onDrawCell взаимодействовать (он ведь все ячейки перерисовывает сразу). Имею ввиду, что можно такое компактное решение обеспечить:
Код:
//из вышеуказанного источника
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var elem: TElem;
begin
elem := TElem((Sender as TStringGrid).Objects[ACol, ARow]);
if elem <> nil then
elem.Draw( (Sender as TStringGrid).Canvas, Rect);
end;
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
var elem: TElem;
begin
elem := TElem((Sender as TStringGrid).Objects[ACol, ARow]);
if elem <> nil then
elem.Draw( (Sender as TStringGrid).Canvas, Rect);
end;
Можно рисовать на канве, можно выводить картинки. Вывод текста тоже можно на канву делать с помощью TextOut, например.
Но классы должны и для генератора кода что-то содержать...
Исходник, иллюстрирующий сказанное. Без обработки исключений и проч., лишь сама идея. Вариант без полиморфизма. Использовать полиморфизм или нет, решать вам - зависит от того, какую архитектуру будете организовывать.
Project_Scheme_2
Код:
procedure TForm1.StringGrid1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
(Sender as TStringGrid).Objects[StringGrid1.Col, StringGrid1.Row]:=
TDecision.Create;
(Sender as TStringGrid).Objects[StringGrid1.Col, StringGrid1.Row]:=
TOutput.Create;
end;
Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
(Sender as TStringGrid).Objects[StringGrid1.Col, StringGrid1.Row]:=
TDecision.Create;
(Sender as TStringGrid).Objects[StringGrid1.Col, StringGrid1.Row]:=
TOutput.Create;
end;
Upd
Чтобы закончить с отрисовкой, вот пример использования полиморфизма при рисовании объектов-фигур, наследников общего класса.
Upd2
new project