Первый этап - установить ссылку на Microsoft Word в редакторе vb в Excel. Затем вы можете открыть текстовый документ следующим образом:
Dim wd as new Word.application
dim doc as word.document
set doc = wd.documents.open("path and mame of word document")
«Работа с таблицей выглядит так:« Предположим, цель - это указатель на ячейку Excel
Dim t As Word.Table
Set t = doc.Tables(1)
t.Cell(3, 2).Range.Copy 'this copies the cell at row 3, column 2
target.PasteSpecial xlPasteValues
.
Насколько я знаю, здесь существует два отдельных вопроса:
Необходимо будет явно вызвать конструктора базового класса:
constructor TMinMatrix.Create(Rows, Cols: Byte);
begin
inherited;
//...
end;
Необходимо будет также сделать конструктора дочернего класса override
, и конструктор базового класса virtual
, для проверки компилятор видит отношение между двумя. Если Вы не сделаете этого, то компилятор, вероятно, предупредит Вас, что конструктор TMinMatrix "скрывает" конструктора TMATRIX. Так, правильный код был бы:
type
TMatrix = class
protected
//...
public
constructor Create(Rows, Cols: Byte); virtual; // <-- Added "virtual" here
//...
type
TMinMatrix = class(TMatrix)
private
//...
public
constructor Create(Rows, Cols: Byte); override; // <-- Added "override" here
constructor CreateCopy(var that: TMinMatrix);
destructor Destroy; override; // <-- Also make the destructor "override"!
end;
Обратите внимание, что необходимо также сделать деструктор override
.
Обратите внимание, что можно только переопределить конструктора с тем же списком параметров. Если для дочернего класса нужен конструктор с различными параметрами, и Вы хотите препятствовать тому, чтобы конструкторы базового класса были вызваны непосредственно, необходимо записать:
type
TMyMatrix = class(TMatrix)
//...
public
constructor Create(Rows, Cols, InitialValue: Byte); reintroduce; virtual;
//...
end
implementation
constructor TMyMatrix.Create(Rows, Cols, InitialValue: Byte);
begin
inherited Create(Rows, Cols); // <-- Explicitly give parameters here
//...
end;
Я надеюсь, что это делает вещи более ясными... Удачи!
Вам нужна перегрузка для обоих конструкторов, если у них есть то же имя.
type
TMatrix = class
protected
//...
public
constructor Create(Rows, Cols: Byte);
//...
type
TMinMatrix = class(TMatrix)
public
constructor Create(Rows, Cols: Byte); overload;
constructor Create(var that: TMinMatrix); overload;
end;
Это - хорошая практика для вызова наследованного конструктора.
constructor TMinMatrix.Create(Rows, Cols: Byte);
begin
inherited Create(Rows, Cols); // Need to call the full name if the parameters are changed.
//...
end;
Необходимо назвать унаследованный метод явно; Delphi не сделает этого для Вас. Это дизайном, потому что существуют случаи, где Вы работаете с виртуальными методами, например, когда Вы не хотите вызывать наследованное поведение.
Кроме того, как персональное предпочтение, мне нравится выписывать наследованный вызов полностью. (наследованный Создают (строки, Седла); в противоположность просто наследованному; по одной простой причине: это делает что намного легче пересечь код. Если Вам выписали вызов метода, Вы можете щелчок управления он и добираться до методов предшествования.
Перегрузка, говорит компилятору, что метод имеет то же имя с различными параметрами.
Переопределите, говорит компилятору, что метод переопределяет его виртуальный или динамичный объявленный в базовом классе.
Повторно введите, скроет виртуальный или динамический метод, объявленный в базовом классе.
Определениями тезисов является из книги Ray Lischner {Delphi вкратце}
type
TFirst = class
private
FValue: string;
FNumber: Integer;
public
constructor Create(AValue: string; ANumber: integer);
property MyValue: string read FValue write FValue;
property MyNumber: Integer read Fnumber write FNumber;
end;
TSecond = class(TFirst)
public
constructor Create(AValue: string; ANumber: Integer);
end;
constructor TFirst.Create(AValue: string; ANumber: integer);
begin
MyValue := AValue;
MyNumber := ANumber;
end;
{ TSecond }
constructor TSecond.Create(AValue: string; ANumber: Integer);
begin
inherited;
end;
TSecond, как это объявляется, назовет создавание TFirst без наследованного, участники TSecond остаются пустыми.