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/)
-   -   Hint mit Tabulator formatieren (https://www.delphipraxis.net/152175-hint-mit-tabulator-formatieren.html)

bernau 14. Jun 2010 12:14

Hint mit Tabulator formatieren
 
Gibt's ne Möglichkeit einen Hint formatiert anzuzeigen. Sprich ich möchte zwei Spalten darstellen. Produktname und Preis.

Folgendes wird beim mir nicht sehr schön angezeigt:

Delphi-Quellcode:
Label1.hint:=
  'Langer Name'+#9+'123.23'+#13+#10+
  'Name'+#9+'213.23';
Gibt's ne Möglichkeit, wie bei der Listbox eine Tabulatorposition zu setzen?

hathor 14. Jun 2010 12:19

AW: Hint mit Tabulator formatieren
 
Die TAB-Taste hat den Scancode 15.

Delphi-Quellcode:
TAB8:='       ';
bExit.hint:='Das'+#15+'ist'+#15+'das'+#15+'Ende!';
Exit.hint:='Das'+TAB8+'ist'+TAB8+'das'+TAB8+'Ende!';//so geht's
Stelle soeben fest, dass #15 als Quadrat ersetzt wird...
Ersetze #15 einfach durch eine Stringkonstante oder Variable, z.B.

TAB8:=' ';
Das wird hier im Forum falsch dargestellt, weil Leerzeichen gelöscht werden...
Ein Font mit konstanter Zeichenbreite wäre sehr sinnvoll!

idefix2 14. Jun 2010 12:51

AW: Hint mit Tabulator formatieren
 
Wie kommst Du auf 15? Tab war immer und ist nach wie vor #9 in allen Zeichensätzen, die ich kenne (ich habe aber selbst nicht ausprobiert, ob tabs in einem Hint fnktionieren).

Zitat:

Ein Font mit konstanter Zeichenbreite wäre sehr sinnvoll!
Genau das will man aber meistens nicht, weil diese Fonts nicht attraktiv aussehen. Mit fixed pitch Fonts die Spalten untereinander anzeigen ist trivial, aber darum geht es hier eben nicht.

bernau 14. Jun 2010 14:07

AW: Hint mit Tabulator formatieren
 
Zitat:

Zitat von idefix2 (Beitrag 1028726)
Genau das will man aber meistens nicht, weil diese Fonts nicht attraktiv aussehen. Mit fixed pitch Fonts die Spalten untereinander anzeigen ist trivial, aber darum geht es hier eben nicht.

So ist es....

ralfschwalbe 14. Jun 2010 14:08

AW: Hint mit Tabulator formatieren
 
Hi,

da wirst Du Dein eigenes THintWindow bauen müssen...

Wichtig ist dann in der überschriebenen Paint-Procedure den Text mit DrawText ausgeben und dort das Flag DT_EXPANDTABS zu setzen.

bernau 14. Jun 2010 14:10

AW: Hint mit Tabulator formatieren
 
Zitat:

Zitat von ralfschwalbe (Beitrag 1028742)
da wirst Du Dein eigenes THintWindow bauen müssen...

Das denke auch....

David Martens 14. Jun 2010 15:44

AW: Hint mit Tabulator formatieren
 
Du kannst dir ja die Breite der einzelnen Texte berechnen und dann zu einer gestimmten Breite auffüllen.

Hier wie ich die Breite der DropdownListe für ComboBoxen ermittle:
Delphi-Quellcode:
procedure OnComboBoxDropdown(Sender: TObject);
var
  WMF      : TMetafile;      // virtuelle WMF bzw. EMF Datei (enthält das Image)
  WMFCanvas : TMetafileCanvas; // virtuelle Oberfläche des Metafiles
  i, Width : integer;
begin
  WMF      := TMetafile.Create;
  WMFCanvas := TMetafileCanvas.Create( WMF, 0);

  WMFCanvas.Brush.Style := bsClear;
  WMFCanvas.Font := TComboBox(Sender).Font;

  Width := TComboBox(Sender).Width;

  for i := 0 to TComboBox(Sender).Items.Count - 1 do
  begin
    Width := max(Width ,WMFCanvas.TextWidth(TComboBox(Sender).Items[i]) + 25);
  end;

  TComboBox(Sender).Perform(CB_SETDROPPEDWIDTH, Width, 0);

  WMFCanvas.Free;
  WMF.Free;
end;
Im Grunde reicht dir WMFCanvas.TextWidth(String) mit den richtigen Fonteinstellungen für die einzelnen Texte und das muß dann nur mit Leerzeichen sinnvoll aufgefüllt werden.

idefix2 14. Jun 2010 18:13

AW: Hint mit Tabulator formatieren
 
Ich fürchte, mit Leerzeichen bekommt man bei Zeichensätzen mit variabler Buchstabenbreite nichts ordentlich untereinander

David Martens 14. Jun 2010 18:39

AW: Hint mit Tabulator formatieren
 
Ich hab mal ein wenig gestöbert und das hier gefunden: Creating custom hints for yoru application/component

Ein bisschen Modifikation bei:
Delphi-Quellcode:
sHeight := HintWindow.Canvas.TextHeight(s) * sList.Count;
HintWindow.ActivateHint(
  Rect(P.X,P.Y, P.x + sWidth + 6, P.Y + sHeight),s);
sollte eigentlich reichen.

BerndS 15. Jun 2010 07:37

AW: Hint mit Tabulator formatieren
 
Hallo Bernau, ich habe bei mir ein einfaches TTabHintWindow drin. Sieht dann so aus:
Delphi-Quellcode:
  TTabHintWindow=class(THintWindow) // Stellt auch Tabs mit dar
  public
    function CalcHintRect(MaxWidth: Integer; const AHint: string;AData: Pointer): TRect; override;
    procedure Paint; override;
  end;
Delphi-Quellcode:
function TTabHintWindow.CalcHintRect(MaxWidth: Integer;
  const AHint: string; AData: Pointer): TRect;
begin
  Result := Rect(0, 0, MaxWidth, 0);
  DrawText(Canvas.Handle, PChar(AHint), -1, Result, DT_CALCRECT or DT_LEFT or DT_EXPANDTABS or
    DT_WORDBREAK or DT_NOPREFIX or DrawTextBiDiModeFlagsReadingOnly);
  Inc(Result.Right, 6);
  Inc(Result.Bottom, 2);
end;

procedure TTabHintWindow.Paint;
var
  R: TRect;
begin
  R := ClientRect;
  Inc(R.Left, 2);
  Inc(R.Top, 2);
  Canvas.Font.Color := clInfoText;
  DrawText(Canvas.Handle, PChar(Caption), -1, R, DT_LEFT or DT_NOPREFIX or DT_EXPANDTABS or
    DT_WORDBREAK or DrawTextBiDiModeFlagsReadingOnly);
end;
Delphi-Quellcode:
initialization
  HintWindowClass:=TTabHintWindow;// Tabulatoren werden unterstützt
end.
Ist schon recht alt, daher kann ich nicht sagen, wo das her ist.
Gruß Bernd

bernau 15. Jun 2010 10:43

AW: Hint mit Tabulator formatieren
 
Zitat:

Zitat von BerndS (Beitrag 1028905)
Hallo Bernau, ich habe bei mir ein einfaches TTabHintWindow drin.

Perfekt. Das war's. Danke!

bernau 15. Jun 2010 11:20

AW: Hint mit Tabulator formatieren
 
Habe doch noch ein Problem. Wenn ich folgendes anzeigen will, sind die Texte nach dem Tabstop nicht mehr untereinander

Delphi-Quellcode:
TextZumAnzeigen :=
  'Spalte1'+#9+'Spalte2'+#13+#10+
  'ein gaaaaaaaaaaaaaanz langer Text'+#9+'Spalte2';
Gibt es so was wie LB_SETTABSTOPS für Listboxen?

idefix2 15. Jun 2010 13:03

AW: Hint mit Tabulator formatieren
 
Soviel ich weiss, nein. Einziger Workaround: Die tatsächliche Länge des Texts feststellen und entsprechend mehr oder weniger Tabs nachsenden - allerdings müsste man dazu den Abstand zwische zwei Tabs abfragen können, und da weiss ich auch nicht, wie das geht. Probieren wird nicht helfen, weil das auf verschiedenen Rechnern mit verschiedenen Fonts unterschiedlich aussehen kann. Also vielleicht doch alles zu Fuss machen?

uligerhardt 30. Mär 2011 18:38

AW: Hint mit Tabulator formatieren
 
(Ich weiß, das Thema ist alt. Aber ich bin grad über die Lösung und diesen Thread gestolpert. Da kann ich nicht widerstehen. :mrgreen:)

Zitat:

Zitat von bernau (Beitrag 1028955)
Gibt es so was wie LB_SETTABSTOPS für Listboxen?

Ja - DT_TABSTOP. Aber dann besser DrawTextEx verwenden und nicht DrawText. (DrawText geht prinzipiell auch, aber mit hirnverbranntem Interface und lästigen Einschränkungen.)


Alle Zeitangaben in WEZ +1. Es ist jetzt 22: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 by Thomas Breitkreuz