Delphi-PRAXiS
Seite 1 von 2  1 2      

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/)
-   -   Button mehrzeilig (TFlatButton) (https://www.delphipraxis.net/122172-button-mehrzeilig-tflatbutton.html)

delphinia 10. Okt 2008 18:51


Button mehrzeilig (TFlatButton)
 
ACHTUNG -> ich rede nun von den FlatComponente -> TFlatButton

Ok - wie bekomme ich diese Mehrzeilig?

Schreibe ich in der Form.Create
SetWindowLong(mp3_button.Handle, GWL_STYLE, GetWindowLong(mp3_buttonHandle, GWL_STYLE) or BS_MULTILINE);

Und der Text ist 'blablabla#13#10sdf sfsdf sdf' so erhalte ich fette Rechtecke....

Ich habe schon gedacht ok gehe ich die Componente und ändere den DrawText so ab, das es gleich so ist.
Aber dann erahlte ich auf dem Button NUR den Teil VOR dem #13#10 der rest ist wech...



hat jemand eine Hilfe für mich

[edit=SirThornberry]Titel ergänzt - Mfg, SirThornberry[/edit]

DeddyH 10. Okt 2008 18:54

Re: Button mehrzeilig
 
Wie sieht der Aufruf von DrawText denn aus?

delphinia 10. Okt 2008 18:57

Re: Button mehrzeilig
 
Delphi-Quellcode:
    // DrawText
    memoryBitmap.Canvas.Brush.Style := bsClear;
    if FState = bsDisabled then
    begin
      OffsetRect(TextBounds, 1, 1);
      memoryBitmap.Canvas.Font.Color := clBtnHighlight;
      DrawText(memoryBitmap.Canvas.Handle, PChar(Caption), Length(Caption), TextBounds,DT_CENTER or DT_VCENTER );
      OffsetRect(TextBounds, -1, -1);
      memoryBitmap.Canvas.Font.Color := clBtnShadow;
      DrawText(memoryBitmap.Canvas.Handle, PChar(Caption), Length(Caption), TextBounds, DT_CENTER or DT_VCENTER );
    end
    else
      DrawText(memoryBitmap.Canvas.Handle, PChar(Caption), Length(Caption), TextBounds, DT_CENTER or DT_VCENTER );

    // Copy memoryBitmap to screen
    canvas.CopyRect(ClientRect, memoryBitmap.canvas, ClientRect);
habe schon DT_WORDBREAK dazu gesteckt aber genau dann verschluckt er alles nach #13#10

DeddyH 10. Okt 2008 19:00

Re: Button mehrzeilig
 
Lass mal das DT_VCENTER weg.

delphinia 10. Okt 2008 19:03

Re: Button mehrzeilig
 
dann ist der Text zwar nicht mehr mittiag dann links aber wird immer noch alles nach dem #13#10 wechgelassen


habe auch schon
Delphi-Quellcode:
DrawText(memoryBitmap.Canvas.Handle, PChar(Caption), Length(Caption), TextBounds, DT_WORDBREAK );
versucht nüschts

DeddyH 10. Okt 2008 19:07

Re: Button mehrzeilig (TFlatButton)
 
Komisch. Ich habe gerade mal Folgendes ausprobiert:
Delphi-Quellcode:
procedure TForm1.FormPaint(Sender: TObject);
const sText = 'Erste Zeile'#13#10'Zweite Zeile';
var R: TRect;
begin
  R := Rect(0,
            ClientHeight shr 1 - Canvas.TextHeight(sText),
            Width,
            ClientHeight shr 1 + Canvas.TextHeight(sText));
  DrawText(Canvas.Handle,PChar(sText),-1,R,DT_CENTER);
end;
Geht einwandfrei. Evtl. ist Dein Rect einfach zu klein?

delphinia 10. Okt 2008 19:17

Re: Button mehrzeilig (TFlatButton)
 
Du keine Ahnung, ist nicht meine Komponente :-) ich nutzte die nur gerne wird schon seit jahren nicht mehr entwickelt (FlaStyle Komponenten) ... woltle halt nur das der Button MultiLine wird aber scheint wohl nicht so leicht zu sein. und ob Rect zu klein?! keine ahnung - wie mache ich den grösse?!

jaenicke 10. Okt 2008 21:09

Re: Button mehrzeilig (TFlatButton)
 
Ich habe es mir mal kurz angeschaut ;-). Dass es nicht geht liegt daran, dass vorher die Textgröße berechnet wird, auch vertikal. Deshalb nutzt es nichts, wenn du später dann sagst, dass mehrere Zeilen gezeichnet werden sollen, wenn der berechnete Zeichenbereich nur für die erste Zeile reicht.

Du musst in der Datei FlatUtilitys.pas Zeile 259 / 260 durch folgenden Code ersetzen:
Delphi-Quellcode:
      TextBounds := Rect(0, 0, Client.Right - Client.Left, Client.Bottom - Client.Top); // auch die maximale Höhe angeben
      DrawText(Canvas.Handle, PChar(Caption), Length(Caption), TextBounds, DT_CALCRECT or DT_WORDBREAK); // DT_WORDBREAK hinzu
und außerdem natürlich wie du es auch schon gemacht hast ab Zeile 346 in TFlatButtonUnit.pas DT_SINGLELINE entfernen
Delphi-Quellcode:
    // DrawText
    memoryBitmap.Canvas.Brush.Style := bsClear;
    if FState = bsDisabled then
    begin
      OffsetRect(TextBounds, 1, 1);
      memoryBitmap.Canvas.Font.Color := clBtnHighlight;
      DrawText(memoryBitmap.Canvas.Handle, PChar(Caption), Length(Caption), TextBounds, DT_CENTER or DT_VCENTER);
      OffsetRect(TextBounds, -1, -1);
      memoryBitmap.Canvas.Font.Color := clBtnShadow;
      DrawText(memoryBitmap.Canvas.Handle, PChar(Caption), Length(Caption), TextBounds, DT_CENTER or DT_VCENTER);
    end
    else
      DrawText(memoryBitmap.Canvas.Handle, PChar(Caption), Length(Caption), TextBounds, DT_CENTER or DT_VCENTER);
So funktioniert es bei mir.

delphinia 10. Okt 2008 21:19

Re: Button mehrzeilig (TFlatButton)
 
ui also da wäre ich nie drauf gekommen, dass dies auch noch in weiteren Files versteckt ist!

Aber es geht super DANKE!!!! :dancer2: :dancer2: :dancer2: :dancer2:

jaenicke 10. Okt 2008 21:24

Re: Button mehrzeilig (TFlatButton)
 
Hast du eigentlich auch die neuen Compiler in der dfs.inc ergänzt? Nur dann hast du nämlich die neuen Eigenschaften wie Anchors, die erst ab D4 verfügbar sind ;-).

// EDIT:
Ich sehe schon, dich betrifft das mit D5 noch nicht, das ist ja schon bekannt. ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:51 Uhr.
Seite 1 von 2  1 2      

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