Эта ошибка, скорее всего, возникает с момента инициализации allowedBounds
, API Карт Google еще не загружен , и поэтому объекты Карт Google, такие как google.maps.LatLngBounds
, еще не доступны. agm-map
поставляется с загрузчиком , который загружает библиотеку Google Maps асинхронно .
Чтобы обеспечить загрузку API Карт Google, можно использовать сервис MapsAPILoader
, как показано ниже:
export class AppComponent {
bounds = null;
constructor(private mapsAPILoader: MapsAPILoader) {
this.mapsAPILoader.load().then(() => {
this.bounds = new google.maps.LatLngBounds(
new google.maps.LatLng(51.130739, -0.868052), // SW
new google.maps.LatLng(51.891257, 0.559417) // NE
);
console.log(this.bounds);
});
}
}
Вот демонстрация [ 117], который демонстрирует, как разместить карту для заданных границ
BTW, Вы хотите добавить его после Диалоговой единицы в Вашем пункте использования.
У Вас есть три варианта, по-моему:
Первый проблематичен, потому что Вы могли бы пропустить единицу и все еще получить старый MessageDlg. Второй берет намного больше использования, но обеспечивает лучшую гибкость в конечном счете. Третий является, вероятно, самым легким и с наименьшим количеством оборотных сторон. Удостоверьтесь, что Вы копируете прежде, чем сделать замену и затем используете различный инструмент (как Вне всякого сравнения) для проверки изменений.
Можно использовать инструмент как TextPad для искания/заменения всех экземпляров строки через папки и подпапки. Так, я предложил бы, чтобы Вы заменили "MessageDlg (" "MyMessageDlg (" так, чтобы можно было настроить его по желанию. Должен занять все 5 минут.
Я думаю, что это заставило бы Вас проблемы создавать замену и оставлять названным, как это в настоящее время находится в конфликте с VCL.
Я рекомендовал бы для инкапсуляции MessageDlg в Вас владеть процедурами, этот путь при изменении процедур, все Диалоговые окна сообщения будут изменены, и Вы сохраняете стандарт.
Пример: Создайте некоторые процедуры как, Предупреждение (), Ошибка (), Предупреждение (), и т.д. Если когда-нибудь необходимо изменять внешность сообщения об ошибке, необходимо сделать это только в одном месте.
Когда-нибудь Вы могли бы хотеть добавить изображение к своим сообщениям об ошибках, предупреждения... безотносительно, кто знает?
я сделал функцию MessageDlgEx на основе MessageDlg и бросил его в один из моих файлов "библиотеки", таким образом, все мои приложения могут использовать его. моя функция позволяет Вам указывать значение по умолчанию и кнопки отмены, давать тексты кнопки, и т.д. это была бы плохая практика для изменения/заменения встроенной функции. я все еще использую встроенную функцию, но держу эту функцию под рукой для ситуаций, где немного больше необходимо.
К вашему сведению - функция возвращает количество нажатой кнопки. первая кнопка равняется 1. сурово обращение вызывает возвращаемое значение 0. кнопки не имеют никаких глифов.
я использовал это в течение приблизительно 5 лет, и это служило мне хорошо.
function MessageDlgEx(Caption, Msg: string; AType: TMsgDlgType;
AButtons: array of string;
DefBtn, CanBtn: Integer; iWidth:integer=450;bCourier:boolean=false): Word;
const
icMin=50;
icButtonHeight=25;
icInterspace=10;
icButtonResultStart=100;
icFirstButtonReturnValue=1;
var
I, iButtonWidth, iAllButtonsWidth,
iIconWidth,iIconHeight:Integer;
LabelText:String;
Frm: TForm;
Lbl: TLabel;
Btn: TBitBtn;
Glyph: TImage;
FIcon: TIcon;
Rect:TRect;
Caption_ca:Array[0..2000] of Char;
begin
{ Create the form.}
Frm := TForm.Create(Application);
Frm.BorderStyle := bsDialog;
Frm.BorderIcons := [biSystemMenu];
Frm.FormStyle := fsStayOnTop;
Frm.Height := 185;
Frm.Width := iWidth;
Frm.Position := poScreenCenter;
Frm.Caption := Caption;
Frm.Font.Name:='MS Sans Serif';
Frm.Font.Style:=[];
Frm.Scaled:=false;
if ResIDs[AType] <> nil then
begin
Glyph := TImage.Create(Frm);
Glyph.Name := 'Image';
Glyph.Parent := Frm;
FIcon := TIcon.Create;
try
FIcon.Handle := LoadIcon(HInstance, ResIDs[AType]);
iIconWidth:=FIcon.Width;
iIconHeight:=FIcon.Height;
Glyph.Picture.Graphic := FIcon;
Glyph.BoundsRect := Bounds(icInterspace, icInterspace, FIcon.Width, FIcon.Height);
finally
FIcon.Free;
end;
end
else
begin
iIconWidth:=0;
iIconHeight:=0;
end;
{ Loop through buttons to determine the longest caption. }
iButtonWidth := 0;
for I := 0 to High(AButtons) do
iButtonWidth := Max(iButtonWidth, frm.Canvas.TextWidth(AButtons[I]));
{ Add padding for the button's caption}
iButtonWidth := iButtonWidth + 18;
{assert a minimum button width}
If iButtonWidth<icMin Then
iButtonWidth:=icMin;
{ Determine space required for all buttons}
iAllButtonsWidth := iButtonWidth * (High(AButtons) + 1);
{ Each button has padding on each side}
iAllButtonsWidth := iAllButtonsWidth +icInterspace*High(AButtons);
{ The form has to be at least as wide as the buttons with space on each side}
if iAllButtonsWidth+icInterspace*2 > Frm.Width then
Frm.Width := iAllButtonsWidth+icInterspace*2;
if Length(Msg)>sizeof(Caption_ca) then
SetLength(Msg,sizeof(Caption_ca));
{ Create the message control}
Lbl := TLabel.Create(Frm);
Lbl.AutoSize := False;
Lbl.Left := icInterspace*2+iIconWidth;
Lbl.Top := icInterspace;
Lbl.Height := 200;
Lbl.Width := Frm.ClientWidth - icInterspace*3-iIconWidth;
Lbl.WordWrap := True;
Lbl.Caption := Msg;
Lbl.Parent := Frm;
if bCourier then
lbl.Font.Name:='Courier New';
Rect := Lbl.ClientRect;
LabelText:=Lbl.Caption;
StrPCopy(Caption_ca, LabelText);
Lbl.Height:=DrawText(Lbl.Canvas.Handle,
Caption_ca,
Length(LabelText),
Rect,
DT_CalcRect or DT_ExpandTabs or DT_WordBreak Or DT_Left);
If Lbl.Height<iIconHeight Then
Lbl.Height:=iIconHeight;
{ Adjust the form's height accomodating the message, padding and the buttons}
Frm.ClientHeight := Lbl.Height + 3*icInterspace + icButtonHeight;
{ Create the pusbuttons}
for I := 0 to High(AButtons) do
begin
Btn := TBitBtn.Create(Frm);
Btn.Height := icButtonHeight;
Btn.Width := iButtonWidth;
Btn.Left:=((Frm.Width-iAllButtonsWidth) Div 2)+I*(iButtonWidth+icInterspace);
Btn.Top := Frm.ClientHeight - Btn.height-icInterspace;
Btn.Caption := AButtons[I];
Btn.ModalResult := I + icButtonResultStart + icFirstButtonReturnValue;
Btn.Parent := Frm;
If I=DefBtn-1 Then
Begin
Frm.ActiveControl:=Btn;
Btn.Default:=True;
End
Else
Btn.Default:=False;
If I=CanBtn-1 Then
Btn.Cancel:=True
Else
Btn.Cancel:=False;
end;
Application.BringToFront;
Result := Frm.ShowModal;
{trap and convert user Close into mrNone}
If Result=mrCancel Then
Result:=mrNone
Else
If Result>icButtonResultStart Then
Result:=Result - icButtonResultStart
Else
Exception.Create('Unknown MessageDlgEx result');
Frm.Free;
end;
Можно угнать функцию MessageDlg и заставить ее указать на собственную функцию MyMessageDlg (с той же подписью), но я думаю, что она была бы наименее безопасное из всех решений.
Плохой взлом вместо чистого кода IMO.
Сохраните исходные коды операций MessageDlg (asm сгенерированный компилятором)
Поместите трудный переход в свой код MyMessageDlg
... затем любой вызов к MessageDlg на самом деле выполнит ВАШ код...
Восстановите исходный код к MessageDlg
MessageDlg теперь ведет себя, как обычно,
Это работает, но должно быть зарезервировано для отчаянных положений...