Можно ли переопределить вызовы MessageDlg к Пользовательскому TForm/Dialog?

Эта ошибка, скорее всего, возникает с момента инициализации 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], который демонстрирует, как разместить карту для заданных границ

5
задан Christopher Chase 20 October 2008 в 23:06
поделиться

5 ответов

BTW, Вы хотите добавить его после Диалоговой единицы в Вашем пункте использования.

У Вас есть три варианта, по-моему:

  1. Добавьте свою собственную единицу после Диалоговой единицы, которая имеет метод под названием MessageDlg и имеет ту же подпись для создания собственной формы.
  2. Или создайте совершенно новый метод или набор методов, который создает определенные диалоговые окна с помощью собственной формы.
  3. Сделайте глобальный поиск и Замену для MessageDlg с DarkAxi0mMessageDlg и затем добавьте свою единицу DarkAxi0mDialogs к Вашему пункту использования.

Первый проблематичен, потому что Вы могли бы пропустить единицу и все еще получить старый MessageDlg. Второй берет намного больше использования, но обеспечивает лучшую гибкость в конечном счете. Третий является, вероятно, самым легким и с наименьшим количеством оборотных сторон. Удостоверьтесь, что Вы копируете прежде, чем сделать замену и затем используете различный инструмент (как Вне всякого сравнения) для проверки изменений.

5
ответ дан 14 December 2019 в 01:20
поделиться

Можно использовать инструмент как TextPad для искания/заменения всех экземпляров строки через папки и подпапки. Так, я предложил бы, чтобы Вы заменили "MessageDlg (" "MyMessageDlg (" так, чтобы можно было настроить его по желанию. Должен занять все 5 минут.

Я думаю, что это заставило бы Вас проблемы создавать замену и оставлять названным, как это в настоящее время находится в конфликте с VCL.

2
ответ дан 14 December 2019 в 01:20
поделиться

Я рекомендовал бы для инкапсуляции MessageDlg в Вас владеть процедурами, этот путь при изменении процедур, все Диалоговые окна сообщения будут изменены, и Вы сохраняете стандарт.

Пример: Создайте некоторые процедуры как, Предупреждение (), Ошибка (), Предупреждение (), и т.д. Если когда-нибудь необходимо изменять внешность сообщения об ошибке, необходимо сделать это только в одном месте.

Когда-нибудь Вы могли бы хотеть добавить изображение к своим сообщениям об ошибках, предупреждения... безотносительно, кто знает?

2
ответ дан 14 December 2019 в 01:20
поделиться

я сделал функцию 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;
0
ответ дан 14 December 2019 в 01:20
поделиться

Можно угнать функцию MessageDlg и заставить ее указать на собственную функцию MyMessageDlg (с той же подписью), но я думаю, что она была бы наименее безопасное из всех решений.
Плохой взлом вместо чистого кода IMO.

Сохраните исходные коды операций MessageDlg (asm сгенерированный компилятором)
Поместите трудный переход в свой код MyMessageDlg
... затем любой вызов к MessageDlg на самом деле выполнит ВАШ код...
Восстановите исходный код к MessageDlg
MessageDlg теперь ведет себя, как обычно,

Это работает, но должно быть зарезервировано для отчаянных положений...

0
ответ дан 14 December 2019 в 01:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: