Добрый день! Необходимо написать графический редактор следующего вида: Окно разбито на 2 части, в левой вводятся параметры фигуры, в правой она отрисовывается. Например: для начала задан прямоугольник высотой 50 и шириной 100. Указываем высоту - 25, на ней ширина 50 и фигура должна преобразоваться, приняв форму песочных часов и далее в этом духе. Надеюсь нормально объяснил...
Программу еще не начал, код писать не прошу, необходима консультация в том, какие элементы выбрать для разработки, TPaintBox или TImage и т.д. и как лучше всё это отрисовывать, может кто может дать совет?
Не знаю, с чем у тебя там проблема, вот этот код работает прекрасно:
procedure Tf_main.N7Click(Sender: TObject);
var WordApp, Table : Variant;
procedure CommentTable(numRows : integer; const s : string); begin wordapp.selection.MoveDown(wdLine, numRows, EmptyParam); wordapp.selection.TypeParagraph; wordapp.selection.InsertAfter(Name); // снимаем выделение с выведенного текста, // чтобы вывод следующей таблицы не затер этот текст wordapp.selection.MoveDown(wdLine, 1, EmptyParam); wordapp.selection.TypeParagraph; end;
var i1, i2, j, R: Integer; new_doc : Variant; fn:string; numCols, numRows : Integer; s : string; begin if SaveDialog1.Execute then begin WordApp := CreateOleObject('Word.Application'); // С этим приложением работаем WordApp.Visible := True; // Это НЕЛЬЗЯ отключать на Word до 2002, вставка будет работать неправильно!!! new_doc := WordApp.Documents.Add; // Новый документ
for j := 0 to ComponentCount - 1 do begin if Components[j] is TEdit then with Components[j] as TEdit do begin // Saving Edits (* WordApp.Selection.TypeText(Edit1.text); WordApp.Selection.TypeText(#13#10'new'); *) end else if Components[j] is TStringGrid then with Components[j] as TStringGrid do begin // Saving Grigs numCols := ColCount; numRows := RowCount; table := new_doc.Tables.Add(WordApp.Selection.Range, numRows, numCols);
for i1:=0 to RowCount-1 do for i2:=0 to ColCount-1 do begin Table.Cell(i1+1, i2+1).Range.Text:=Cells[i2, i1]; end;
Table.Cell(0, 0).Select; // Выводим снизу от таблицы имя компонента. // В принципе, можешь выводить любую информацию. CommentTable(numRows + 1, Name); end else if Components[j] is TChart then begin // Saving Charts fn := ExtractFilePath(Application.ExeName) + 'tmp.bmp'; (Components[j] as TChart).SaveToBitmapFile(fn); WordApp.Selection.TypeParagraph; WordApp.Selection.InlineShapes.AddPicture(FileName:=fn, LinkToFile:=False, SaveWithDocument:=True); DeleteFile(fn); wordapp.selection.InsertAfter('Chart : ' + Name); wordapp.selection.MoveDown(wdLine, 1, EmptyParam); WordApp.Selection.TypeParagraph; end; end; WordApp.ActiveDocument.SaveAs(SaveDialog1.FileName+'.doc'); WordApp.Quit; WordApp := Unassigned; end; end;
(Delphi 2009 + OfficeXP). Если у тебя у Chart-а нет даже метода SaveToBitmapFile - может, это повод задуматься о переходе на более новую версию (или чарта, или Дельфи)? Для Edit-ов доделаешь сам, я не знаю, что тебе там нужно сохранять.
Единственное НО: теперь нельзя оставлять невидимым word application во время сохранения этого отчета (для некоторых версий Word-а). Это баг, сказать "спасибо" за который можно разработчику Оффиса, т.е., MS: MoveDown Method Behaves Incorrectly When Word Is Hidden
Да. И еще: если ты не хочешь, чтоб у тебя в файл забрасывалась таблица, которая в большинстве своем содержит пустые ячейки (а именно это и происходит с GridRoom, там 99 строк, из которых заполнены - всего 4), то или уменьшай RowCount для этого грида, или работай через VarArrayCreate ( как с ним работать - я показывал вот тут: Отчет Excel ), тоже, заполняй только те строки, в которых есть хотя бы одно значение, зачем пустые-то ячейки создавать?