![]() |
Linklabel in einem Stringgrid - Idee gesucht
Hi,
Ich möchte gern in einem Stringgrid eine Art Linklabel einbauen. Da ich so ziemlich faul bin ^^, frag ich erst einmal hier in der DP nach ob jemand sowas schon mal gemacht hat oder Codeschnipsel hat. Man muss ja nix neu erfinden wenn es schon erfunden ist. :stupid: Nein ich will keine Komponenten werwenden ala JVCL. (nicht das die schlecht sind...) |
Re: Linklabel in einem Stringgrid - Idee gesucht
Wer zum Teufel soll denn mit dem Begriff "Linklabel" etwas anfangen ? Meine Glaskugel meint lediglich, es könne sich eventuell um einen Hyperlink (abgekürzt "Link") handeln, also einen Verweis auf Internetseite, der im Stringgrid als string angezeigt und per Doppelklick aktiviert werden soll.
|
Re: Linklabel in einem Stringgrid - Idee gesucht
Genau, Linklabel ist also doch Aussagekräftig genug gewesen. ;)
Einfach einen Hyperlink in einem Stringgrid der sich wie ein "normaler" Hyperlink im Browser verhält. OnMouseOver wirs dann unterstrichen und bei OnClick die entspr. Seite per ShelExec oder so... Das Problem ist das ich noch keinen Anfag gefunden habe da ich keine Komponente vom Stringgrid ableiten möchte. |
Re: Linklabel in einem Stringgrid - Idee gesucht
Also grob gesagt:
Du willst ein StringGrid, in jeder Zelle steht irgendein Text (dein Link). Jenachdem auf welche Zelle man dann geklickt hat, wird dann der entsprechende Link per ShellExecute ausgeführt. Nach das kann doch eigentlich nicht so schwer sein, sowas selber zu basteln... //edit: Per OnMouseMove kann man dann ja abfragen auf welcher Zelle man sich grad befindet und per Canvas.Font und Canvas.TextOut kann dann der Text in der Zelle formatiert werden (z.B. blau und unterstrichen) für einen schönen Hover-Effekt. |
Re: Linklabel in einem Stringgrid - Idee gesucht
Hm, eigentlich nicht. Ich komm nicht drauf mit MouseMove die richtige Zelle zu erwischen.
Die Schwierigkeit ist halt das Hover setzen bie Mouseover... Es geht um die Internetadressen für dieses Programm: ![]() |
Re: Linklabel in einem Stringgrid - Idee gesucht
Beim Ereignis OnMouseMove hat du X und Y Position.
Daraus lässt sich dann die Zelle berechnen. Zunächst mal eine Frage vorab: Verwendest Du immer die gleiche Zellenbreite und -höhe oder immer unterschiedliche ? Wenn es immer die gleiche ist müsste es sich mit DefaultRowHeight bzw. DefaultColWidth berechnen lassen. Ansonsten muss du es über RowHeights[i] bzw. ColWidths[i] machen und dann halt alle Zellen von 0 bis i abklappern... |
Re: Linklabel in einem Stringgrid - Idee gesucht
|
Re: Linklabel in einem Stringgrid - Idee gesucht
Hab mal grad was gebastelt:
So erhältst du mit MouseMove deine aktuelle Zelle, in der du grad mit der Mouse bist: Ich denke es ist klar, was Col und Row für Werte liefern!
Delphi-Quellcode:
procedure TForm1.StringGrid1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var i, Row, Col: Integer; begin i := 0; Col := -1; Row := -1; While i <= X do begin Inc(Col); i := i + StringGrid1.ColWidths[Col] +1; end; i := 0; While i <= Y do begin Inc(Row); i := i + StringGrid1.RowHeights[Row] +1; end; Caption := 'Aktuelle Position: '+Inttostr(Col)+', '+Inttostr(Row); end; |
Re: Linklabel in einem Stringgrid - Idee gesucht
Hallo Hawkeye,
Delphi-Quellcode:
sieht irgendwie nach nichts aus - viel zu einfach, oder?
p := ScreenToClient(Mouse.CursorPos);
MouseToCell(p.X, p.Y, iCol, iRow); Freundliche Grüße vom marabu |
Re: Linklabel in einem Stringgrid - Idee gesucht
Hm...
Nur gut das ich grad mit viel Mühe diesen Code gebastelt hab... Aber er funzt auch!!! Ein richtiger Hover-Effekt!!! Okay, zugegeben: Mit MouseToCell ist es wesentlich einfacher.
Delphi-Quellcode:
//edit: Code noch etwas übersichtlicher gestaltet.
procedure TForm1.StringGrid1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var i, j, Row, Col: Integer; begin StringGrid1.Repaint; i := 0; j := 0; Col := -1; Row := -1; While i <= X do begin Inc(Col); i := i + StringGrid1.ColWidths[Col] +1; end; i := i - StringGrid1.ColWidths[Col] +1; While j <= Y do begin Inc(Row); j := j + StringGrid1.RowHeights[Row] +1; end; j := j - StringGrid1.RowHeights[Row] +1; StringGrid1.Canvas.Font.Color := clBlue; StringGrid1.Canvas.Font.Style := StringGrid1.Canvas.Font.Style + [fsUnderline]; StringGrid1.Canvas.TextOut(i, j, StringGrid1.Cells[Col,Row]); end; |
Re: Linklabel in einem Stringgrid - Idee gesucht
@marabu:
Man müsste dann noch für den Hover-Text wieder die X und Y-Position für Canvas.TextOut ermitteln. Da kann man ja nicht einfach die Mouse-Position nehmen, die ändert sich ja ständig und bleibt nicht immer genau in der linken Ecke der Zelle :wink: Bei meinem Code ist das schon mit drin :P Gruß, Martin |
Re: Linklabel in einem Stringgrid - Idee gesucht
@marabu
Siehst du, war doch zu einfach! Du bräuchtest nämlich jetzt eine Funktion, die dir zu iCol und iRow das passende "CellRect" liefert. Gruß Hawkeye |
Re: Linklabel in einem Stringgrid - Idee gesucht
Verflixt - habe immer gedacht, das wäre genau der Parameter Rect im Ereignis OnDrawCell().
marabu *zerknirscht ist* |
Re: Linklabel in einem Stringgrid - Idee gesucht
Huch, da ist mir aber Arbeit abgenommen worden... vor allenm das Nachdenken ;)
Das schöne ist es Hovert schon mal, für den Rest muss ich mir noch was Einfallen lassen, weil die Zeilen unterschiedliche Farben haben... Ein dickes THX. :thumb: |
Re: Linklabel in einem Stringgrid - Idee gesucht
Nur für den Fall, dass jemand unabhängig von der Zelldimensionierung sein möchte - hier noch der Ansatz, auf den ich euch stoßen wollte:
Delphi-Quellcode:
Gute Nacht vom marabu
procedure TDemoForm.SGDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState); var iCol, iRow: Integer; p: TPoint; begin with Sender as TStringGrid do begin DoubleBuffered := true; // hier nur als Hinweis p := ScreenToClient(Mouse.CursorPos); MouseToCell(p.X, p.Y, iCol, iRow); if (iCol = ACol) and (iRow = ARow) then begin if gdSelected in State then Canvas.Font.Color := clHighlightText else Canvas.Font.Color := clHighlight; Canvas.Font.Style := Canvas.Font.Style + [fsUnderline]; end; Canvas.TextOut(Rect.Left + 2, Rect.Top + 2, Cells[ACol, ARow]); end; end; procedure TDemoForm.SGMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin SG.Invalidate; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:50 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