Форум: "Начинающим";
Текущий архив: 2010.09.26;
Скачать: [xml.tar.bz2];
ВнизРабота с Excel/ Объясните, как понимать такую запись? Найти похожие ветки
← →
12 © (2010-07-01 10:05) [0]давно пользуюсь, всегда работает, но как() - не понимаю..
ActiveSheets := WorkBook.WorkSheets.Add(After:=Sheets);
как это?
а еще пример, в "родных для delphi понятиях" можно?
← →
Игорь Шевченко © (2010-07-01 10:28) [1]
> как это?
вызов метода IDispatch
← →
Anatoly Podgoretsky © (2010-07-01 11:03) [2]> 12 (01.07.2010 10:05:00) [0]
Так вроде в родных для Дельфи понятиях и написано. Это присвоение результата
функции.
← →
RWolf © (2010-07-01 13:15) [3]
> Anatoly Podgoretsky © (01.07.10 11:03) [2]
непонятно, почему Дельфи принимает такой синтаксис, ведь оператор :=, в отличие от сишной операции присвоения, не возвращает значение.
← →
Плохиш © (2010-07-01 13:24) [4]
> RWolf © (01.07.10 13:15) [3]
> непонятно, почему Дельфи принимает такой синтаксис
Так надо, наконец-то, прочитать описание синтаксиса используемого средства разработки.
← →
Anatoly Podgoretsky © (2010-07-01 13:45) [5]Если все написано правильно, то это к Дельфи не имеет оношения, это ДОМ, но я думаю что записано неправильно. Во всяком случае с претензиями надо обращаться к СОМ
← →
RWolf © (2010-07-01 13:46) [6][4]
да, неплохо бы; только во встроенном хелпе D7 такой способ обозначения параметров, кажется, не описан.
← →
Deltas © (2010-07-01 13:50) [7]
> Плохиш © (01.07.10 13:24) [4]
> Так надо, наконец-то, прочитать описание синтаксиса используемого
> средства разработки.
А для этого неплохо было бы, чтобы автор вопроса указал версию используемого средства разработки.
← →
12 © (2010-07-01 13:54) [8]D7
← →
12 © (2010-07-01 13:58) [9]ExcelApp, Workbook: Variant;
SSheet, Sheets, ActiveSheets: variant;
ExcelApp := CreateOleObject("Excel.Application");
Workbook := ExcelApp.WorkBooks.Open(ExtractFilePath(application.ExeName) +"ReportMatrixEquipFillAddress.xls");
SSheet := WorkBook.WorkSheets[1];
Sheets := WorkBook.WorkSheets.Item[WorkBook.WorkSheets.Count];
ActiveSheets := WorkBook.WorkSheets.Add(After:=Sheets); //вставить еще один лист последним
← →
Deltas © (2010-07-01 14:25) [10]Протестировал в D5. К моему удивлению, компилируется, не выдывая даже ни одного предупреждения, ни одной подсказки. Тем не менее, автоматическая вставка кода "Code Insight" не работает с таким кодом. Да и компилятор особо не переживает, если сделан вызов не существующего метода, например:
ActiveSheets := WorkBook.WorkSheets.Add7(After:=Sheets);
Непонятно, почему использован такой подход: использован тип данных Variant вместо TExcelApplication и TExcelWorkbook?
← →
Игорь Шевченко © (2010-07-01 14:38) [11]
> Непонятно, почему использован такой подход: использован
> тип данных Variant вместо TExcelApplication и TExcelWorkbook?
>
потому что varDispatch
← →
Плохиш © (2010-07-01 14:42) [12]
> RWolf © (01.07.10 13:46) [6]
>
> [4]
> да, неплохо бы; только во встроенном хелпе D7 такой способ
> обозначения параметров, кажется, не описан.
Help D7.
Тема "Zugriff auf Automatisierungsobjekte (nur Windows)"
Der Zugriff auf Automatisierungsobjekte erfolgt über Varianten. Wenn ein Automatisierungsobjekt über eine Variante referenziert wird, können die Eigenschaften des Objekts durch einen Aufruf der entsprechenden Objektmethoden über die Variante gelesen und geändert werden. Zu diesem Zweck muss ComObj in die uses-Klausel einer der Units, des Programms oder der Bibliothek aufgenommen werden.
Da Aufrufe von Methoden des Automatisierungsobjekts zur Laufzeit gebunden werden, sind keine Methodendeklarationen erforderlich. Die Gültigkeit solcher Aufrufe wird vom Compiler nicht überprüft.
Das folgende Beispiel demonstriert Aufrufe von Automatisierungsmethoden. Die (in ComObj definierte) Funktion CreateOleObject gibt eine IDispatch-Referenz auf ein Automatisierungsobjekt zurück und ist zuweisungskompatibel zur Variante Word.
var
Word: Variant;
begin
Word := CreateOleObject("Word.Basic");
Word.FileNew("Normal");
Word.Insert("Dies ist die erste Zeile"#13);
Word.Insert("Dies ist die zweite Zeile"#13);
Word.FileSaveAs("c:\temp\test.txt", 3);
end;
Parameter vom Typ einer Schnittstelle können an Automatisierungsmethoden übergeben werden.
Die Übergabe binärer Daten zwischen Automatisierungs-Controllern und Automatisierungs-Servern erfolgt bevorzugt über variante Arrays mit dem Elementtyp varByte. Da die Daten derartiger Arrays nicht übersetzt werden, können Sie mit den Routinen VarArrayLock und VarArrayUnlock effizient darauf zugreifen.
Syntax für Aufrufe von Automatisierungsmethoden
Aufrufe von Methoden eines Automatisierungsobjekts und Zugriffe auf die Eigenschaften des Objekts folgen einer ähnlichen Syntax wie normale Methodenaufrufe und Eigenschaftszugriffe. Beim Aufruf einer Automatisierungsmethode können aber sowohl Positionsparameter als auch benannte Parameter verwendet werden (benannte Parameter werden allerdings nicht von allen Automatisierungs-Servern unterstützt).
Ein Positionsparameter ist einfach ein Ausdruck. Ein benannter Parameter setzt sich aus einem Parameterbezeichner, dem Symbol := und einem Ausdruck zusammen. In einem Methodenaufruf müssen Positionsparameter immer vor benannten Parametern angegeben werden. Die Reihenfolge der benannten Parameter ist beliebig.
Bei bestimmten Automatisierungs-Servern können in Methodenaufrufen Parameter weggelassen werden. In diesem Fall werden Standardwerte verwendet. Ein Beispiel:
Word.FileSaveAs("test.doc");
Word.FileSaveAs("test.doc", 6);
Word.FileSaveAs("test.doc",,,"secret");
Word.FileSaveAs("test.doc", Password := "secret");
Word.FileSaveAs(Password := "secret", Name := "test.doc");
Sie können einer Automatisierungsmethode neben Parametern vom Typ Integer und String auch reelle, Boolesche und variante Typen übergeben. Parameterausdrücke, die nur aus einer Variablenreferenz bestehen, werden als Referenz übergeben. Dies gilt allerdings nur, wenn die Variablenreferenz einen der folgenden Typen hat: Byte, Smallint, Integer, Single, Double, Currency, TDateTime, AnsiString, WordBool oder Variant. Hat der Ausdruck einen anderen Typ oder handelt es sich nicht um eine Variable, wird der Parameter als Wert übergeben. Wird ein Parameter per Referenz an eine Methode übergeben, die einen Wert-Parameter erwartet, ermittelt COM den Wert aus der Referenz. Dagegen führt die Übergabe eines Wert-Parameters an eine Methode, die eine Übergabe per Referenz erwartet, zu einem Fehler.
← →
Deltas © (2010-07-01 14:51) [13]
> потому что varDispatch
Если я правильно понял, Вы имеете в виду, результат функции CreateOleObject() - объект реализующий интерфейс IDispatch. Но можно заменить эту функцию на TExcelApplication.Create(). Пока что не вижу, чем можно оправдать использование типа данных Variant.
← →
12 © (2010-07-01 15:09) [14]> Непонятно, почему использован такой подход: использован
> тип данных Variant вместо TExcelApplication и TExcelWorkbook?
потому что так работает всегда (не разу не глюкнуло)
а когда начинаешь править всякие отчеты, где
> TExcelApplication и TExcelWorkbook
начинается.. то не найдено, другое не такого типа должно быть
понятно примерно теперь, спасибо
← →
RWolf © (2010-07-01 15:22) [15]
> Плохиш © (01.07.10 14:42) [12]
действительно, есть такое; спасибо за наводку.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2010.09.26;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.003 c