![]() |
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ß |
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.
|
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:... |
Hallo design5,
getestet unter Delphi5:
Delphi-Quellcode:
mfg
//...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; eddy [edit=SirThornberry]Code-Tags durch Delphi-Tags ersetzt - Mfg, SirThornberry[/edit] |
Zitat:
|
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! |
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. |
Hallo Paul Jr.
vielen Dank für die Blumen .... Fette Darstellung funtioniert mit:
Delphi-Quellcode:
Ich wollte mit dieser Methode auch noch die Schriftfarbe ändern, aber das hat nicht geklappt.
....
// Beschriftung entsprechend Captions-array ändern dlgButton.Caption := Captions[CaptionIndex]; dlgButton.Font.Style := [fsBold]; // <-- Style ändern Inc(CaptionIndex); ... mfg eddy [edit=SirThornberry]Code-Tags durch Delphi-Tags ersetzt - Mfg, SirThornberry[/edit] |
Er meinte aber die Message ;-)
Ich denke mal, dass er da nach aMsgDlg.Components[i] is TButton suchen muss und entsprechend verfahren sollte. ...:cat:... |
Hallo sakura,
darf man denn nicht mal ein bischen Text sparen? Hier steht doch:
Delphi-Quellcode:
(aMsgDlg.Components[i] is TButton) im Quelltext drin.
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; 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 |
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:... |
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] |
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. |
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ß.
|
Tja... Luckie 8) , dass kriege sogar ich schon hin... :mrgreen: das Wichtigste habe ich schon auf einem goldenem Teller bekommen...
Gruß Paul Jr. |
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] |
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. |
Re: Caption der Buttons Yes/No im Dialog MessageDlg ändern
lustiges Ding dieser xMessageDlg. is der Code Free4Use?
lg elundril |
Re: Caption der Buttons Yes/No im Dialog MessageDlg ändern
Zitat:
Wenn Du dem Author einen Gefallen machen willst, dann verweist Du auf die Delphi-Praxis und auf den Benutzername. |
Re: Caption der Buttons Yes/No im Dialog MessageDlg ändern
Zitat:
lg elundril |
Re: Caption der Buttons Yes/No im Dialog MessageDlg ändern
Zitat:
Und natürlich in der ReadMe auch. |
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! ;-) |
Re: Caption der Buttons Yes/No im Dialog MessageDlg ändern
Zitat:
Bei dem betreffenden Beitrag gibt es neben "Zitat" einen Button mit so einer Glühbirne drin. Da drauf drücken... |
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. :( |
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 ![]() 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. |
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.
|
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:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:37 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