AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Spaltenansicht in einem Hint

Ein Thema von punker76 · begonnen am 26. Jan 2004
Antwort Antwort
Benutzerbild von punker76
punker76

Registriert seit: 11. Jan 2004
Ort: Alsdorf
98 Beiträge
 
Delphi 7 Personal
 
#1

Spaltenansicht in einem Hint

  Alt 26. Jan 2004, 10:32
Hallo Leute.

Ich hatte dazu schon mal eine Anfrage ins Forum gepostet. Hab mir dann aber doch meine eigene Gedanken dazu gemacht. hier mein Ergebnis:

Die Benutzung der Klasse TMyHint:

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

uses
  teMyHint;

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
  {* eigene Hintklasse aktivieren }
  HintWindowClass := TMyHint;
  Application. HintHidePause:= 10000;

  Button1. Hint:=
    'Spalte 1<@=80@>Spalte 2<@=120@>Spalte 3' + ';' +
    'Ein Test mit ner langen, langen, sehr langen Zeile, ich hoffe es klappt?' + ';' +
    'Ein Test<@=80@>Noch ein Test<@=120@>Noch ein Test' + ';' +
    'Ein Test<@=80@>Noch ein Test<@=120@>blubb' + ';' +
    'Ein Test<@=80@>Noch ein Test' + ';' +
    '1235678';
end;

end.
Die Klasse TMyHint:

Delphi-Quellcode:
unit teMyHint;
//==============================================================================
// Klasse:    TMyHint
// Author:    Jan Karger
// Datum:    26.01.2004
// Feedback:    [email]punkerat76@gmx.net[/email]
// Benutzung:    Jeder kann diesen Code benutzen, weitergeben oder auch verändern,
//    verbessern und dann weitergeben und mir, wenn Verbesserungen
//    erfolgt sind, vielleicht ein kleines Feedback geben.
//==============================================================================
// Einbinden in ein Projekt: in FormCreate
//
// HintWindowClass := TMyHint;
// Application. ShowHint := False;
// Application. ShowHint := True;
//
// Formatierung des Hints:
//
// Hint:=
// 'Ein Test' + ';' +
// 'Ein Test<@=80@>Noch ein Test<@=120@>Noch ein Test' + ';' +
// 'Ein Test<@=80@>Noch ein Test<@=120@>blubb' + ';' +
// 'Ein Test<@=80@>Noch ein Test' + ';' +
// '1235678';
//
// <@=80@>   Spaltenbreite
// ';'      Trenner für den Zeilenumbruch
//==============================================================================

interface

uses
  Windows, Classes, Graphics, Controls, Forms;

type
  TMyHint = class(THintWindow)
  private
    procedure MyCalcHintRect (var ARect: TRect; AHint: string);
  public
    constructor Create (AOwner: TComponent); override;
    function CalcHintRect (MaxWidth: Integer; const AHint: string; AData: Pointer): TRect; override;
  protected
    procedure Paint; override;
  published
    property Caption;
  end;

var
  gMyHintColor      : TColor;

  gMyHintFont      : string;
  gMyHintFontStyle   : TFontStyles;
  gMyHintFontSize   : integer;

  gZeilenUmbruch   : Char;

implementation

uses
  SysUtils, Math;

constructor TMyHint. Create (AOwner: TComponent);
begin
  inherited Create(AOwner);
  {* eigenes Aussehen des Hints: Color, Schriftart, Schriftgrösse }
  Color := gMyHintColor;
  if gMyHintFont <> 'then begin
    Canvas. Font. Name   := gMyHintFont;
    Canvas. Font. Style   := gMyHintFontStyle;
    Canvas. Font. Size   := gMyHintFontSize;
  end
  else begin
    Canvas. Font := Screen. HintFont;
  end;
  Canvas. Brush. Style := bsClear;
end;

{** Berechnet das Hint-Rechteck und den Clientbereich für den Text }
procedure TMyHint. MyCalcHintRect (var ARect: TRect; AHint: string);
var
  iIndex   : integer;
  iColPos   : integer;
  iPos1, iPos2   : integer;
  iColWidth   : integer;
  iMax      : integer;
  s      : string;
  sTemp      : string;
  iTop      : integer;
  iLeft      : integer;
  iRight   : integer;
  MyHintList   : TStringList;
  iMyPos   : integer;
  bIsFertig   : boolean;
begin
  MyHintList   := TStringList. Create;
  try
    {* den Hint zerpflücken, durch den angegebenen Zeilentrenner }
    iMyPos:= Pos (gZeilenUmbruch, AHint);
    if iMyPos > 0 then begin
      bIsFertig:= FALSE;
      repeat
   MyHintList. Add (Copy (AHint, 1, iMyPos-1));
   Delete (AHint, 1, iMyPos);
   iMyPos:= Pos (gZeilenUmbruch, AHint);
   if iMyPos = 0 then begin
     MyHintList. Add (AHint);
     bIsFertig:= TRUE;
   end;
      until bIsFertig;
    end
    else
      MyHintList. Add (AHint);

    if MyHintList. Count = 0 then EXIT;

    Inc (ARect.Left, 2);
    Inc (ARect.Top, 2);

    iTop:= 0;
    iMax:= 0;
    for iIndex:= 0 to MyHintList. Count - 1 do
    begin
      s:= MyHintList [iIndex];

      ARect. Bottom:= iTop + Canvas. Textheight (s) + 4;
      iLeft:= 0;
      iColPos:= Pos ('<@=', s);
      if iColPos > 0 then
      begin
   while iColPos > 0 do
        begin
          iPos1:= iColPos + 3;
          iPos2:= Pos ('@>', s);
          if iPos2 = 0 then EXIT;
          iColWidth:= StrToIntDef (Copy (s, iPos1, iPos2-iPos1), 0);
          if iColWidth = 0 then EXIT;
          sTemp:= Copy (s, 1, iColPos-1);
          Delete (s, 1, iPos2+1);

          iRight:= iLeft+iColWidth;
          iMax:= Max (iMax, iRight);
          ARect. Right:= iMax;
          Canvas. TextRect (ARect, iLeft+2, iTop+2, sTemp);
          iLeft:= iRight;

          iColPos:= Pos ('<@=', s);
          if iColPos = 0 then begin
            iMax:= Max (iMax, iLeft + Canvas. TextWidth (s) + 8);
            ARect. Right:= iMax;
            Canvas. TextRect (ARect, iLeft+2, iTop+2, s);
          end;
        end;
      end
      else begin
        iMax:= Max (iMax, iLeft + Canvas. TextWidth (s) + 8);
        ARect. Right:= iMax;
        Canvas. TextRect (ARect, iLeft+2, iTop+2, s);
      end;
      s:= MyHintList [iIndex];
      iTop:= iTop + Canvas. Textheight(s) + 2;
    end;
  finally
    MyHintList. Free;
  end;
end;

procedure TMyHint. Paint;
var
  R   : TRect;
begin
  {* hier muss nochmal explizit die Farbe des Hints angegeben werden }
  Color   := gMyHintColor;
  {* Text in Hint-ClientRechteck zeichnen }
  R   := ClientRect;
  MyCalcHintRect (R, Caption);
end;

function TMyHint. CalcHintRect (MaxWidth: Integer; const AHint: string; AData: Pointer): TRect;
begin
  {* Hint-Rechteck errechnen }
  Result := Rect (0, 0, 0, 0);
  MyCalcHintRect (Result, AHint);
end;

initialization
  gMyHintColor      := clInfoBk;
  gMyHintFont      := {'Arial'}'';      // wenn leer, dann Standardfont
  gMyHintFontStyle   := [fsBold];
  gMyHintFontSize   := 9;
  gZeilenUmbruch   := ';';

finalization

end.

Viel Spass damit

punker76

[edit=sakura] Doppelpost (wenn auch in anderer Sparte) gelöscht. Mfg, sakura[/edit]
[edit=Chakotay1308]Kleine Korrektur und SourceCode angehangen. Mfg, Chakotay1308[/edit]
[edit=Matze]Code formatiert. Mfg, Matze[/edit]
Angehängte Dateien
Dateityp: zip hintspalten.zip (3,4 KB, 79x aufgerufen)
Jan Karger
Punk's not dead!!!
  Mit Zitat antworten Zitat
Antwort Antwort

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:23 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz