Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Linklabel in einem Stringgrid - Idee gesucht (https://www.delphipraxis.net/68525-linklabel-einem-stringgrid-idee-gesucht.html)

turboPASCAL 1. Mai 2006 08:12


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...)

Hansa 1. Mai 2006 10:05

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.

turboPASCAL 1. Mai 2006 19:34

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.

Martin K 1. Mai 2006 19:40

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.

turboPASCAL 1. Mai 2006 20:03

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: [Tool] iAdressen - Passwortverwaltung

Martin K 1. Mai 2006 20:13

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...

Hawkeye219 1. Mai 2006 20:19

Re: Linklabel in einem Stringgrid - Idee gesucht
 
Man könnte auch das StringGrid für sich arbeiten lassen: Delphi-Referenz durchsuchenMouseToCell.

Gruß Hawkeye

Martin K 1. Mai 2006 20:24

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;

marabu 1. Mai 2006 20:30

Re: Linklabel in einem Stringgrid - Idee gesucht
 
Hallo Hawkeye,

Delphi-Quellcode:
p := ScreenToClient(Mouse.CursorPos);
MouseToCell(p.X, p.Y, iCol, iRow);
sieht irgendwie nach nichts aus - viel zu einfach, oder?

Freundliche Grüße vom marabu

Martin K 1. Mai 2006 20:38

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:
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;
//edit: Code noch etwas übersichtlicher gestaltet.

Martin K 1. Mai 2006 20:42

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

Hawkeye219 1. Mai 2006 20:56

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

marabu 1. Mai 2006 21:08

Re: Linklabel in einem Stringgrid - Idee gesucht
 
Verflixt - habe immer gedacht, das wäre genau der Parameter Rect im Ereignis OnDrawCell().

marabu *zerknirscht ist*

turboPASCAL 1. Mai 2006 21:24

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:

marabu 1. Mai 2006 21:48

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:
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;
Gute Nacht vom marabu


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