AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

"Don't ask again" Messagedialog ?

Ein Thema von ralfiii · begonnen am 6. Apr 2009 · letzter Beitrag vom 14. Jul 2010
Antwort Antwort
v2afrank

Registriert seit: 9. Mai 2005
Ort: Bocholt
575 Beiträge
 
Delphi XE2 Professional
 
#1

AW: "Don't ask again" Messagedialog ?

  Alt 14. Jul 2010, 09:38
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.

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.dllindex 191;
function MessageBoxCheck(hWnd: THandle; Text: PWideChar; Title: PWideChar; dwType: DWORD; Default: Integer;
  RegVal: PChar): Integer; stdcall;
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.878 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: "Don't ask again" Messagedialog ?

  Alt 14. Jul 2010, 10:12
Zitat:
Ich habe stattdessen die Unicodefunktion mit dem Index 191 genommen.
So funktioniert es auch mit Delphi 2010
Das ist auch die bessere Variante.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.394 Beiträge
 
Delphi 12 Athens
 
#3

AW: "Don't ask again" Messagedialog ?

  Alt 14. Jul 2010, 10:31
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.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.394 Beiträge
 
Delphi 12 Athens
 
#4

AW: "Don't ask again" Messagedialog ?

  Alt 14. Jul 2010, 10:36
@v2afrank: bei deinem RegVal solltest du noch aufpassen ... PChar ist ja dynamisch


Aber die API würde ich besser so implementieren, dann klappts hoffentlich überall
Delphi-Quellcode:
function MessageBoxCheck(hWnd: HWND; Text, Title: PChar; dwType: LongWord;
  Default: Integer; RegVal: PChar): Integer; stdcall;
function MessageBoxCheckA(hWnd: HWND; Text, Title: PAnsiChar; dwType: LongWord;
  Default: Integer; RegVal: PAnsiChar): Integer; stdcall;
function MessageBoxCheckW(hWnd: HWND; Text, Title: PWideChar; dwType: LongWord;
  Default: Integer; RegVal: PWideChar): Integer; stdcall;

function MessageBoxCheck; external 'shlwapi.dllindex {$IF SizeOf(Char) = 1}185{$ELSE}191{$IFEND};
function MessageBoxCheckA; external 'shlwapi.dllindex 185;
function MessageBoxCheckW; external 'shlwapi.dllindex 191;
PS: http://msdn.microsoft.com/en-us/library/bb773836.aspx
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (14. Jul 2010 um 11:23 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:15 Uhr.
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