Autor Téma: jak na nápovědu v aplikaci  (Přečteno 249 krát)

Offline anec

  • Mladík
  • **
  • Příspěvků: 92
  • Karma: 1
jak na nápovědu v aplikaci
« kdy: 30-05-2019, 08:07:36 »
máme poměrně rozsáhlou aplikaci, která má spoustu formu, na formech spoustu checkboxů editlabelů atd atd
potřebujeme teď vyřešit problém že pro cca 100 prvků v celé aplikaci potřebujeme vyřešit nějakou formu nápovědy.
vymysleli jsme ini soubor. každy prvek má svoje ID a pak pomocí Application.HelpContext(IDH_TOPIC) zobrazíme form a na něm memo naplněné z toho ini souboru

nevím ale, jak dát uživateli najevo, že tento konkrétní prvek obsahuje nápovědu? celý prvek podrtrhnout? změnit barvu?

díky

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2588
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:jak na nápovědu v aplikaci
« Odpověď #1 kdy: 30-05-2019, 09:55:16 »
máme poměrně rozsáhlou aplikaci, která má spoustu formu, na formech spoustu checkboxů editlabelů atd atd
potřebujeme teď vyřešit problém že pro cca 100 prvků v celé aplikaci potřebujeme vyřešit nějakou formu nápovědy.
vymysleli jsme ini soubor. každy prvek má svoje ID a pak pomocí Application.HelpContext(IDH_TOPIC) zobrazíme form a na něm memo naplněné z toho ini souboru

nevím ale, jak dát uživateli najevo, že tento konkrétní prvek obsahuje nápovědu? celý prvek podrtrhnout? změnit barvu?
Je nejaky duvod nepouzivat standardni zpusob tj. hinty + context widgetu, ktery se pouzije jako klic do napovedy (viz treba parametr HelpCtx u http://docwiki.embarcadero.com/Libraries/Rio/en/Vcl.Dialogs.MessageDlg)

Myslim, ze standardnim resenim je tlacitko s otaznikem, na ktere kdyz se klikne a jezdi se kurzorem po widgetech, tak se kurzor meni podle toho, jestli je napoveda dostupna a k widgetu, na ktery  se klikne se zobrazi napoveda.

Jinak jestli je to aplikace trvale pripojena k internetu a mate moznosst provozovat webovy server, tak bych celou napovedu delal vyhradne on-line napr. https://www.wikimatrix.org/compare/lynxwiki+prontowiki+roadkill. My pouzivame RoadKill.

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 958
  • Karma: 27
    • Verze Delphi: XE8, Seattle
Re:jak na nápovědu v aplikaci
« Odpověď #2 kdy: 30-05-2019, 14:37:23 »
Používám řádkovou nápovědu (každý prvek má hint a ten může být zobrazován rovnou jako text na určeném místě formu nebo tlačen přes DB, pak je hint jen ID). Jako doplněk mám ještě bublinovou, ta funguje celkem obstojně a občas ještě využívám chm soubory.

Offline anec

  • Mladík
  • **
  • Příspěvků: 92
  • Karma: 1
Re:jak na nápovědu v aplikaci
« Odpověď #3 kdy: 31-05-2019, 08:12:38 »
ano toto v podstatě vím, jde mi o to že převážná většina prvků mít nápovědu nebude, tak jestli a jak upozornit vizuálně uživatele že v tomto prvku nápověda je

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 958
  • Karma: 27
    • Verze Delphi: XE8, Seattle
Re:jak na nápovědu v aplikaci
« Odpověď #4 kdy: 31-05-2019, 11:54:34 »
Aha, tak to my dělali malým otazníčkem (obrázkem) vedle každého pole a po přejetí kurzoru nad otazníček se zobrazila bublina, nebo se nápověda zobrazovala pod každým polem trvale (a la JIRA fields) anebo právě v tom nápovědném řádku (pokud políčko nápovědu nemělo, zůstal prázdný)

Takhle nějak byly ty bubliny, pro zobrazení šlo použít leccos
Kód: Delphi [Vybrat]
  1.  
  2. procedure TUzivatel.ControlMouseEnter(Sender: TObject);
  3. var
  4.   HW: TBalloonHintWindow;
  5.   sHint: string;
  6.   ARect, R: TRect;
  7.   APoint: TPoint;
  8. begin
  9.   with Sender as TImage do
  10.   begin
  11.     HW := Pointer(Tag);
  12.     if Assigned(HW) then
  13.     begin
  14.       HW.ReleaseHandle;
  15.       HW.Free;
  16.       Tag := 0;
  17.     end;
  18.     HW := {TNewDesignHint} TBalloonHintWindow.Create(nil);
  19.     try
  20.       {
  21.       HW.Color := $00FBF2EB;
  22.       HW.BorderColor := $00E5C1A6;
  23.       HW.LinkStyle := liNone;
  24.       HW.HintStyle := hiRectangle;}
  25.       try
  26.         sHint := Hint;
  27. //        if Length(sHint) > 512 then R := HW.CalcHintRect(500,sHint, nil)
  28. //        else
  29.         R := HW.CalcHintRect(300, sHint, nil);
  30.         if not GetCursorPos(APoint) then Exit;
  31.         APoint := ScreenToClient(APoint);
  32.         ARect.TopLeft := APoint;
  33.         ARect.Right := APoint.x + (R.Right - R.Left);
  34.         ARect.Bottom := APoint.y + (R.Bottom - R.top);
  35.  
  36.         HW.ActivateHint(ARect, sHint);
  37.         HW.Refresh;
  38.       except
  39.         on E: Exception do
  40.         begin
  41.           ShowMessage(E.Message);
  42.           HW.ReleaseHandle;
  43.           FreeAndNil(HW)
  44.         end;
  45.       end;
  46.     finally
  47.       Tag := Integer(HW);
  48.     end;
  49.   end;
  50. end;
  51.  
  52. procedure TUzivatel.ControlMouseLeave(Sender: TObject);
  53. var
  54.   HW: THintWindow;
  55. begin
  56.   with Sender as TImage do
  57.   begin
  58.     HW := Pointer(Tag);
  59.     if Assigned(HW) then
  60.     begin
  61.       HW.ReleaseHandle;
  62.       HW.Free;
  63.       Tag := 0;
  64.     end;
  65.   end;
  66. end;
  67.  
« Poslední změna: 31-05-2019, 11:58:50 od JaroB »