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 | im Hint anzeigen (https://www.delphipraxis.net/137883-%7C-im-hint-anzeigen.html)

himitsu 30. Jul 2009 11:23


| im Hint anzeigen
 
Zitat:

Durch die Angabe von zwei Werten, die durch das Zeichen | voneinander getrennt sind, kann ein Kurzhinweis definiert werden, der sowohl vom Hilfetextfeld als auch von einer Ereignisbehandlungsroutine für OnHint verwendet wird. Beispiel:
Delphi-Quellcode:
Edit1.Hint := 'Name|Geben Sie den Namen in das Eingabefeld ein';

Ja also dieses Verhalten bereitet mir gerade Probleme, denn ich möchte/müßte im Hint gerade dieses Zeichen anzeigen,
aber leider schneidet Delphi ab Diesem den Text ja nun ab ... gibt es da überhaupt einen Weg dieses dennoch anzeigen zu lassen?

[add] ich dachte erst mein mehrzeiliger Hinttext sei zu lang :?

Bernhard Geyer 30. Jul 2009 11:26

Re: | im Hint anzeigen
 
Evtl. eigene Implementierung des Hintfensters verwenden? Das ElPack von LMD hat sowas (um Unicode auch vor D2009 un HTML im Hint zu unterstützen)

himitsu 30. Jul 2009 11:37

Re: | im Hint anzeigen
 
Ich hatte mir grad mal TCustomHint.ShowHint(Control: TControl); angesehn und dieses läßt sich leider nicht überschreiben. Ja und gerade diese Funktion wird ja durch die VCL aufgerufen,
also selbst wenn ich da eine andere Hint-Klasse registriere, komm ich nicht an den kompletten Hint-Text ran :cry:

function GetShortHint(const Hint: string): string; aus der Unit Controls könnte ich noch versuchen irgendwie zu ersetzen.
(ich glaub da gab's doch sowas mit Hooks, aber ob das hier geht, weiß ich grad nicht ... muß mal suchen, wo hier der Thread zu sowas nochmal war)

Alternativ wären noch 2 Möglichkeiten übrig:
  • ein anderes Zeichen in der Eingabe verwenden und dieses dann durch | ersetzen,
    aber es handelt sich um die Eingabe einer Maske (Dateiname), wo mehrere Masken möglich sind ... getrennt durch |, wie es ja an vielen Stellen üblich ist und da jetzt ein anderes Zeichen zu nutzen, nur weil der Hint "spinnt" ... :evil:
  • ein anderes Zeichen anzeigen, welches aber genauso aussieht ... via Unicode gibt's da mehrere Möglichkeiten, aber ob auf dem Zielrechner dieses Zeichen dann auch angezeigt werden kann, ist fraglich.

jfheins 30. Jul 2009 11:57

Re: | im Hint anzeigen
 
Evtl. so wie bei && > & und '' > ' einfach verdoppeln?

Also Sowas:
Zitat:

Hallo || Welt
N Versuch wärs wert :stupid:

himitsu 30. Jul 2009 12:07

Re: | im Hint anzeigen
 
||, \| und Co. ... so schlau war ich auch schon, aber selbst nach näherem Hinsehn, gibt's da keine Maskierung :?

Delphi-Quellcode:
function GetShortHint(const Hint: string): string;
var
  I: Integer;
begin
  I := AnsiPos('|', Hint);
  if I = 0 then
    Result := Hint else
    Result := Copy(Hint, 1, I - 1);
end;
und
Delphi-Quellcode:
procedure TCustomHint.ShowHint(Control: TControl);
var
  Pos: TPoint;
  Index: Integer;
begin
  if Control.Hint = '' then
    Exit;

  Index := AnsiPos('|', Control.Hint); //Do Not Localize

  Title := GetShortHint(Control.Hint);
  if Index <> 0 then
    Description := GetLongHint(Control.Hint)
  else
    Description := '';
...
ich wollte doch nur im Hint angeben, was es für Möglichkeiten bei der Maske gibt :cry:

also im LongHint wäre ein | möglich, da ja nur das Erste ausgewertet wird, aber im Hint angezeigt wird ja nur der ShortHint.

Matze 30. Jul 2009 12:12

Re: | im Hint anzeigen
 
Kann man sowas vielleicht mit dem ASCII-Zeichensatz hinbekommen?

Delphi-Quellcode:
Edit1.Hint := 'Name' + #124 + 'Geben Sie den Namen in das Eingabefeld ein';
Ungetestet und geraten. Evtl. ist es völliger Blödsinn.

Grüße, Matze

TeronG 30. Jul 2009 12:51

Re: | im Hint anzeigen
 
Ich habe mal irgend wo (swissdelphicenter!?) ShowBalloonTip gefunden.
Das "überschreibt" die normalen Hints und zeigt auch '|' im Hilfetext an.

Evtl. kannste das ja an deine Wünsche anpassen oder dich davon inspirieren lassen. ^^ (oder 1:1 verwenden ^^)


Delphi-Quellcode:
procedure ShowBalloonTip(Control: TWinControl; Icon: integer;        // benötigt 'Commctrl' (uses)
                        Title: pchar; Text: PWideChar; BackCL, TextCL: TColor);


{ShowBalloonTip(Button1, 1, 'Title', 'Balloontiptext', clBlue, clNavy);}
procedure ShowBalloonTip(Control: TWinControl; Icon: integer; Title: pchar; Text: PWideChar; BackCL, TextCL: TColor);
const
  TOOLTIPS_CLASS = 'tooltips_class32';
  TTS_ALWAYSTIP = $01;
  TTS_NOPREFIX = $02;
  TTS_BALLOON = $40;
  TTF_SUBCLASS = $0010;
  TTF_TRANSPARENT = $0100;
  TTF_CENTERTIP = $0002;
  TTM_ADDTOOL = $0400 + 50;
  TTM_SETTITLE = (WM_USER + 32);
  ICC_WIN95_CLASSES = $000000FF;
type
  TOOLINFO = packed record
    cbSize: Integer;
    uFlags: Integer;
    hwnd: THandle;
    uId: Integer;
    rect: TRect;
    hinst: THandle;
    lpszText: PWideChar;
    lParam: Integer;
  end;
var
  hWndTip: THandle;
  ti: TOOLINFO;
  hWnd: THandle;
begin
  hWnd   := Control.Handle;
  hWndTip := CreateWindow(TOOLTIPS_CLASS, nil,
    WS_POPUP or TTS_NOPREFIX or TTS_BALLOON or TTS_ALWAYSTIP,
    0, 0, 0, 0, hWnd, 0, HInstance, nil);
  if hWndTip <> 0 then
  begin
    SetWindowPos(hWndTip, HWND_TOPMOST, 0, 0, 0, 0,
      SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);
    ti.cbSize := SizeOf(ti);
    ti.uFlags := TTF_CENTERTIP or TTF_TRANSPARENT or TTF_SUBCLASS;
    ti.hwnd := hWnd;
    ti.lpszText := Text;
    Windows.GetClientRect(hWnd, ti.rect);
    SendMessage(hWndTip, TTM_SETTIPBKCOLOR, BackCL, 0);
    SendMessage(hWndTip, TTM_SETTIPTEXTCOLOR, TextCL, 0);
    SendMessage(hWndTip, TTM_ADDTOOL, 1, Integer(@ti));
    SendMessage(hWndTip, TTM_SETTITLE, Icon mod 4, Integer(Title));
  end;
end;
EDIT: ups ... zu viel kopiert ^^

mirage228 30. Jul 2009 12:52

Re: | im Hint anzeigen
 
Du könntest ja einfach "Hint >> Bla bla" nehmen und beim Zeichnen dann >> durch | ersetzen. Das Zeichen lässt sich ja mittels HintWindow-Klassen personalisieren...

Viele Grüße

TeronG 30. Jul 2009 12:53

Re: | im Hint anzeigen
 
Zitat:

Zitat von Matze
Kann man sowas vielleicht mit dem ASCII-Zeichensatz hinbekommen? ... Ungetestet und geraten ..

nope geht leider net. (grade mal schnell getestet ^^)
Zitat:

Zitat von himitsu
ich wollte doch nur im Hint angeben, was es für Möglichkeiten bei der Maske gibt :cry:

Dann schreib den Trivialnamen ... wenn man den nicht kennt, so wie ich, kann man ihn ja immer noch googeln. ^^

himitsu 30. Jul 2009 13:19

Re: | im Hint anzeigen
 
Zitat:

Zitat von TeronG
Zitat:

Zitat von Matze
Kann man sowas vielleicht mit dem ASCII-Zeichensatz hinbekommen? ... Ungetestet und geraten ..

nope geht leider net. (grade mal schnell getestet ^^)

es ist ja auch klar warum ... im String ist es ja so oder so dieses "böse" Zeichen :zwinker:

Zitat:

Zitat von TeronG
Dann schreib den Trivialnamen ... wenn man den nicht kennt, so wie ich, kann man ihn ja immer noch googeln. ^^

toll, den weiß ich jetzt auch nicht :oops: ... nur nach was soll ich da suchen?
google
Es wurden keine mit Ihrer Suchanfrage - | - übereinstimmenden Dokumente gefunden.

Vorschläge:

* Probieren Sie andere Suchbegriffe.

also bis jetzt hatte ich es noch nie geschaft, daß mir google absolut nix liefert ... is also 'ne Premiere für mich ... sonst kommt ja wenigstens noch sowas
google
Meinten Sie: .....

Es wurden keine Standard-Webseiten gefunden, in denen alle eingegebenen Suchbegriffe vorkommen.

Es wurden keine mit Ihrer Suchanfrage - ..... - übereinstimmenden Dokumente gefunden.

Vorschläge:

* Vergewissern Sie sich, dass alle Wörter richtig geschrieben sind.
* Probieren Sie andere Suchbegriffe.
* Probieren Sie allgemeinere Suchbegriffe.


Also das mit dem BalloonTip wäre eine Möglichkeit und sieht bestimmt nicht schlecht aus.
Nur selbst einblenden ... hab grad keine Ahnung wie ich das machen sollte (also auf welches Ereignis hin),
aber ich denk da läßt sich was machen, wenn ich im HintText das Zeichen Kodiere und dann beim Anzeigen umwandel ...

aber so oder so (andere Hintklasse oder ToolTip) ich werd wohl etwas "eigenes" registrieren müssen :?
(also eine Maskierungsmöglichkeit für das | im HintText, seitens Delphi, wäre schon besser gewesen :evil: )

jfheins 30. Jul 2009 13:30

Re: | im Hint anzeigen
 
Zitat:

Zitat von himitsu
toll, den weiß ich jetzt auch nicht :oops: ... nur nach was soll ich da suchen?

http://de.wikipedia.org/wiki/Senkrechter_Strich ;) :mrgreen:

himitsu 30. Jul 2009 14:01

Re: | im Hint anzeigen
 
:wall: wie soll man nur auf sowas kommen? :oops:

Aber der Artikel hat mir eine weitere Lösung aufgezeigt ... und zwar das Zeichen ¦
(ist auch im ANSI mit enthalten)

ich werd' aber dennoch demnächst im OnEnter einiger Edits noch den BalloonTip mit anzeigen :angel:

himitsu 30. Jul 2009 15:17

Re: | im Hint anzeigen
 
@TeronG:
Delphi-Quellcode:
Uses CommCtrl;

Procedure SetBalloonTip(Control: TWinControl; Const Title, Text: String; Icon: Integer = TTI_INFO);
  Var H: THandle;
    TI: TToolInfo;

  Begin
    H := CreateWindow(TOOLTIPS_CLASS, nil, WS_POPUP or TTS_NOPREFIX or TTS_BALLOON or TTS_ALWAYSTIP,
      0, 0, 0, 0, Control.Handle, 0, HInstance, nil);
    If H <> 0 Then Begin
      SetWindowPos(H, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);
      TI.cbSize  := SizeOf(TI);
      TI.uFlags  := TTF_CENTERTIP or TTF_TRANSPARENT or TTF_SUBCLASS;
      TI.hwnd    := Control.Handle;
      TI.lpszText := PChar(Text);
      GetClientRect(Control.Handle, TI.Rect);
      SendMessage(H, TTM_ADDTOOL, 1, Integer(@TI));
      SendMessage(H, TTM_SETTITLE, Icon, Integer(Title));
    End;
  End;
hab jetzt deine Variante verbaut, auch wenn ich erst versucht hatte den ToolTip direkt per Aufruf anzuzeigen und mich wunderte waru nix angezeigt wird

hab jetzt alles auf das Nötige gekürzt
- in der Unit CommCtrl war ja schon alles enthalten und muß nicht nochmal definiert werden
- und die beiden Farben flogen auch raus ... brauch ja nur das aktuelle Windowsdesign :angel:
- OK und String gefiehl mir auch besser als dieses PChar-PWideChar-Gemischmasch :nerd:
- Prozedurname geändert Set statt Show, denn der wird ja nur gesetzt und nicht direkt angezeigt.

Ja und es wird jetzt endlich alles schön angezeigt, ohne daß ich groß was ändern mußt :thumb:

TeronG 30. Jul 2009 15:42

Re: | im Hint anzeigen
 
Bug (erinnert/)gefunden....

Wenn du mit der Maus so lange über einem (z.B.) Button bist, bis der Tip verschwindet taucht er bei erneutem drüberfahren nicht mehr auf.

Btw: ist das Absicht, dass bei deiner Version der Titel "anders" dargestellt wird!?

Zitat:

Zitat von himitsu
:wall: wie soll man nur auf sowas kommen? :oops:

Genau!! voll unlogisch :evil: (währe ich (auch) nieeee drauf gekommen :oops: Kopf->Tisch)

himitsu 30. Jul 2009 16:04

Re: | im Hint anzeigen
 
Zitat:

Zitat von TeronG
Wenn du mit der Maus so lange über einem (z.B.) Button bist, bis der Tip verschwindet taucht er bei erneutem drüberfahren nicht mehr auf.

dem ist bei mir so? :gruebel:
wird also wieder angezeigt

Zitat:

Zitat von TeronG
Btw: ist das Absicht, dass bei deiner Version der Titel "anders" dargestellt wird!?

wie "anders"?

Abgesehn von den Farben sollte sich nix ändern.

TeronG 31. Jul 2009 09:04

Re: | im Hint anzeigen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von himitsu
dem ist bei mir so? :gruebel:
wird also wieder angezeigt

ahhh ja ... :gruebel:
Also solange das ding sich nicht selbst ausblendet kommt es auch bei mir wieder aber nicht wenn ich "die zeit übersehe". :gruebel:
Egal... irgend was ist bei mir sowieso nicht mehr ganz koscher.

Btw, Habe meine alte gleich mal durch deine Kurze Version ersetzt. :thumb: (auch wenn die "farbwahl" weggefallen ist ^^)

Zitat:

Zitat von himitsu
wie "anders"?

Anderer schriftsatz, oder so :gruebel:
So, wie aufm bild im Anhang. :) ( Bild > 1000 Worte) ^^

EDIT: BTW: Schön sich wenigstens mal n bissel revanchieren zu können :mrgreen:

himitsu 31. Jul 2009 09:51

Re: | im Hint anzeigen
 
Zitat:

Zitat von TeronG
(auch wenn die "farbwahl" weggefallen ist ^^)

die kann man ja notfalls wieder reinmachen ... wollt mir nur die unnötigen Parameter und Nachrichten ersparen, da ich ja sowieso eigentlich fast ausschließlich den Style von Windows nutze, bzw. den, welchen sich der User eingestellt hat. :angel2:
> praktisch zwei Parameter angehängt und die 2 SendMessages wirder rein und das wäre wieder da

Zitat:

Zitat von TeronG
Zitat:

Zitat von himitsu
wie "anders"?

Anderer schriftsatz, oder so :gruebel:
So, wie aufm bild im Anhang. :) ( Bild > 1000 Worte) ^^

schon komisch ... hatte zwar auch irgendwie sowas vermutet und es gleich nochmal in D7 und D2009 getestet, aber da lief es ... mal schaun :gruebel:

[add]
hab grad nochmal mit deinem Code verglichen und der Titel hat sich eigentlich nicht geändert, außer das jetzt String statt PChar ist, aber intern sieht ein String ja auch wie ein PChar aus, also sollte sich da nix ändern :gruebel:

TeronG 31. Jul 2009 10:23

Re: | im Hint anzeigen
 
hmm ... keine Ahnung, warum bei mir die Neue nicht geht ... aber halb so wild.

himitsu 31. Jul 2009 10:34

Re: | im Hint anzeigen
 
mein akiv laufendes XP ist auch etwas verkorkst ... vielleicht ja so verkorkst, daß es hier deswegen läuft? :lol:
(komme einach nicht zum neuinstallieren, dabei wollt ich mal alles auf Seven umlagern, welches ja eigentlich schon installiert ist)

Aber vielleicht findet sich ja noch jemand, der es mal bei sich testet :angel:

ChrisE 31. Jul 2009 10:45

Re: | im Hint anzeigen
 
Zitat:

Zitat von TeronG
... dass bei deiner Version der Titel "anders" dargestellt wird!?

Kann ich bestätigen wie in Post 16.

Vista Ultimate 32 Bit
D2007

Gruß, Chris

TeronG 31. Jul 2009 10:50

Re: | im Hint anzeigen
 
Habe "meine" alte Version pö a pö auf Richtung "neue" getrimmt bis ich den Schuldigen hatte.

UND!! 42 war die Lösung!! ... ääähhhh naja ... eigentlich WM_USER + 32 ... aber ist ja "knapp" dran. ^^

Delphi-Quellcode:
const
  TTM_SETTITLE = (WM_USER + 32);
TTM_ADDTOOL ($0400 + 50) unterscheidet sich bei mir auch noch zur CommCtrl Version(WM_USER + 4) aber der Rest ist gleich.... //WM_USER = $0400

EDIT: BTW:
Alte Version:
TTM_SETTITLE = WM_USER + 32)

CommCtrl:
TTM_SETTITLE = TTM_SETTITLEW = WM_USER + 33; { wParam = TTI_*, lParam = wchar* szTitle }


Hat wohl was mit string, char, widechar, ansichar, ... zu tun.

Satty67 31. Jul 2009 11:04

Re: | im Hint anzeigen
 
Zitat:

Zitat von TeronG
TTM_SETTITLE = WM_USER + 32;

Haa... ;)

Dann läuft es auch unter Delphi5. Musste ein paar Konstanten selber definieren und hatte mit WM_User+33 auch so meine optischen Probleme und dachte es liegt an meinen kleinen Anpassungen.

himitsu 31. Jul 2009 11:07

Re: | im Hint anzeigen
 
Wie, ihr nutzt in einem Nicht-Unicode-Delphi TTM_SETTITLEW?

komisch, eigentlich sollte dort ja TTM_SETTITLEA verwendet werden, da ja Title ein AnsiString ist :gruebel:

himitsu 31. Jul 2009 11:09

Re: | im Hint anzeigen
 
Zitat:

Zitat von Satty67
Zitat:

Zitat von TeronG
TTM_SETTITLE = TTM_SETTITLEW = WM_USER + 33;

Haa... ;)

Dann läuft es auch unter Delphi5. Musste ein paar Konstanten selber definieren und hatte mit WM_User+33 auch so meine optischen Probleme und dachte es liegt an meinen kleinen Anpassungen.


also im Grunde müßte man ja mit deiner Version in D2009 probleme bekommen, da dort ja diese Konstanten auch selber definiert wurden, aber nur für die AnsiVersion und dann dennoch mit PChar gearbeitet wurde, was dann die Konstanten der Wide-Verion benötigt hätte :mrgreen:

Satty67 31. Jul 2009 11:11

Re: | im Hint anzeigen
 
TTM_SETTITLEA/W ist in Delphi 5 nicht definiert.

Hatte dann schnell im Source von D2007 geschaut und dort war TTM_SETTITLEW als default definiert. Den Wert dann fälschlicherweise auch bei D5 übernommen. Meinen Fehler hab' ich halt jetzt erst durch die Erkenntnisse hier im Thread bemerkt.

Konstanten für D5:
Delphi-Quellcode:
TTS_BALLOON = $40;
TTS_ALWAYSTIP = $01;
TTM_SETTITLE = WM_USER + 32; // $0400 + 32

himitsu 31. Jul 2009 11:19

Re: | im Hint anzeigen
 
OK, dann ist das also ein Fehler in Delphi ... bis D2007 sollten ja die A-Versionen als Default strinstehn, da die restlichen APIs auch als AnsiVersion per Default drin sind

TTM_SETTITLEW = PWideChar/WideString/UnicodeString
TTM_SETTITLEA = PAnsiChar/AnsiString

und in D2009 dann natürlich das W


kein Wunder, wenn es nicht geht ... also wenn man versucht einen Ansitext zu verwenden und die Gegenseite es versucht als Unicode zu lesen.


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