Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi "Don't ask again" Messagedialog ? (https://www.delphipraxis.net/132114-dont-ask-again-messagedialog.html)

v2afrank 14. Jul 2010 06:51

AW: "Don't ask again" Messagedialog ?
 
Ich hole den Thread jetzt mal wieder nach oben. Unter Delphi 2010 funktioniert das nämlich nicht mehr. Es wird nur der erste Buchstabe des Text und der Caption angezeigt.
Taskdialog kann ich nicht nehmen, da das Programm unter XP auch noch arbeiten soll. Hat einer eine Idee ?

uligerhardt 14. Jul 2010 08:28

AW: "Don't ask again" Messagedialog ?
 
Zitat:

Zitat von v2afrank (Beitrag 1035192)
Taskdialog kann ich nicht nehmen, da das Programm unter XP auch noch arbeiten soll. Hat einer eine Idee ?

Es gibt ja einige TaskDialog-Nachimplementationen (z.B. von JED und TMS). Die haben vermutlich auch diese DSA-Funktionalität.

v2afrank 14. Jul 2010 08:30

AW: "Don't ask again" Messagedialog ?
 
Das schon, aber die Kosten 85 bzw. 185 Euro. Das ist es mir nicht Wert.
Da bau ich mir lieber selber ein Fenster

hoika 14. Jul 2010 09:03

AW: "Don't ask again" Messagedialog ?
 
Hallo,

Zitat:

Unter Delphi 2010 funktioniert das nämlich nicht mehr. Es wird nur der erste Buchstabe des Text und der Caption angezeigt.
Könnte am Unicode liegen.
Ändere beim Bsp.-Code auf Seite 1 alles von String auf AnsiString,
und übergib auch nur einen solchen.


Heiko

uligerhardt 14. Jul 2010 09:07

AW: "Don't ask again" Messagedialog ?
 
Zitat:

Zitat von v2afrank (Beitrag 1035204)
Das schon, aber die Kosten 85 bzw. 185 Euro. Das ist es mir nicht Wert.
Da bau ich mir lieber selber ein Fenster

Ob sich das lohnt, kommt auf deinen Stundensatz an. ;-)

cookie22 14. Jul 2010 09:12

AW: "Don't ask again" Messagedialog ?
 
bau dir einen mit ner form zusammen. wo ist das problem? das dauert höchstens 5 minuten.

himitsu 14. Jul 2010 09:35

AW: "Don't ask again" Messagedialog ?
 
Haben wir nicht auch irgendwo soeinen Dialog als OpenSource in der DP rumliegen?
Dachte ich hätte sowas mal gesehn.

v2afrank 14. Jul 2010 09:38

AW: "Don't ask again" Messagedialog ?
 
Ich finde es schon schöner, wenn sich die Messagebox dem Design von Windows anpasst, was bei einem selbstgebauten Formular nicht so schön ist.

Zitat:

Zitat von hoika (Beitrag 1035208)
Hallo,

Könnte am Unicode liegen.
Ändere beim Bsp.-Code auf Seite 1 alles von String auf AnsiString,
und übergib auch nur einen solchen.
Heiko

Das ist der Grund, allerdings hat ein Umstellen von String auf Ansistring nicht funktioniert. Ich habe stattdessen die Unicodefunktion mit dem Index 191 genommen.
So funktioniert es auch mit Delphi 2010
Delphi-Quellcode:
function MessageBoxCheck; external 'shlwapi.dll' index 191;
function MessageBoxCheck(hWnd: THandle; Text: PWideChar; Title: PWideChar; dwType: DWORD; Default: Integer;
  RegVal: PChar): Integer; stdcall;

mkinzler 14. Jul 2010 10:12

AW: "Don't ask again" Messagedialog ?
 
Zitat:

Ich habe stattdessen die Unicodefunktion mit dem Index 191 genommen.
So funktioniert es auch mit Delphi 2010
Das ist auch die bessere Variante.

himitsu 14. Jul 2010 10:31

AW: "Don't ask again" Messagedialog ?
 
noch eine selbstgebastelte Version:
Delphi-Quellcode:
uses Dialogs, StdCtrls, Math;

var MessageDlgExList: TStringList;

const mbAuto = TMsgDlgBtn(Ord(High(TMsgDlgBtn)) + 1);

function MessageDlgEx(const DlgID, Msg: String; DlgType: TMsgDlgType;
  Buttons: TMsgDlgButtons; DefaultButton: TMsgDlgBtn = mbAuto): Integer;
var
  Dialog: TForm;
  i, X, Y: Integer;
  C: TWinControl;
  Query: TCheckBox;
begin
  if (DlgID <> '') and (MessageDlgExList.IndexOfName(DlgID) >= 0) then begin
    Result := StrToInt(MessageDlgExList.Values[DlgID]);
    Exit;
  end;
  if DefaultButton = mbAuto then
    if     mbOk in Buttons then DefaultButton := mbOk
    else if mbYes in Buttons then DefaultButton := mbYes
    else                         DefaultButton := mbRetry;
  Dialog := CreateMessageDialog(Msg, DlgType, Buttons, DefaultButton);
  try
    if DlgID <> '' then begin
      X := 999;
      Y := 0;
      for i := Dialog.ComponentCount - 1 downto 0 do
        if Dialog.Components[i] is TWinControl then begin
          C := TWinControl(Dialog.Components[i]);
          if C.Visible then begin
            X := Min(C.Left, X);
            Y := Max(C.Top + C.Height, Y);
          end;
        end;
      Query := TCheckBox.Create(Dialog);
      Query.Parent := Dialog;
      Query.Left := X;
      Query.Top := Dialog.ClientHeight;
      Query.Width := 100;
      Query.Caption := 'merken';
      Dialog.ClientHeight := Dialog.ClientHeight + Query.Height + (Dialog.ClientHeight - Y);
    end;
    Result := Dialog.ShowModal;
    if Query.Checked and (Result <> MB_ABORTRETRYIGNORE) then
      MessageDlgExList.Add(DlgID + MessageDlgExList.NameValueSeparator + IntToStr(Result));
  finally
    Dialog.Free;
  end;
end;

initialization
  MessageDlgExList := TStringList.Create;
  MessageDlgExList.Sorted := True;

finalization
  MessageDlgExList.Free;

end.
Diese paßt sich zumindestens an das Aussehn der Delphi-Dialoge an.

MessageDlgExList kann man bei Programmstart laden
und beim Beenden speichern (oder sofort über MessageDlgExList.OnChange speichern)

Die DlgID muß für jeden Dialog vergeben werden.

Wurde der Dialog gespeichert/gemerkt, dann wird beim nächsen Aufruf das letzte Result zurückgegeben und nichts angezeigt.

Will man einen/alle Dialoge wieder anzeigen, dann einfach die MessageDlgExList bearbeiten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:32 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz