2008-10-20 13 views
5

kimse çağrıyı geçersiz kılmak ve kendi gösteriyor bir yolu bilir, benim proje boyunca (GExperts Mesaj Diyalog aracı :) sayesinde) buMessageDlg çağrılarını Özel TForm/Dialog'a geçersiz kılar mısınız?

MessageDlg('', mtWarning, [mbOK], 0); 

benzer bir kod kullanarak olmuştur ve ben merak ediyorum özel form. bence olabilir

tek yolu onun İletişim Kutuları ünitesinden önce listelerini

function MessageDlg(const Msg: string; DlgType: TMsgDlgType; 
    Buttons: TMsgDlgButtons; HelpCtx: Longint): Integer; 
begin 
    //show my own code here 
end; 

gibi bir şey ile Yeni Bir Form yapmak ve benim kullanımları bunu her koydu yapmak ama emin olmak için garantili bir yol var Benim kodları Dialogs Birim Kodu değil kullanır.
Diyalog ünitesini yerel bir direk kopyalama ve üzerinde değişiklik yapma fikrini sevmiyorum.

Veya bunların hepsi çok işe yarar ve sadece kendi işlev çağrısı kullanmalı ve tüm MessageDlg'leri kendi başıma değiştirmeliyim. (hangi eğlenceli olmazdı, ben çok fazla MessageDlg kullanılır)

cevap

5

BTW, kendi kullandığı yan tümcesinde iletişim kutuları sonra birimi eklemek istediğiniz

sen Bence üç seçenek vardır:..

  1. Kendi ünitenizi ekleyin MessageDlg adlı bir yönteme sahip İletişim Kutuları birimi ve kendi formunuzu oluşturmak için aynı imzası vardır. Veya kendi formunuzu kullanarak belirli iletişim kutuları oluşturan yepyeni bir yöntem veya yöntem kümesi oluşturun.
  2. küresel Arama & DarkAxi0mMessageDlg ile için MessageDlg değiştirin ve sonra kullandığı maddeye sizin DarkAxi0mDialogs birim eklemek yapın.

İlki sorunludur çünkü üniteyi kaçıp eski MessageDlg'i alabilirsiniz. İkincisi çok daha fazla kullanım gerektirir, ancak uzun vadede daha fazla esneklik sağlar. Üçüncüsü muhtemelen en kolay ve en az downsides ile. Değiştirmeden önce yedeklediğinizden emin olun ve değişikliklerinizi kontrol etmek için bir fark aracını kullanın (Beyond Compare gibi).

+0

Ayrıca, bir dosyada bir sürü varsa Sync Edit için başka bir kullanım, sadece birincisini bul, bir dosyanın sonuna kadar seç ve düzenle düzenle. – skamradt

+0

GExperts projesi grep araması, tüm referansları bulma konusunda yardımcı olmak için iyi bir iştir. – skamradt

2

MessageDlg'i kendi prosedürlerinizin içine dahil etmenizi öneririm, bu şekilde işlemlerinizi değiştirirseniz, tüm Mesaj diyaloglarınız değişecek ve standart.

Örnek: Alert(), Error(), Warning(), vb. Gibi bazı yordamlar oluşturun. Hata iletinizin görünümünü değiştirmeye ihtiyacınız varsa, bunu yalnızca bir yerde yapmanız gerekir.

Bir gün hata iletilerinize resim eklemek isteyebilirsiniz, uyarılar ... her neyse, kim bilir?

2

Bir dizenin tüm örneklerini klasörler ve alt klasörler arasında aramak/değiştirmek için TextPad gibi bir aracı kullanabilirsiniz. Yani, "MessageDlg (" ile "MyMessageDlg (" ile değiştirirsiniz), böylece onu özelleştirebilirsiniz böylece öneririz. 5 dakika sürmelidir.

Size bir sorun yaratmak ve bir sorun yaratmak için sorun yaratacağını düşünüyorum o VCL ile çatışma aşamasında olduğundan bu adlandırılmış

+0

Bakım programcıları için kafa karıştırıcı bir şeyden bahsetmeyiniz! – Blorgbeard

0

Sen MessageDlg fonksiyonunu kaçırmak ve (aynı imzayla) Kendi MyMessageDlg işlevine işaret yapmak ama bütün çözümlerin en güvenli olur düşünebiliriz.
Temiz kod IMO yerine kötü bir kesmek.
sonra MessageDlg için herhangi bir çağrı aslında SİZİN kodu çalıştırmak olacaktır MyMessageDlg kodu
... zor bir sıçrama koyun (asm derleyici tarafından üretilen) MessageDlg orijinal işlem kodları

kaydet ...
Restore
MessageDlg MessageDlg orijinal kod artık O çalışıyor ancak zor durumlarda için ayrılmış olmalıdır ... Her zamanki

olarak davranır

0

MessageDlgEx işlevini MessageDlg'e göre yaptım ve tüm uygulamalarımın kullanabilmesi için "kitaplık" dosyalarından birine girdim. işlevim varsayılan & iptal düğmelerini belirlemenize, düğme metinleri vermenize vb. olanak tanır. Yerleşik işlevi değiştirmek/değiştirmek için kötü bir uygulama olur. Hala yerleşik fonksiyonu kullanıyorum ama biraz daha fazla ihtiyaç duyulan durumlar için bu işlevi elinizde bulundurun.

FYI - işlev, basılan düğmenin sayısını döndürür. ilk düğme 1'dir. Kapat, 0'lık bir geri dönüş değerine neden olur. düğmelerin hiçbir glifi yoktur.

Yaklaşık 5 yıl boyunca kullanıyorum & bana iyi hizmet vermiştir.

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; 
İlgili konular