Hinty - formatowanie zawartości

Hinty - formatowanie zawartości
HI
  • Rejestracja:prawie 13 lat
  • Ostatnio:dzień
  • Postów:1857
0

Witam.

Próbuję zmienić wygląd hinta.

W sieci znalazłem dwa sposoby:
1.

Kopiuj
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

type
  TExHint = class(THintWindow)
  constructor Create(AOwner: TComponent); override;
end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

constructor TExHint.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  with Canvas.Font do
  begin
    Name  := 'Verdana';
    Size  := Size + 15;
    Style := [fsBold, fsItalic];
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  HintWindowClass  := TExHint;
end;

end. 

Hint jest co prawda większy ale czcionka zostaje bez zmian :
1.jpg

oraz drugi, prostszy sposób:
w FormCreate(Sender: TObject) głownej formy dodać:

Kopiuj
 Application.hinthidepause:=0;
     Application.HintColor:=clYellow;
     Screen.HintFont.Name:='times new roman';
     Screen.HintFont.Color:=clBlue;
     Screen.HintFont.Style:=[fsbold,fsitalic];
     Screen.HintFont.Size:=30;
   

tło zmienia się zgodnie z oczekiwaniami lecz czcionka znów bez zmian...

2.jpg

Testowałem pod Windows 8.

Jak w takim razie zmienić tą czcionkę ?

Z góry dziękuję za pomoc.

  • 2.jpg (10 KB) - ściągnięć: 181
  • 1.jpg (9 KB) - ściągnięć: 197
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około godziny
  • Lokalizacja:Tuchów
  • Postów:12171
0

Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 1x, ostatnio: flowCRANE
HI
  • Rejestracja:prawie 13 lat
  • Ostatnio:dzień
  • Postów:1857
0

@furious programming dziękuje Ci za odpowiedź.
W źródle które podałeś jest to co napisałem w punkcie pierwszym, dodane jest jedynie

Kopiuj
   Application.ShowHint := False;
  Application.ShowHint := True;

jednak to nie naprawia problemu...

flowCRANE
O ten kawałek mi właśnie chodziło, ale skoro to nie pomaga, to trzeba szukać dalej :(
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 15 godzin
3
Kopiuj
constructor TExHint.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  with Font do // bo Canvas.Font - może się cofnąć przy najbliższym rysowaniu
  begin
    Name  := 'Verdana';
    Size  := Size + 15;
    Style := [fsBold, fsItalic];
  end;
end;

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
HI
  • Rejestracja:prawie 13 lat
  • Ostatnio:dzień
  • Postów:1857
0

@_13th_Dragon dziękuję ! To działa :)!
Wychodzi na to, że na tych paru/parunastu stronach które podają ten sposób jest mały błąd...

flowCRANE
Zawsze możesz im to wyperswadować ;)
HI
  • Rejestracja:prawie 13 lat
  • Ostatnio:dzień
  • Postów:1857
0

Wróciłem do projektu w którym chciałem wykorzystać te hinty i znów zonk...
Wtedy gdy zakładałem ten temat sposób @_13th_Dragon zadziałał bez zarzutu.
Dziś taki kod :

Kopiuj
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs;

type

  { TForm1 }

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;


type
  TExHint = class(THintWindow)
  constructor Create(AOwner: TComponent); override;
end;


var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

constructor TExHint.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  with Font do // bo Canvas.Font - może się cofnąć przy najbliższym rysowaniu
  begin
    Name  := 'Verdana';
    Size  := Size + 35;
    Style := [fsBold, fsItalic];
    Color := clRed;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
    HintWindowClass  := TExHint;
end;

end.
 

Daje taki efekt:
hinyt.jpg

Dlaczego ?

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 15 godzin
0

HintWindowClass działa globalnie, ustaw to w rozdziale initialization


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 2x, ostatnio: _13th_Dragon
HI
  • Rejestracja:prawie 13 lat
  • Ostatnio:dzień
  • Postów:1857
0

Przyznam szczerze, że nie do końca rozumiem....

Dopisałem przed end.

Kopiuj
initialization
  HintWindowClass  := TExHint;   

ale bez efektu...

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:około 15 godzin
0

To dodaj jeszcze:

Kopiuj
Screen.HintFont.Assign(Font);

na koniec konstruktora: constructor TExHint.Create(AOwner: TComponent);

Kopiuj

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
HI
  • Rejestracja:prawie 13 lat
  • Ostatnio:dzień
  • Postów:1857
0

Witam.

Dziękuję za odpowiedz.
Kolejny raz podchodzę to temat.
Teraz mój kod wygląda tak :

Kopiuj
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs;

type

  { TForm1 }

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

type
  TExHint = class(THintWindow)
  constructor Create(AOwner: TComponent); override;
end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

constructor TExHint.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  with Font do // bo Canvas.Font - może się cofnąć przy najbliższym rysowaniu
  begin
    Name  := 'Verdana';
    Size  := Size + 35;
    Style := [fsBold, fsItalic];
    Color := clRed;
  end;
  Screen.HintFont.Assign(Font);
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  HintWindowClass  := TExHint;     // Tego chyba powinno nie być - jednak usunięcie nic nie zmienia.
end;

initialization
  HintWindowClass  := TExHint;

end.
 

Lecz hint nadal wyświetla się standardowo....

flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około godziny
  • Lokalizacja:Tuchów
  • Postów:12171
0

Nigdy nie bawiłem się z przerabianiem hintów, ale pogrzebałem nieco w sieci i popróbowałem to zmienić;

@hipekk - przede wszystkim klasa THintWindow posiada właściwość Canvas, a ta z kolei właściwość Font, więc trzeba ustawić font właśnie w klasie okna podpowiedzi; I to w sumie tyle, bo po ustawieniu fonta w konstruktorze klasy własnego okna hintów, wszystko działa jak należy - hint posiada taki font, jaki mu ustawimy;

Po drugie - w Twoim kodzie, konstruktor nie znajduje się w sekcji public; Być może ma to znaczenie, ale nie mam czasu teraz się nad tym głowić; Poniżej podaję kod jaki testowałem i zrzut ekranu z wyświetlonego okienka podpowiedzi; Testowane na Lazarusie z FPC 2.6.2;

Kopiuj
type
  TForm1 = class(TForm)
    Button1: TButton;
  end;

type
  TMyHint = class(THintWindow)
  public
    constructor Create(AOwner: TComponent); override;
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

constructor TMyHint.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);

  with Canvas.Font do
  begin
    Name  := 'Ubuntu';
    Size  := 10;
    Color := clMenuHighlight;
    Style := [];
  end;
end;

initialization
begin
  HintWindowClass := TMyHint;
end;

Efekt ustawień poniżej (kursora nie widać, bo zrzut zrobiłem przyciskiem PrtSc):

own-hint.png

Trzeba by poczytać więcej, jeżeli poza zmianą fonta interesuje Cię jeszcze np. zmiana koloru tła hinta czy w ogóle własne rysowanie okienka podpowiedzi;

To w sumie tyle; Oprócz samej zmiany fonta wyczytałem, że aby zmienić rozmiar okienka należy przedefiniować metodę CalcHintRect i jako rezultat zwrócić strukturę typu TRect, uzupełnioną w odpowiednie dane, gdzie lewy górny róg to punkt 0,0; Działa bez zarzutów, tyle że rysowanie nadal pozostaje standardowe (tekst wyrównany do lewego górnego rogu) i trzeba się dostać do metody odpowiedzialnej za rysowanie i ją także przedefiniować (jeśli można); Poszukaj sobie takich informacji i popróbuj jeszcze sam.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 3x, ostatnio: flowCRANE
Opi
  • Rejestracja:ponad 20 lat
  • Ostatnio:3 dni
  • Postów:1030
0

Zainteresuj się komponentem TFlatHint

lub skorzystaj z jego kodu:
http://cfprogramas.googlecode.com/svn/trunk/componentes/_Lib/TFlatHintUnit.pas

Ma wszystko to co Ci potrzeba. Zmienia czcionkę i jej wielkość, kolor oraz tło.

HI
  • Rejestracja:prawie 13 lat
  • Ostatnio:dzień
  • Postów:1857
0

Po długiej przerwie wróciłem do projektu w którym chciałem wykorzystać te hinty.
W ramach testu utworzyłem nowy projekt przerzuciłem kod który podał @furious programming i nic z tego... (na wszelki wypadek wrzucam źródło - może coś istotnego pomijam...)
Być może to kwestia systemu?
@furious programming na jakim systemie testowałeś ten kod który wrzucałeś ?

flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około godziny
  • Lokalizacja:Tuchów
  • Postów:12171
1

Kod testowałem na WinXP (to przecież widać po wyglądzie okienka z podanego zrzutu) i wszystko działa tak, jak pokazałem na zrzucie; Hinty były malowane według kodu i nawet manifest systemu się nie wtrącał, więc uznałem, że kod jest prawidłowy; Zresztą ten kod napisałem na podstawie artykułów z bazy wiedzy Lazarusa i innych materiałów, np. pytań na StackOverlow;

Pobrałem projekt podanego przez Ciebie załącznika, skompilowałem i znów działa prawidłowo:

hint.png

a nic w kodzie nie zmieniałem - po prostu go skompilowałem i uruchomiłem.


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 2x, ostatnio: flowCRANE
LA
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 11 godzin
  • Postów:470
0

na win 7 nie działa, potwierdzam.

Pewnie kwestia ustawień kolorów i interfejsu aero glass.

flowCRANE
Hmm, to dziwne, bo ustawienie manifestu Luna na WinXP w tym nie przeszkadza; Ale wierzę Wam;
KA
  • Rejestracja:prawie 20 lat
  • Ostatnio:minuta
  • Lokalizacja:Gorlice
3

Na Windows 7 działa z manifestem (bo bez działa normalnie) tylko jest dziwna sprawa trzeba ustawić kolor tła (np. w OnCreate formy):

Kopiuj
Application.HintColor:= clNone; //dowolny kolor 

Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.
HI
  • Rejestracja:prawie 13 lat
  • Ostatnio:dzień
  • Postów:1857
0

@kAzek zgodnie z tym co napisałeś dodałem Application.HintColor:= clNone; i rzeczywiście działa :) (Windows 8.1)

flowCRANE
No to już po problemie, czy nie? ;)
HI
@furious programming chyba tak, choć jeszcze testuję dlatego nie zminiłem "odfajkowania" na właściwy post ;) (swoją drogą należało by zaznaczyć dwa: Twój i kAzka (chyba tak będzie dopełniacz od kAzek))
flowCRANE
Ok; No z tym akceptowaniem postów nic nie wymyślisz - można tylko jeden ;)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.