Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Caption der Buttons Yes/No im Dialog MessageDlg ändern (https://www.delphipraxis.net/3307-caption-der-buttons-yes-no-im-dialog-messagedlg-aendern.html)

design5 6. Mär 2003 07:58


Caption der Buttons Yes/No im Dialog MessageDlg ändern
 
Hallo,

mal wieder eine dumme Frage...

Ich habe eine kleine Anwendung geschrieben die mir ein Ergebnis zurückliefert. Da das sehr umfangreich ist, möchte ich den User auffordern, ob er das gesamte oder nur ein Teil-Ergebnis angezeigt haben möchte...

Dazu würde ich gerne den MessageDlg verwenden. Der liefert mir die Buttons Ja, Nein, Abbrechen.

Nun meine Frage: Kann ich die Beschriftung der Buttons (Caption) ändern? [Alles],[Teil],[Abbrechen]

Da der Dialog bzw. die aufgerufene Form nicht von mir selbst geschrieben ist, kann ich nicht darauf zugreifen... was man so denke ich auch nicht machen sollte (da es sich ja um etwas 'programminternes' von Delphi handelt).

Gibt es da irgendwelche Übergabeparameter, mit der man doch die Caption zuweist?

Gruß

Motzi 6. Mär 2003 08:39

MessageDlg ist eine reine VCL-Funktion, dh es wird intern eine Instanz einer TForm mit ein paar Buttons erzeugt.. die Buttons erhalten nur Beschriftungen, die in der Unit Const.pas gespeichert sind (ich glaub zumindest dass es die Unit war..). Du könntest jetzt entweder die Unit Const.pas übersetzen, oder aber einfach eine API-Funktion verwenden. Zweiteres hätte den Vorteil, dass die Beschriftung deiner Message-Box automatisch in der für Windows gewählten Sprache ist.

sakura 6. Mär 2003 08:52

Hi Motzi,

Du hast nicht ganz aufgepasst ;) Es ging ihm um bestimmte Texte, welche jedoch wenig mit den Originalen gemein haben (Alles, Teil, Abbrechen). Er nutzt bereits eine deutsche Delphi-Version.

An dieser Stelle ist die einzig vernünftige Lösung einen eigenen Dialog zu erstellen. Änderungen in der consts.pas wirken sich auf alle Messageboxen in allen Programmen aus ;)

...:cat:...

eddy 6. Mär 2003 09:07

Hallo design5,

getestet unter Delphi5:

Delphi-Quellcode:
//...bei einem Message Dialog die Beschriftungen der Buttons ändern
function xMessageDlg(const Msg: string; DlgType : TMsgDlgType;
                     Buttons : TMsgDlgButtons; Captions: array of string) : Integer;
var
  aMsgDlg : TForm;
  CaptionIndex,
  i : integer;
  dlgButton : TButton; // uses stdctrls
begin
  // Dlg erzeugen
  aMsgDlg := CreateMessageDialog(Msg, DlgType, buttons);
  CaptionIndex := 0;
  // alle Objekte des Dialoges testen
  for i := 0 to aMsgDlg.ComponentCount - 1 do begin
    // wenn es ein Button ist, dann...
    if (aMsgDlg.Components[i] is TButton) then begin
      dlgButton := TButton(aMsgDlg.Components[i]);
      if CaptionIndex > High(Captions) then Break;
      // Beschriftung entsprechend Captions-array ändern
      dlgButton.Caption := Captions[CaptionIndex];
      Inc(CaptionIndex);
    end;
  end;
  Result := aMsgDlg.ShowModal;
end;

procedure TForm1.SpeedButton2Click(Sender: TObject);
var
  erg : integer;
begin
  erg := xMessageDlg('Hier steht der gewünschte Text,' + chr($0D) + 'die Buttons sind geändert',
                      mtConfirmation,
                      [mbYes, mbNo, mbCancel],       // benutzte Schaltflächen
                      ['Alles', 'Teil','Abbrechen']); // zugehörige Texte
  case erg of                                        // zugehörige Antworten
    mrYes  : ShowMessage('"1" clicked');
    mrNo   : ShowMessage('"2" clicked');
    mrCancel: ShowMessage('"3" clicked');
  end; // of case
end;
mfg
eddy

[edit=SirThornberry]Code-Tags durch Delphi-Tags ersetzt - Mfg, SirThornberry[/edit]

Motzi 6. Mär 2003 09:15

Zitat:

Zitat von sakura
Hi Motzi,

Du hast nicht ganz aufgepasst ;) Es ging ihm um bestimmte Texte, welche jedoch wenig mit den Originalen gemein haben (Alles, Teil, Abbrechen). Er nutzt bereits eine deutsche Delphi-Version.

An dieser Stelle ist die einzig vernünftige Lösung einen eigenen Dialog zu erstellen. Änderungen in der consts.pas wirken sich auf alle Messageboxen in allen Programmen aus ;)

...:cat:...

Oops.. stimmt! Das kommt davon wenn man das ganze nur schnell überfliegt.. *schäm* :oops:

design5 6. Mär 2003 11:37

Danke erst mal für Eure zahlreichen Antworten!

Den eigenen Dialog habe ich in der Zwischenzeit geschrieben und mit eigenen Buttons versehen. Dieser erfüllt schonmal den Zweck.

Die andere Methode werde ich auch noch ausprobieren (toll, was Du für eine Mühe investierst!). Sie hört sich auf jeden Fall interessant an!

Gast 11. Mär 2003 14:37

Hallo Eddy 8)

das ist sehr gut was Du gemacht hast...


Weiß vielleicht auch jemand wie kann ich in diesem Konstrukt die Message z.B. Fett darstellen? - also NUR den Text!

Gruß

Paul Jr.

eddy 11. Mär 2003 14:57

Hallo Paul Jr.

vielen Dank für die Blumen ....


Fette Darstellung funtioniert mit:
Delphi-Quellcode:
  ....
      // Beschriftung entsprechend Captions-array ändern
      dlgButton.Caption := Captions[CaptionIndex];

      dlgButton.Font.Style := [fsBold]; // <-- Style ändern

      Inc(CaptionIndex);
  ...
Ich wollte mit dieser Methode auch noch die Schriftfarbe ändern, aber das hat nicht geklappt.

mfg
eddy

[edit=SirThornberry]Code-Tags durch Delphi-Tags ersetzt - Mfg, SirThornberry[/edit]

sakura 11. Mär 2003 15:03

Er meinte aber die Message ;-)

Ich denke mal, dass er da nach aMsgDlg.Components[i] is TButton suchen muss und entsprechend verfahren sollte.

...:cat:...

eddy 11. Mär 2003 15:30

Hallo sakura,

darf man denn nicht mal ein bischen Text sparen?

Hier steht doch:
Delphi-Quellcode:
begin
  // Dlg erzeugen
  aMsgDlg := CreateMessageDialog(Msg, DlgType, buttons);
  CaptionIndex := 0;
  // alle Objekte des Dialoges testen
  for i := 0 to aMsgDlg.ComponentCount - 1 do begin
    // wenn es ein Button ist, dann...
    if (aMsgDlg.Components[i] is TButton) then begin
      dlgButton := TButton(aMsgDlg.Components[i]);
      if CaptionIndex > High(Captions) then Break;
      // Beschriftung entsprechend Captions-array ändern
      dlgButton.Caption := Captions[CaptionIndex];
      dlgButton.Font.Style := [fsBold];
      Inc(CaptionIndex);
    end;
  end;
  Result := aMsgDlg.ShowModal;
end;
(aMsgDlg.Components[i] is TButton) im Quelltext drin.

Oder welche Bedeutung hat Dein Einwurf?

Wäre vielleicht noch interessant zu wissen, wie man die Farbe und den Style der eigentlichen Msg : string ändern kann. Eine Lösung dafür würde das ganze komplettieren.

mfg
eddy

sakura 11. Mär 2003 15:36

Hallo, das war ein Copy&Paste Fehler :oops: Es geht um die Message, von daher sollte es wohl (aMsgDlg.Components[i] is TLabel) sein.

Sorry,
...:cat:...

eddy 11. Mär 2003 16:49

Hallo sakura,
Hallo Paul Jr.,

habe noch ein wenig herumgebastet, jetzt kann man auch noch die Farbe und die Schriftart der Msg ändern:

Delphi-Quellcode:
//...bei einem Message Dialog die Beschriftungen der Buttons ändern
function xMessageDlg(const Msg: string; DlgType : TMsgDlgType;
                     Buttons : TMsgDlgButtons; Captions: array of string) : Integer;
var
  aMsgDlg : TForm;
  CaptionIndex,
  i : integer;
  dlgButton : TButton; // uses stdctrls
begin
  // Dlg erzeugen
  aMsgDlg := CreateMessageDialog(Msg, DlgType, buttons);
  CaptionIndex := 0;
  // alle Objekte des Dialoges testen
  for i := 0 to aMsgDlg.ComponentCount - 1 do begin
    // Schrift-Art Message ändern
    if (aMsgDlg.Components[i] is TLabel) then begin
      TLabel(aMsgDlg.Components[i]).Font.Style := [fsBold];
      TLabel(aMsgDlg.Components[i]).Font.Color := clRed;
    end;
    // wenn es ein Button ist, dann...
    if (aMsgDlg.Components[i] is TButton) then begin
      dlgButton := TButton(aMsgDlg.Components[i]);
      if CaptionIndex > High(Captions) then Break;
      // Beschriftung entsprechend Captions-array ändern
      dlgButton.Caption := Captions[CaptionIndex];
      dlgButton.Font.Style := [fsBold];
      Inc(CaptionIndex);
    end;
  end;
  Result := aMsgDlg.ShowModal;
end;

mfg
eddy

[edit=SirThornberry]Code-Tags durch Delphi-Tags ersetzt - Mfg, SirThornberry[/edit]

Gast 12. Mär 2003 09:49

Hallo Eddy :D

Toll wie Du es gemacht hast... :coder: !!!

Leider war ich gestern nicht mehr im Forum... aber wie ich sehe hat Sakura die geistliche Führung übernommen :angle: ... dafür auch dank an Dich Sakura... 8)

Gruß an Euch beiden...

Paul Jr.

Luckie 12. Mär 2003 10:11

Jetzt müßt ihr den Funktionskopf nur noch so umbauen, dass man auch alle Parameter mit übergeben kann und nicht immer im Code rumwurschteln muß.

Gast 12. Mär 2003 10:47

Tja... Luckie 8) , dass kriege sogar ich schon hin... :mrgreen: das Wichtigste habe ich schon auf einem goldenem Teller bekommen...

Gruß

Paul Jr.

eddy 12. Mär 2003 13:37

Hallo Paul Jr.,

weil mit Style=fsBold der Text nicht mehr in den Button gepaßt hat, habe ich noch ein bischen weiter gemacht. Die Parameterübergabe ist noch die erste, es sollte aber kein Problem sein, diese anzupassen.

Mit der Ermittlung der längsten String aus Captions und unter Berücksichtigung von Style habe ich die Länge der Buttons geändert.
Und weil lange Button nicht mehr nebeneinander passen, habe ich auch noch untereinander probiert.

Verbesserungen sind ausdrücklich erwünscht!

Vielleicht kriegen wir ja eine Neufassung mit vernünftiger Parameterübergabe von Paul Jr.


Delphi-Quellcode:
{ hier steckt jetzt noch eine ganze Menge drin, das über die ursprüngliche Fassung
  hinausgeht, z.B. nebeneinander --> Funktion dient als Grundlage für die
  Realisierung einer sinnvollen Komponente
}
//...bei einem Message Dialog die Beschriftungen der Buttons ändern
function xMessageDlg(const Msg: string; DlgType : TMsgDlgType;
                     Buttons : TMsgDlgButtons; Captions: array of string) : Integer;
const
  nebeneinander = false;
var
  aMsgDlg : TForm;
  aLbl : TLabel;
  CaptionIndex,
  CapLen,              // Länge der Zeichenkette
  j, i : integer;
  dlgButton : TButton; // uses stdctrls
begin
  // Dlg erzeugen
  aMsgDlg := CreateMessageDialog(Msg, DlgType, buttons);
  aLbl := TLabel.Create(aMsgDlg);
  aLbl.AutoSize := true;
  aLbl.Font.Style := [fsBold]; // damit die ermittelte Länge paßt

  // Längsten Eintrag ermitteln für Berechnung TButton.Width
  CapLen := 0;
  for i := 0 to High(Captions) do begin
    aLbl.Caption := Captions[i];
    if aLbl.Width > CapLen then CapLen := aLbl.Width;
  end;
  aLbl.Free; // wird nicht mehr benötigt

  CaptionIndex := 0;
  // alle Objekte des Dialoges testen
  for i := 0 to aMsgDlg.ComponentCount - 1 do begin
    // Schrift-Art Message ändern
    if (aMsgDlg.Components[i] is TLabel) then begin
      TLabel(aMsgDlg.Components[i]).Font.Style := [fsBold];
      TLabel(aMsgDlg.Components[i]).Font.Color := clRed;
    end;
    // wenn es ein Button ist, dann...
    if (aMsgDlg.Components[i] is TButton) then begin
      dlgButton := TButton(aMsgDlg.Components[i]);
      if CaptionIndex > High(Captions) then Break;
      // Beschriftung entsprechend Captions-array ändern
      dlgButton.Caption := Captions[CaptionIndex];
      dlgButton.Font.Style := [fsBold];
      dlgButton.Width := CapLen + 2 * 12;
      // li. Rand = 32, Zwischenraum = 16
      // Button nebeneinander
      if nebeneinander then begin
        dlgButton.Left := 32 + (dlgButton.Width + 16)*CaptionIndex;
      end
      // Button untereinander
      else begin
        dlgButton.Left := 32;
        if CaptionIndex = 0
          then j := dlgButton.Top
          else dlgButton.Top := j + (dlgButton.Height + 8)*CaptionIndex;
      end;
      Inc(CaptionIndex);
    end;
  end;
  // s.o.; rechter Rand = 32
  if nebeneinander then begin
    aMsgDlg.Width := 32 + (dlgButton.Width + 16)*CaptionIndex + 16;
  end
  // Button untereinander
  else begin
    if aMsgDlg.Width < 2 * 32 + dlgButton.Width
      then aMsgDlg.Width := 2 * 32 + dlgButton.Width;
    aMsgDlg.Height := j + (dlgButton.Height + 8)*CaptionIndex + 32;

    // mittige Anordnung der Buttons
    CaptionIndex := 0;
    for i := 0 to aMsgDlg.ComponentCount - 1 do begin
      if (aMsgDlg.Components[i] is TButton) then begin
        dlgButton := TButton(aMsgDlg.Components[i]);
        if CaptionIndex > High(Captions) then Break;
        dlgButton.Left := (aMsgDlg.Width - dlgButton.Width) div 2;
        Inc(CaptionIndex);
      end;
    end;
  end;

  // nachdem Dialog-Width ermittelt ist, kann Msg.Width ermittelt werden
  // keine Überprüfung auf Übergröße vorgenommen
  for i := 0 to aMsgDlg.ComponentCount - 1 do begin
    if (aMsgDlg.Components[i] is TLabel) then begin
      TLabel(aMsgDlg.Components[i]).Width := aMsgDlg.Width -
                                     TLabel(aMsgDlg.Components[i]).Left - 32;
      TLabel(aMsgDlg.Components[i]).Caption := Msg;
    end;
  end;

  Result := aMsgDlg.ShowModal;
end;

mfg
eddy

[edit=Admin]Delphi-Tags für den automatischen Highlighter eingefügt. Mfg. Daniel[/edit]
[edit=SirThornberry]Edit zwecks fehlendem Highlighting - Mfg, SirThornberry[/edit]

Gast 12. Mär 2003 14:09

Hallo Eddy 8) ,

hervorragend... :idea: !!!

Das werde ich jetzt als feste Bestandteil meiner so umfangreicher Schatztruhe machen... Du muss wissen, das dieses Problem schon mal in Forum behandelt wurde (jetzt weiß ich nicht mehr ob hier oder irgendwo anders...) und keiner wusste die Lösung...

Weiter so und viel Erfolg :D

Danke

Paul Jr.

elundril 28. Jan 2008 16:50

Re: Caption der Buttons Yes/No im Dialog MessageDlg ändern
 
lustiges Ding dieser xMessageDlg. is der Code Free4Use?

lg elundril

RavenIV 29. Jan 2008 08:08

Re: Caption der Buttons Yes/No im Dialog MessageDlg ändern
 
Zitat:

Zitat von elundril
lustiges Ding dieser xMessageDlg. is der Code Free4Use?

Sonst wäre der Code wohl nicht hier gepostet worden.

Wenn Du dem Author einen Gefallen machen willst, dann verweist Du auf die Delphi-Praxis und auf den Benutzername.

elundril 29. Jan 2008 15:10

Re: Caption der Buttons Yes/No im Dialog MessageDlg ändern
 
Zitat:

Zitat von RavenIV
Wenn Du dem Author einen Gefallen machen willst, dann verweist Du auf die Delphi-Praxis und auf den Benutzername.

genau das wollt ich wissen, ob ich den Namen dazuschreiben MUSS an einer bestimmten Stelle. Im ReadMe werd ich sowieso den dann erwähnen.

lg elundril

RavenIV 29. Jan 2008 15:21

Re: Caption der Buttons Yes/No im Dialog MessageDlg ändern
 
Zitat:

Zitat von elundril
genau das wollt ich wissen, ob ich den Namen dazuschreiben MUSS an einer bestimmten Stelle. Im ReadMe werd ich sowieso den dann erwähnen.

Ich würde den Hinweis in den Funktionsheader reinschreiben.
Und natürlich in der ReadMe auch.

elundril 29. Jan 2008 15:25

Re: Caption der Buttons Yes/No im Dialog MessageDlg ändern
 
ok, passt, danke!

lg elundril

ps: Das wär doch was für die Code Libary? Würd sich nämlich auszahlen find ich! ;-)

RavenIV 29. Jan 2008 15:29

Re: Caption der Buttons Yes/No im Dialog MessageDlg ändern
 
Zitat:

Zitat von elundril
ps: Das wär doch was für die Code Libary? Würd sich nämlich auszahlen find ich! ;-)

Dann schlag es doch vor.
Bei dem betreffenden Beitrag gibt es neben "Zitat" einen Button mit so einer Glühbirne drin.
Da drauf drücken...

juniorA 11. Nov 2015 17:18

AW: Caption der Buttons Yes/No im Dialog MessageDlg ändern
 
Soweit so gut aber gibt es auch eine Chance, dass ich eine der 3 Tasten bereit vorauswählen kann?
Bei mir ist immer die letzte Taste ausgewählt.
:(

Perlsau 11. Nov 2015 17:23

AW: Caption der Buttons Yes/No im Dialog MessageDlg ändern
 
Erstens: uralter Beitrag, bei Fragen solltest du einen neuen Thread aufmachen und deine Frage stellen, wenn sie nicht bereits durch die Suchfunktion beantwortet wurde.

Zweitens: Deine Frage beantwortet die Online-Hilfe unzweifelhaft:
Der Parameter Buttons legt fest, welche Art von Schaltflächen für das Meldungsfenster verwendet werden soll. Die Schaltflächen werden der Reihe nach angezeigt.

zeras 11. Nov 2015 17:44

AW: Caption der Buttons Yes/No im Dialog MessageDlg ändern
 
und der Parameter DefaultBtn zeigt dann den Button an, der ausgewählt ist. Das steht ja auch so in der Doku, die Perlaus verlinkt hat.

Perlsau 11. Nov 2015 18:08

AW: Caption der Buttons Yes/No im Dialog MessageDlg ändern
 
PerLaus ist auch nicht schlecht, merk mich mir für mein nächstes Leben :wink:
... die Perlaus, die Perlen vor die Säue wirft ...

Zitat:

Zitat von zeras (Beitrag 1321187)
und der Parameter DefaultBtn zeigt dann den Button an, der ausgewählt ist. Das steht ja auch so in der Doku, die Perlaus verlinkt hat.

Ach ja, stimmt, hätte ich ja auch noch zitieren können. Aber wozu alles zitieren, wenn's doch sowieso bereits im Internet steht? Ach ja, ich weiß wieder: weil das manchmal zuviel verlangt ist, die Online-Hilfe zu verwenden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:18 Uhr.

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