Delphi-PRAXiS

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 Eigenen MessageDlg verwenden (https://www.delphipraxis.net/73596-eigenen-messagedlg-verwenden.html)

DataCool 20. Jul 2006 11:34


Eigenen MessageDlg verwenden
 
Hi,

ich möchte gerne in eiuner Anwendung, einen eigenen MessageDlg verwenden.
Ich habe das ganze auch schon fast geschafft,
allerdings habe ich ein paar kleine Probleme die richtige Breite und Höhe
für die "Message" zu berechnen.

Die Message soll in einem Label dargestellt werden.
Das Label ist über Anchors so gesetzt das es sich in alle Richtungen
vergrößert. Ausserdem ist die Eigenschaft "WordWrap" auf "true" gesetzt.

Ich habe jetzt in folgendem Quellcode versucht über Textwidth und TextHeight die Daten zu berechnen.
Allerdings liefert das ganze bei längeren Texten das falsche Ergebnis.
Hat jemand eine Ahnung warum ? Bzw. Hat jemand eine bessere Idee ?

Delphi-Quellcode:
  // use Stringlist to detect line breaks
  strL := TStringList.Create;
  try
    strL.Text := MsgText;
    // init with 0
    iWidth := 0;
    // Checkout length of each line
    for i := 0 to strL.Count - 1 do begin
      iTmp := lab_Message.Canvas.TextWidth(strL[i]);
      if iTmp > iWidth then
        iWidth := iTmp;
    end;
    // check minimum width
    if iWidth < 235 then
      iWidth := 235;
    // set form with(label width + width for other controls)
    self.Width := iWidth + 50;

    // calculate height
    iTmp := (lab_Message.Canvas.TextHeight(msgText)+2) * strL.Count;
    // add height for other controls
    inc(iTmp,120);
    // set height
    self.Height := iTmp ;
  finally
    FreeAndNil(strL);
  end;
  // center ok button
  cmd_OK.Left := (self.Width div 2) - (cmd_ok.Width div 2);
  // set label caption
  lab_Message.Caption := msgText;
  show;
Danke und Gruß Data

Gollum 20. Jul 2006 11:50

Re: Eigenen MessageDlg verwenden
 
Hallo,

schau Dir einmal die API-Funktion DrawText an. Die sollte für Deinen Fall besser geeignet sein als die dürftigen Canvas-Funktionen.

DataCool 20. Jul 2006 12:14

Re: Eigenen MessageDlg verwenden
 
Hi,

schön und gut, damit weiss ich aber immer noch nicht die korrekten Masse des Rechtecks indem ich zeichen möchte/muss.

Gruß Data

Dax 20. Jul 2006 12:17

Re: Eigenen MessageDlg verwenden
 
Das kriegst du ganz einfach über TextExtent des Canvas.

Muetze1 20. Jul 2006 12:31

Re: Eigenen MessageDlg verwenden
 
Zitat:

Zitat von Dax
Das kriegst du ganz einfach über TextExtent des Canvas.

Nein, der beachtet nicht CR+LF, TABs, etc.

Zitat:

Zitat von DataCool
schön und gut, damit weiss ich aber immer noch nicht die korrekten Masse des Rechtecks indem ich zeichen möchte/muss.

1. Anschauen was in der MSDN zu dem WinAPI Befehl steht! Er wurde nicht umsonst genannt und stellt die Lösung dafür dar!
2. DrawText() kannst du einmal zur Ausgabe nutzen...
3. und zum anderen auch dazu, dir das benötigte Rechteck berechnen zu lassen. Das kann DrawText() auch (daher der Hinweis auf die Funktion). Schau dir dazu mal den Parameter DT_CALCRECT an.

DataCool 20. Jul 2006 12:32

Re: Eigenen MessageDlg verwenden
 
@Gollum and Muetze1:

Delphi-Quellcode:
  ARect.Left := lab_Message.Left;
  ARect.Top := lab_Message.Top;
  DrawText(self.Canvas.Handle,PChar(MsgText),-1,ARect,DT_CALCRECT);
  showmessage('Left: '+inttostr(ARect.Left)+#13#10+
              'Top: '+inttostr(ARect.Top)+#13#10+ 
              'Right: '+inttostr(ARect.Right)+#13#10+
              'Bottom: '+inttostr(ARect.Bottom));
  iDiff := (ARect.Right - ARect.Left) - lab_Message.Width;
  self.Width := self.Width + iDiff;
  iDiff := (ARect.Bottom - ARect.Top) - lab_Message.Height;
  self.Height := self.Height + iDiff;
  lab_Message.Caption := msgText;
Funktioniert leider auch nicht. Teste jetzt nochmal Dax Vorschlag,

Danke und Gruß Data

Peinhard 21. Jul 2006 10:56

Re: Eigenen MessageDlg verwenden
 
Warum 'spitzt' du nicht einmal ein bisschen in der Unit Dialogs? Ich habe mir da die entscheidenden Teile rauskopiert, um ua die Dialoge auf der Anwendung bzw dem aktiven Form und nicht auf dem Monitor zu zentrieren und um Default- und CancelBtn nach Gusto vorzubelegen. Man muß allerdings recht 'gefühlvoll' vorgehen, auf daß sich die neue Unit nicht mit der Dialogs 'beißt'.

Flocke 21. Jul 2006 11:43

Re: Eigenen MessageDlg verwenden
 
Zitat:

Zitat von DataCool
Die Message soll in einem Label dargestellt werden.
Das Label ist über Anchors so gesetzt das es sich in alle Richtungen
vergrößert. Ausserdem ist die Eigenschaft "WordWrap" auf "true" gesetzt.

Ich habe jetzt in folgendem Quellcode versucht über Textwidth und TextHeight die Daten zu berechnen.
Allerdings liefert das ganze bei längeren Texten das falsche Ergebnis.
Hat jemand eine Ahnung warum ? Bzw. Hat jemand eine bessere Idee ?

Mache es doch genau anders herum: Lass die Anchors weg und setze beim Label "AutoSize" auf TRUE. Wenn du dann den Text reinsetzt, musst du nur noch die Gesamtgröße des Fensters an die des Labels anpassen.

DataCool 21. Jul 2006 12:52

Re: Eigenen MessageDlg verwenden
 
Hi,

Flocke genauso hab ich es jetzt gemacht und meine Tests waren bis jetzt erfolgreich.

Gruß und Danke an alle,

Data


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:44 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