Avatar billede novicen Nybegynder
02. februar 2000 - 08:43 Der er 9 kommentarer og
1 løsning

Hints i statuslinien

På mine editfelter, knapper mm. opretter jeg hints. Disse hints vil jeg have vist i statuslinien (TStatusBar) nederst på formen. Jeg har sat Autohint for statuslinien til TRUE og har forsøgt med forskellige kombinationer af ShowHint for både StatusBar og de øvrige komponenter, men der bliver ikke vist noget i statuslinien.

Hvordan får jeg vist mine hints i StatusBar?
Avatar billede blackthorne Nybegynder
02. februar 2000 - 08:49 #1
Lav en event på application.onHint event der kopier hinten til statusbaren

ala dette fra hjælpen

{ This shows how the OnHint event handler is declared as a public property of the form }

type
  TForm1 = class(TForm)
    Button1: TButton;
    StatusBar1: TStatusBar;
    Edit1: TEdit;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    procedure DisplayHint(Sender: TObject);
  end;

var

  Form1: TForm1;
implementation
{$R *.DFM}

{ Here is the implementation of the OnHint event handler }

{ It displays the application’s current hint in the status bar }
procedure TForm1.DisplayHint(Sender: TObject);
begin
  StatusBar1.SimpleText := GetLongHint(Application.Hint);
end;

{ Here is the form’s OnCreate event handler. }

{ It assign’s the application’s OnHint event handler at runtime }
{ because the Application is not available in the Object Inspector }
{ at design time }
procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnHint := DisplayHint;
end;
Avatar billede sjensen Nybegynder
02. februar 2000 - 09:55 #2
Som fortsættelse af blackthornes svar vil jeg lige indskyde:

Hvis du bruger denne fremgangsmåde i flere forms i samme program så er der et par problemer du skal være opmærksom på for at undgå "Access Violation" fejl:

Hvis du har en application.onhint := displayhint; på mainformen, så behøver du ikke tilsvarende i andre forms. Dine hints fra andre forms komponenter vil stadig blive vist i mainformens statusbar. Det er selvfølgeligt kun anvendeligt hvis andre forms ikke dækker over mani-formens statusbar.

Lad os antage at du har en statusbar og onhint event på mainform og på form2 fordi form2 vil dække over mainformens statusbar, og du kalder form2 fra mainform, så SKAL du huske at neutralisere onhint.eventen på mainform inden kaldet, etablere den i form2 ved start, neutralisere den igen ved afslutning af form2 og genetablere den i mainform efter retur fra form2:

i mainform:
procedure TMain.kald_form2;
begin
  application.onhint := nil;
  form2.showmodal;
  application.onhint := displayhint;
end;

og i form2:

procedure TForm2Create(sender : tobject);
begin
  application.onhint := displayhint; // hvis du har kaldt proceduren det samme i form2 som i main
end;

procedure TForm2destroy(sender : tobject);
begin
  application.onhint := nil;
end;

Som du muligvis har regnet ud er det fordi du kan ikke have 2 application.onhint events aktive (application gælder jo alle forms i programmet).

Og tro mig: Det er ren erfaring jeg taler ud fra :-)

sjensen
Avatar billede blackthorne Nybegynder
02. februar 2000 - 10:14 #3
Som du ganske rigtig påpeger, gælder mit eksemplet kun til hovedformen.

Jeg havde heller aldrig tænkt på, at have nye hint statusbarre i flere forms. De programmer jeg laver viser altid hints på hovedformen.

Jeg fandt igår en artikel om hvordan man også viser hints i statusbaren når kontrollen har focus, og ikke kun når musen er henover komponenten.

se evt. artikel her http://www.undu.com/Articles/990901h.html
Avatar billede novicen Nybegynder
02. februar 2000 - 10:42 #4
Jeg har prøvet at følge anvisningen, men det virker ikke helt efter hensigten,
Der bliver ikke vist noget på skærmen, så derfor prøvede jeg at ændre DisplayHint til følgende:

PROCEDURE TFormMain.DisplayHint(Sender: TObject);
VAR
  Streng: String;
begin
  Streng := GetLongHint(Application.Hint);
  StatusBar1.SimpleText := GetLongHint(Application.Hint);
  FormView.Memo.Lines.Add('Input:  ' + Streng);
end;

FormView indeholder blot en memo, som jeg så afslutningsvis kigger på.

Memoen havde følgende indhold:

Input:  Tabel
Input: 
Input:  Tabel Prefix
Input: 
Input:  Datamodul
Input: 

Det viser sig, at der umiddelbart efter at DisplayHint har modtaget den forventede tekst, kommer der en ny med en blank tekst.

Det skyldes ikke, at jeg har bevæget mig væk fra komponenten. Jeg har prøvet det samme med en ShowMessage af teksten, og der kommer 2 stk. i samme øjeblik, jeg bevæger mig ind i edit-feltet.
Avatar billede sjensen Nybegynder
02. februar 2000 - 10:48 #5
Har du sat showhint = true for editfeltet ?

Det skal være false og du skal kun have showhint true for formen.

sjensen
Avatar billede blackthorne Nybegynder
02. februar 2000 - 10:49 #6
Kender du forskellen mellem short og long hint?

en hint er bygget op en kortbeskrivelse og en lang beskrivelse
f.eks. 'Indtast kundenr|Indtast kundenr til modtagelse af faktura'
      ( Short hint  Separator  Longhint

Getlonghint henter altså 'Indtast kundenr til modtagelse af faktura'

hvis du ikke har udfyldt dette korrekt vises der ikke noget
Avatar billede novicen Nybegynder
02. februar 2000 - 12:15 #7
Først og fremmest tak til blackthorne og sjensen for hjælpen.

Pointene vil jeg give til blackthorne, fordi du henviste til hjælpeteksten, hvor der gives en løsning på mit problem.

Som det fremgik, havde jeg dog stadig problemer.

Det viste sig, at problemet egentlig lå i, at jeg ikke havde sat SimplePanel til TRUE i StatusBar. Da jeg havde gjort det, virkede det.

Det viste sig også, at det er ligegyldigt, om editfeltets ShowHint er sat til TRUE eller FALSE, ligesom det der uden betydning, om der både angives short og long hint.

Rent faktisk kunne jeg droppe alle disse indstillinger og procedurer, hvis jeg havde sat SimplePanel til TRUE og AutoHint til TRUE. Disse indstillinger i StatusBar bevirker, at hints bliver vist her.
Avatar billede blackthorne Nybegynder
02. februar 2000 - 12:19 #8
Okay det var jeg ikke klar over for denne indstilling findes ikke i delphi 3, som jeg benytter fortiden. Men tak for tippet, jeg kan bruge det i min næste projekt
Avatar billede sjensen Nybegynder
02. februar 2000 - 12:28 #9
Blackthorne>Simplepanel := true/false findes i D3 og det er korrekt som novicen siger at den skal være true før den kan vise hints, d.v.s. før man kan vise strenge i den.

sjensen
Avatar billede blackthorne Nybegynder
02. februar 2000 - 12:29 #10
Jeg mente propertien AutoHint
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester