Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001
- Название:Советы по Delphi. Версия 1.4.3 от 1.1.2001
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Валентин Озеров - Советы по Delphi. Версия 1.4.3 от 1.1.2001 краткое содержание
…начиная с 1001. Смотрите другие файлы…
Советы по Delphi. Версия 1.4.3 от 1.1.2001 - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
{ 1 – количество серий (в нашем случае 1), 3 – количество значений }
OpenData[COD_VALUES] := MakeLong(1,3);
{ Hомер текущей серии }
ThisSerie := 0;
{ Value[i] – значение с индексом i }
{ Legend[i] – комментарий к этому значению }
Value[0] := a;
Legend[0] := 'Значение переменной A';
Value[1] := b;
Legend[1] := 'Значение переменной B';
Value[2] := c;
Legend[2] := 'Значение переменной C';
{ Закрываем режим }
CloseData[COD_VALUES] := 0;
{ Ширина поля с комментариями на экране (в пикселах) }
LegendWidth := 150;
Visible := true;
end;
end;
end.
Как осуществить минимальный тест на корректность глобального идентификатора (GUID), и интерфейсов, унаследованных от IDispatch?
Как осуществить минимальный тест на корректность глобального идентификатора (GUID), и интерфейсов, унаследованных от IDispatch (и, следовательно, поддерживающих методы автоматизации)?
Nomadicсоветует:
Вызовите CreateRemoteComObject, передав GUID интерфейса и имя компьютера, к которому Вы пытаетесь подключиться. Если функция вернет ошибку, то наличествует проблема сервера, иначе возможная проблема относится к клиенту.
constMyGUID = '{444…111}'; //Whatever the guid is…
var
Unk: IUnknown;
Disp: IDispatch;
begin
{ Make sure this line works correctly }
Unk := CreateRemoteComObject('server1', StringToGUID(MyGUID));
{ If it does, then cast it to a IDispatch }
Disp := Unk asIDispatch;
end;
Если этот кусок кода работает, а проблема остается, то Вам требуется шаг за шагом пройти через код клиента и найти, где он дает трещину. Если не сможете этого обнаружить, Вам придется запустить сервер под отладчиком и установить связь с клиентом, чтобы Вы могли произвести отладку рядом со местом, дающем слабину.
DCOM
В чем разница между сокетами, DCOM и OLE Enterprise при использовании их в качестве транспорта?
Nomadicотвечает:
Sockets (TCP/IP):
• на клиентах и сервере требуется наличие стека TCP/IP;
• не требуется дополнительной настройки клиентов;
DCOM:
• на клиентах и серверах требуется наличие DCOM (входит в состав Windows NT 4.0, для Windows 95 доступен как опция)
• требуется настройка клиентов (DCOM Configuration Utility — DCOMCNFG.EXE);
• встроенная поддержка модели безопасности Windows NT;
• поддержка обратных вызовов (методов);
CORBA
• на клиентах и серверах требуется наличие Common Object Request Broker;
• требуется настройка клиентов;
• поддержка обратных вызовов (методов);
OLE Enterprise:
• на клиентах и серверах требуется наличие OLE Enterprise;
• требуется настройка клиентов;
• поддержка обратных вызовов (методов);
DDE
DDE – передача текста
Delphi 1
Вот я как работаю с Excel:
type
DDEClientConv1.SetLink('Excel','Sheet1');
try
DDEClientConv1.OpenLink;
DDEClientItem1.DDEItem:= 'R1C1';
DDEClientConv1.PokeData(DDEClientItem1.DDEItem, StrPCopy(P, SomeString)));
finally
DDEClientConv1.CloseLink;
end;
Как вы можете здесь видеть, свойство DDEItem определяется сервером. Если ваш сервер является приложением Delphi, то DDEItem – имя DDEServerItem. На вашем месте я бы не стал так долго заниматься отладкой DDE-программ. Воспользуйтесь синхронизацией, позволяющей понять при отладке правильность действий.
Управление Program Manager в Win95 с помощью DDE
Delphi 1
Для управления программными группами в Program Manager с помощью DDE мною был использован следующий модуль. За основу был взят код Steve Texeira (sp) из руководства Dephi Developers Guide.
Работает под Win 3.1 и '95.
unitPm;
interface
usesSysUtils, Classes, DdeMan;
type
EProgManError = class( Exception);
TProgMan = class(TComponent)
private
FDdeClientConv: TDdeClientConv;
procedureInitDDEConversation;
functionExecMacroString(Macro: String): Boolean;
public
constructorCreate(AOwner: TComponent); override;
destructorDestroy; override;
ProcedureCreateGroup(GroupName: String; ShowGroup:Boolean);
procedureDeleteGroup(GroupName: String);
procedureDeleteItem(ItemName: String);
procedureAddItem(CmdLine, ItemName: String);
end;
implementation
usesUtils;
const
{ DDE-макростроки для Program Manager }
SDDECreateGroup = '[CreateGroup(%s)]';
SDDEShowGroup = '[ShowGroup(%s, 1)]';
SDDEDeleteGroup = '[DeleteGroup(%s)]';
SDDEDeleteItem = '[DeleteItem(%s)]';
SDDEAddItem = '[AddItem(%s, "%s", %s)]';
constructorTProgMan.Create(AOwner: TComponent);
begin
inheritedCreate(AOwner);
InitDDEConversation;
end;
destructorTProgMan.Destroy;
begin
ifAssigned(FDDEClientConv) thenFDdeClientConv.CloseLink;
inheritedDestroy;
end;
functionTProgMan.ExecMacroString(Macro: String): Boolean;
Begin
StringAsPchar(Macro);
Result := FDdeClientConv.ExecuteMacro(@Macro[1], False);
End;
ProcedureTProgMan.InitDDEConversation;
begin
FDdeClientConv := TDdeClientConv.Create(Self);
If NOTFDdeClientConv.SetLink('PROGMAN', 'PROGMAN') then
raiseEProgManError.Create('Не могу установить DDE Link');
end;
ProcedureTProgMan.CreateGroup(GroupName: String; ShowGroup:Boolean);
Begin
{ Удаляем группу, если она существует }ExecMacroString(Format(SDDEDeleteGroup, [GroupName]));
If NOTExecMacroString(Format(SDDECreateGroup, [GroupName])) then
raiseEProgManError.Create('Не могу создать группу ' + GroupName);
IfShowGroup then
If notExecMacroString(Format(SDDEShowGroup, [GroupName])) then
raiseEProgManError.Create('Не могу показать группу ' + GroupName);
End;
ProcedureTProgMan.DeleteGroup(GroupName: String);
Begin
if NOTExecMacroString(Format(SDDEDeleteGroup, [GroupName])) then
raiseEProgManError.Create('Не могу удалить группу ' + GroupName);
End;
ProcedureTProgMan.DeleteItem(ItemName: String);
Begin
if NOTExecMacroString(Format(SDDEDeleteGroup, [ItemName])) then
raiseEProgManError.Create('Не могу удалить элемент ' + ItemName);
End;
ProcedureTProgMan.AddItem(CmdLine, ItemName: String);
Var
P: PChar;
PSize: Word;
Begin
PSize := StrLen(SDDEAddItem) + (Length(CmdLine) *2) + Length(ItemName) + 1;
GetMem(P, PSize);
try
StrFmt(P, SDDEAddItem, [CmdLine, ItemName, CmdLine]);
if NOTFDdeClientConv.ExecuteMacro(P, False) then
Интервал:
Закладка: