Delphi-PRAXiS
Seite 1 von 2  1 2      

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 VCL für Microsoft-Style URL-Label (https://www.delphipraxis.net/118874-vcl-fuer-microsoft-style-url-label.html)

blackdrake 16. Aug 2008 23:40


VCL für Microsoft-Style URL-Label
 
Hallo.

Ich suche eine freie VCL, die ein URL-Label zur Verfügung stellt.

Folgende Eigenschaften müssen aber vorhanden sein:

1. TabStop setzbar, Enter führt ohne Zusatzcode zum Klickereignis
2. Mauszeiger ist nicht die Delphi-Hand, sondern die Microsoft IE-Hand
3. Die Farbe des Labels soll sich nach Windows richten. (siehe Microsoft-Eigene Dialoge wie z.B. "Automatische Updates" in der Systemsteuerung) ... Anmerkung: Bei meinem System ist die Linkfarbe gleich der clHotLight. Ist das IMMER der Fall?
4. Eigener Code beim Anklicken sollte ausführbar sein (OnClick-Ereignis)

Jemand eine Idee? Vielen Dank.

Gruß
blackdrake

mkinzler 16. Aug 2008 23:48

Re: VCL für Microsoft-Style URL-Label
 
TJvLinkLabel

blackdrake 17. Aug 2008 18:38

Re: VCL für Microsoft-Style URL-Label
 
Hallo.

Vielen Dank für den Hinweis, aber leider haben die URLs bei dieser VCL keine Tabstopps, so wie es bei Microsoft üblich/möglich ist. Andere Ideen?

Gruß
blackdrake

omata 17. Aug 2008 18:48

Re: VCL für Microsoft-Style URL-Label
 
Schonmal hier geschaut. Da ist ja auch der Quellcode bei, vielleicht auf die eigenen Bedürfnisse anpassen?

Daniel 17. Aug 2008 19:22

Re: VCL für Microsoft-Style URL-Label
 
Liste der Anhänge anzeigen (Anzahl: 1)
Moin,

das TLinkLabel aus Delphi 2009. :-)

Zitat:

Zitat von blackdrake
1. TabStop setzbar, Enter führt ohne Zusatzcode zum Klickereignis

Geprüft, geht. :-)

Zitat:

Zitat von blackdrake
2. Mauszeiger ist nicht die Delphi-Hand, sondern die Microsoft IE-Hand

Geprüft, geht. :-)
(Mein Screen-Capture-Programm hat hier einen falschen (!) Cursor eingesetzt. Es ist die IE-typische Hand.)

Zitat:

Zitat von blackdrake
3. Die Farbe des Labels soll sich nach Windows richten. (siehe Microsoft-Eigene Dialoge wie z.B. "Automatische Updates" in der Systemsteuerung) ... Anmerkung: Bei meinem System ist die Linkfarbe gleich der clHotLight. Ist das IMMER der Fall?

Dafür gibt es die Eigenschaft "UseVisualStyle" - mein Windows ist nun mit den Standard-Farben bestückt, aber ich rechne damit, dass individuelle Einstellungen berücksichtigt werden.

Zitat:

Zitat von blackdrake
4. Eigener Code beim Anklicken sollte ausführbar sein (OnClick-Ereignis)

Ja gibt es.

blackdrake 17. Aug 2008 20:23

Re: VCL für Microsoft-Style URL-Label
 
Die Info bringt mir leider nichts. Ich bin aufgrund von OpenSource an Turbo Delphi 2006 gebunden.

Die ganzen VCLs von Torry.net müsste ich mir mal anschauen. Ich befürchte aber, das noch niemand auf die Idee mit den TabStopps gekommen ist.

Kannst du mir vielleicht verraten, wie man ein TabStopp bei einem Label realisiert? Die Windows API müsste ja irgendwie dann einen Rahmen um das Label setzen...

Gruß
blackdrake

omata 17. Aug 2008 20:28

Re: VCL für Microsoft-Style URL-Label
 
Was spricht den gegen die Komponente von Daniel?

Du kannst sie doch auch selber einbinden, die muss nicht in die IDE integriert werden.

Ich verstehe da nicht das Problem, die scheint ja genau das zu machen was du willst.


UPPPPPS, ist ja nur ein Bild, sorry.

mkinzler 17. Aug 2008 20:29

Re: VCL für Microsoft-Style URL-Label
 
Zitat:

Die Info bringt mir leider nichts. Ich bin aufgrund von OpenSource an Turbo Delphi 2006 gebunden.
Ich glaube nicht das CG dir bei D2009 verbieten wird OpenSource-Programme zu entwickeln

omata 17. Aug 2008 20:31

Re: VCL für Microsoft-Style URL-Label
 
Kann mir mal einer zeigen wie man mit dem TJvLinkLabel einen Link realisiert. Ich bin einfach zu blöd dafür.

blackdrake 17. Aug 2008 20:34

Re: VCL für Microsoft-Style URL-Label
 
a) Wenn ich eine D2009 VCL verwende, kann sie in älteren Delphi-Versionen nicht verwendet werden
b) Sowohl ich als auch die anderen Entwickler müssen D2009 besitzen, um den Quelltext überhaupt betrachten zu können. Ich pflege eine D4 oder max. D6 Kompatibilität zu behalten, wenn es geht.
c) Turbo-Delphi ist kostenlos und deswegen ziehe ich eine Quelltextkompatibilität sehr stark vor, damit andere (sagen wir mal angehende) Entwickler meinen Quelltext betrachten können, ohne ein Delphi kaufen zu müssen.

Daher verwende ich generell nur Drittanbieter-VCLs, die ich dynamisch einbinden kann und frei erhältlich sind.

Das ist das (mein) Problem bei OpenSource.

// Add: Außerdem kann ich nicht bis D2009 warten, selbst wenn ich die Kohle dafür zahlen wollte


@omata: Du verwendest einfach:

LnkLabel.Caption := '<link>Text</link> blabla';
LnkLabel.OnLinkClick := ...;


Gruß
blackdrake

grenzgaenger 17. Aug 2008 23:26

Re: VCL für Microsoft-Style URL-Label
 
müsstest halt TJvLinkLabel noch mit 'n tapstopp aufbohren...

link, funktioniert, den cursor kannste selbst einstellen ...

PS: das label ist aus der JVCL

PPS: 'n link, so

Delphi-Quellcode:
jvlinklabel1.caption := '<link>http://test</link> test';

blackdrake 17. Aug 2008 23:44

Re: VCL für Microsoft-Style URL-Label
 
Zitat:

Zitat von grenzgaenger
müsstest halt TJvLinkLabel noch mit 'n tapstopp aufbohren...

Ich glaub das ist einfacher gesagt, als getan.

Angenommen, es wäre ein einziges Label, dann könnte ich ja mal schauen, wie ich das TabStopp reinbekomme (ich denke aber, dass hier auch die WinAPI wegen dem Zeichnen des gestrichelten Kastens mithelfen muss). Leider habe ich auch noch sehr wenig Erfahrung mit VCLs und der API. Hier kommt aber das große Problem hinzu, dass dieses Label verschiedene Links aufnehmen kann ("<link>Link A</link, Text, <link>Link B</link>"). Folglich müsste das Hinzufügen einer TabStopp-Funktionalität auch das Wechseln zwischen diversen Linkhervorhebungen beeinhalten (omg, wie geht das :( )

Gruß
blackdrake

blackdrake 18. Aug 2008 22:49

Re: VCL für Microsoft-Style URL-Label
 
Ich habe mir mal 10 VCLs heruntergeladen. Einige wollten sich mal wie immer nicht installieren lassen, da irgendwelche DCU's nicht vorhanden waren, aber ich habe die einfache Variante genommen: Ich habe alle PAS-Dateien nach "TabStop" durchsucht - und nichts gefunden. Folglich unterstützt keine der VCLs die gewünschte Eigenschaft.

Das Nachträglich hinzufügen scheint auch extrem kompliziert zu sein.

Die Vererbung des TLabels ist:
TLabel - TCustomLabel - TGraphicControl - TControl

Die Vererbung des TButtons* ist:
TButton* - TButtonControl* - TWinControl* - TControl

* = Enthält TabStop/TabOrder.

Folglich müsste das Hinzufügen von TabStop/TabOrder für ein TLabel ein übelster Umstand sein, da der einzigste gemeinsame Vorfahre von TButton und TLabel TControl ist, welches selbst aber keine TabStopps hat -> kein Erwerben von TabStopps mit reiner Vererbung möglich.

Oh man, ist denn noch niemand auf die Idee gekommen, ein Label als URL getarnt, mit einem Tab anzusteuern? Bei Microsoft ist das schon seit 2002 üblich. Und Google gibt keine Tipps für Delphi zu diesem Thema. :(

Gruß
blackdrake

grenzgaenger 18. Aug 2008 23:08

Re: VCL für Microsoft-Style URL-Label
 
da bist wohl der erste, der so etwas braucht... ich wüsst keinen grund, warum ein label einen tabstop nehmen soll...

aber dann hast du die ehre so etwas zu zaubern ... :-)

erst mal den label 'n handle beibringen... dann 'n tabstopp und schliesslich die richtige reihenfolge setzen lassen ... :-)

viel spass und vergnügen :-)

blackdrake 18. Aug 2008 23:15

Re: VCL für Microsoft-Style URL-Label
 
Zitat:

Zitat von grenzgaenger
da bist wohl der erste, der so etwas braucht... ich wüsst keinen grund, warum ein label einen tabstop nehmen soll...

Bei modernen Dialogen mit URL-Labels sollte man korrekte Farben, korrekten Mauszeiger und die TabStopps eben vorziehen. Leider habe ich von der VCL-Entwicklung kaum Ahnung, weswegen ich das mit den Handles auch kaum verstehe. Ich werd aber trotzdem mal schauen.

Wenn das Label eben eine wichtige Funktion hat, dann muss es auch über die Tastatur ansteuerbar sein (siehe Microsoft-Eigene-Dialoge). Alles andere ist Müll.

Bei Microsoft-Produkten gibts so feine Sachen schon sei Jahr und Tag und man muss sich nicht mit so einem Zeug rumstressen. Und bei Delphi kommen die ganzen wichtigen Dinge (64 Bit, Unicode, moderne VCLs) erst mit Version 2009.

Michael Habbe 18. Aug 2008 23:19

Re: VCL für Microsoft-Style URL-Label
 
Hi.

Zur Not erstellst Du es Dir selbst.
Ich würde ungefähr so vorgehen:

- TLinkEdit (oder so) von TEdit ableiten.
- ReadOnly setzen
- Flach
- 3D aus
- weisser Hintergrund abschalten bzw. Farbe nach Parent
- OnClick Link öffnen
- nach Tab mit Enter auf KeyPress/Down Link öffnen
- OnMouseMove Cursor setzen

Wenn es fertig ist, hier aber bitte auch präsentieren.


mfg
Michael

omata 18. Aug 2008 23:37

Re: VCL für Microsoft-Style URL-Label
 
Die Idee hatte ich auch schon. Was machst du mit der Markierungsmöglichkeit? Ist dieses Hervorheben ok?

grenzgaenger 18. Aug 2008 23:53

Re: VCL für Microsoft-Style URL-Label
 
Zitat:

Zitat von blackdrake
Zitat:

Zitat von grenzgaenger
da bist wohl der erste, der so etwas braucht... ich wüsst keinen grund, warum ein label einen tabstop nehmen soll...

Bei modernen Dialogen mit URL-Labels sollte man korrekte Farben, korrekten Mauszeiger und die TabStopps eben vorziehen. Leider habe ich von der VCL-Entwicklung kaum Ahnung, weswegen ich das mit den Handles auch kaum verstehe. Ich werd aber trotzdem mal schauen.

Wenn das Label eben eine wichtige Funktion hat, dann muss es auch über die Tastatur ansteuerbar sein (siehe Microsoft-Eigene-Dialoge). Alles andere ist Müll.

Bei Microsoft-Produkten gibts so feine Sachen schon sei Jahr und Tag und man muss sich nicht mit so einem Zeug rumstressen. Und bei Delphi kommen die ganzen wichtigen Dinge (64 Bit, Unicode, moderne VCLs) erst mit Version 2009.

wüsste nicht, wofür man das braucht ... aber egal. das handle brauchst du, um dir mit 'n tabstopp setzen zu können. du hast es richtig erkannt, das handle und der tabstopp wird mit TWinControl eingeführt... entweder du bastelst dir die beiden routinen kurz nach, leitest dir dein neues label von tWincontrol ab... oder bastelst 'n edit um ... ;-)

noch viel erfolg und spass dabei ...
GG

omata 19. Aug 2008 06:36

Re: VCL für Microsoft-Style URL-Label
 
Anhang scheint keinen zu interessieren, egal.

hitzi 19. Aug 2008 08:29

Re: VCL für Microsoft-Style URL-Label
 
Seit wann ist das Control TStaticLabel bei Delphi dabei? Das hätte auch die Möglichkeit fokussiert zu werden.

Assertor 19. Aug 2008 09:57

Re: VCL für Microsoft-Style URL-Label
 
Hi Daniel,

Zitat:

Zitat von Daniel
das TLinkLabel aus Delphi 2009. :-)

Wenn das TLinkLabel aus D2009 auf WC_LINK / SysLink aus der ComCtl32.dll v6 aufbauen würde, funktioniert das erst ab XP. Unter W2K hätte es den Static Look - also keinerlei Linkfunktion. Aber das werden wir ja dann sehen...

Gruß Assertor

blackdrake 20. Aug 2008 14:48

Re: VCL für Microsoft-Style URL-Label
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo.

Am liebsten wäre mir ja eine "professionelle" TLinkLabel Komponente, die exakt das selbe Ergebnis liefert wie Windows (API?). Aber ich glaube, da in der VCL ja sowieso meist alles Eigenentwicklungen sind, ist das eine Utopie.

@Assertor / @Daniel: Ja, es wäre sehr interessant zu wissen, ob diese Link-Komponente von D2009 XP erfordern wird oder nicht. Wenn es auch mit Windows 2000 funktionieren würde, wäre es die Non-Plus-Ultra-Lösung.

@Michael Habbe: Von der Idee halte ich leider nichts. Eine TEdit Komponente handelt den Focus anderst. Es gibt zum einen einen Text-Tastaturcursor, zum anderen sind Tastenkombinationen wie Strg+A möglich etc.

@omata: Vielen Dank für dieses Beispiel. Ich bin gerade dabei, es mir anzuschauen und zu begreifen.

Derzeit sehe ich aber in deinem Beispiel folgende Probleme:
1. Wenn das Label den Focus hat, dann erscheint es in fetter Schrift (liegt das an meiner ClearType-Schriftartenglättung?) Ich finde aber keine override-Eigenschaft, die Code ausführt, wenn das Label den Focus erhält. Ich weiß echt nicht, was hier los ist.
2. Der Focus-Rahmen ist nicht korrekt um den Link positioniert. Abstände vor und hinter dem Link sind mir etwas zu groß.
3. Die Strichellinien um den fokusierten Link sind zu breit. Windows strichelt ein Focus'ed Item mit 1-1 Pixel Strichen.
4. Die Link-Standardfarben sollten verwendet werden. Ich glaube, dass (siehe Post 1) die Standardfarbe für einen Link innerhalb eines Windows-Dialoges clHotLight ist.
5. Links natürlich standardgemäß unterstreichen.

Außerdem würde ich mir einen Microsoft-Hand-Cursor wünschen (natürlich über die API, nicht als fest eingebundene statische Ressource) - leider finde ich in DP und Google nichts dergleichen. (Schlagwörter: Hand Cursor, Windows Hand Cursor, IE-Cursor, IDC_Hand, Microsoft Hand Cursor)

Ich würde gerne ein Spin-Off von deiner VCL machen, in der ich zum einen die Probleme behebe und eventuell den Microsoft-Cursor-Support aktiviere.

Außerdem möchte ich eine VCL mit weniger Umfang erstellen, die nur 1 Link enthält.

Sprich:
- 1 Label = 1 Link
- Keine "<link>" und "</link>"
- Folglich nur 1 möglicher Linkfokus, der dem Labelfokus entspricht
- Folglich keine Focuswechsel mit Pfeiltasten etc.

Mal gucken, ob ich das hinbekomme. Der Quellcode ist mir im Moment noch ein Rätsel.

Gruß
blackdrake

blackdrake 20. Aug 2008 18:39

Re: VCL für Microsoft-Style URL-Label
 
Ich habe folgendes nun nach langer Arbeit hinbekommen:

Im Header sind ToDo-Einträge gelistet. Hier habe ich noch einige Probleme... Bitte schreibt mir, wenn ihr weiter wisst!

Delphi-Quellcode:
{
  TSingleLinkLabel
  (c) 2008 Daniel Marschall / ViaThinkSoft

  Original code and partitions
  (c) 2008 by omata (Thorsten) - [url]http://www.delphipraxis.net[/url]
}

// ToDo
// + AutoSize
// + Transparent
// + ParentColor
// + ParentFont
// (+ Sonstige Eigenschaften von echten Labels)
// Enabled=False * Schrift wird nicht grau
//                * Das nächste Item bekommt nicht den Focus
// Microsoft Hand-Cursor

unit SingleLinkLabel;

interface

uses Windows, Controls, Classes, Graphics, SysUtils;

type
  TSingleLinkLabel = class(TCustomControl)
  private
    FLines:TStringList;
    function GetCaption: string;
    procedure SetCaption(const Value: string);
  protected
    procedure Paint; override;
    procedure DoEnter; override;
    procedure DoExit; override;
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
      X, Y: Integer); override;
    procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
    procedure KeyDown(var Key: Word; Shift: TShiftState); override;
    procedure Resize; override;
  published
    property OnClick;
    property Font;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    property Caption:string read GetCaption write SetCaption;
  end;

implementation

{ TSingleLinkLabel }

constructor TSingleLinkLabel.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FLines := TStringList.Create;
  Width := 65;
  Height := 17;
  TabStop := True;

  Font.Color := clHotLight;
  Font.Style := [fsUnderline];
end;

destructor TSingleLinkLabel.Destroy;
begin
  FLines.free;
  inherited;
end;

procedure TSingleLinkLabel.DoEnter;
begin
  inherited;
  Paint;
end;

procedure TSingleLinkLabel.DoExit;
begin
  inherited;
  Paint;
end;

function TSingleLinkLabel.GetCaption: string;
begin
  Result := FLines.Text;
end;

procedure TSingleLinkLabel.KeyDown(var Key: Word; Shift: TShiftState);
begin
  inherited;

  if Key = 13 then Click;
end;

procedure TSingleLinkLabel.MouseDown(Button: TMouseButton; Shift: TShiftState;
  X, Y: Integer);
begin
  inherited;
  SetFocus;
end;

procedure TSingleLinkLabel.MouseMove(Shift: TShiftState; X, Y: Integer);
begin
  inherited;
  Cursor := crHandPoint;
end;

procedure TSingleLinkLabel.Paint;
var
  i: integer;
begin
  inherited;

  Canvas.Font := Font;

  Canvas.Brush.Color := clBtnFace;
  Canvas.Brush.Style := bsSolid;
  Canvas.FillRect(Canvas.ClipRect);

  for i := 0 to FLines.Count - 1 do
  begin
    Canvas.TextOut(0, Canvas.TextHeight('X')*i, FLines.Strings[i]);
  end;

  if Focused then Canvas.DrawFocusRect(Canvas.ClipRect);
end;

procedure TSingleLinkLabel.Resize;
begin
  inherited;
  SetCaption(Caption);
  Paint;
end;

procedure TSingleLinkLabel.SetCaption(const Value: string);
begin
  FLines.Text := Value;

  Paint;
end;

end.
Gruß
blackdrake

blackdrake 21. Aug 2008 12:27

Re: VCL für Microsoft-Style URL-Label
 
Oh mann, die oben gepostete VCL - deren Ableitung mich viel Zeit gekostet hat - ist nach einiger Überlegung doch totaler Müll. Sie hat zwar einen Fokus und TabStopps, ist aber super-primitiv und verhält sich absolut nicht wie ein TLabel (z.B. beim Deaktivieren). Hinzu kommt, dass ich alle Properties und die Reaktion auf deren Zustände nachmachen müsste (Ich müsste das Rad "TLabel" neu erfinden!).
Ist es denn nicht einfach, ein TLabel abzuleiten und ihm ein TabStopp zu geben? Ich habe leider von diesem ganzen Zeug überhaupt keine Ahnung und weiß nicht einmal, was ein Handle/DC/HDC/HWND/etc überhaupt ist und wie man damit umgeht (es definiert etc) :( :(

blackdrake 22. Aug 2008 00:10

Re: VCL für Microsoft-Style URL-Label
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich sitze jetzt hier schon seit Tagen daran, mit dem Erstellen einer solchen VCL herumzuexperimentieren und niemand hilft mir...

Jetzt habe ich folgenden Plan versucht:

Eine Klasse von TLabel ableiten und diese Klasse erzeugt ein Tab-Objekt, das über das Label gelegt wird. Dieses Tab-Object ist eine Klasse, die vom TCustomControl (enthält TabStop) abgeleitet ist, aber Transparent sein muss.

Im Moment sieht das so aus:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, jpeg, ExtCtrls, Buttons;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Button1: TButton;
    Image1: TImage;
    procedure Button1Click(Sender: TObject);
  end;

  // FUNKTIONIERT NICHT!!! DAS TEIL IST NICHT DURCHSICHTIG!!!
  TTransparentCustomControl = class(TCustomControl)
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  end;

  TTabElement = class(TTransparentCustomControl)
  protected
    procedure Paint; override;
    procedure DoEnter; override;
    procedure DoExit; override;
  public
    constructor Create(AOwner: TComponent); override;
  end;

  TSingleLinkLabel = class(TLabel)
  protected
    procedure Paint; override;
  private
    FTabElement: TTabElement;
  public
    procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer); override;
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  end;

var
  Form1: TForm1;

implementation

{uses
  Themes;}

{$R *.dfm}

{ TTransparentCustomControl }

procedure TTransparentCustomControl.CreateParams(var Params: TCreateParams);
begin
  // Transparenz herstellen
  // [url]http://www.coding-board.de/board/showpost.php?p=25336&postcount=7[/url]

  // Problem: Die Transparenz funktioniert nicht! Es wird nur die
  // Formhintergrundfarbe übernommen. Das dahinterliegende Label ist
  // verdeckt!

  // ToDo: Transparenz des TSingleLinkLabel anzapfen

  inherited CreateParams(Params);
  Params.ExStyle := Params.ExStyle+WS_EX_Transparent;
  ControlStyle := ControlStyle-[csOpaque]+[csAcceptsControls];
end;

{ TTabElement }

procedure TTabElement.Paint;
begin
  inherited;

  if Focused then
  begin
    Canvas.DrawFocusRect(Canvas.ClipRect);
  end;

  Repaint;
end;

constructor TTabElement.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);

  Parent := AOwner as TWinControl;
  DoubleBuffered := true;
  TabStop := True;

  // ToDo: Transparent, Click -> FocusGet, Enter=ClickNotify

  {if ThemeServices.ThemesEnabled then
    ControlStyle := ControlStyle - [csOpaque]
  else
    ControlStyle := ControlStyle + [csOpaque];}
end;

procedure TTabElement.DoEnter;
begin
  inherited;
  Paint;
end;

procedure TTabElement.DoExit;
begin
  inherited;
  Paint;
end;

{ TSingleLinkLabel }

procedure TSingleLinkLabel.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
begin
  inherited;

  FTabElement.Left := ALeft;
  FTabElement.Top := ATop;
  FTabElement.Width := AWidth;
  FTabElement.Height := AHeight;
end;

constructor TSingleLinkLabel.Create(AOwner: TComponent);
begin
  FTabElement := TTabElement.Create(AOwner);
  FTabElement.Parent := AOwner as TWinControl;

  inherited Create(FTabElement);
  Parent := FTabElement as TWinControl;

  Font.Color := clHotLight;
  Font.Style := [fsUnderline];

  Cursor := crHandPoint; // ToDo: Microsoft-Hand verwenden
end;

procedure TSingleLinkLabel.Paint;
begin
  inherited;
end;

destructor TSingleLinkLabel.Destroy;
begin
  // FTabElement.Free; // EXCEPTION

  inherited;
end;

{ Testform }

procedure TForm1.Button1Click(Sender: TObject);
var
  x: TSingleLinkLabel;
begin
  x := TSingleLinkLabel.Create(self);
  x.Parent := form1;

  x.AutoSize := true;
  x.Caption := 'Dies ist ein Label ... als Link';
  x.Top := 10;
  x.Left := 20;
end;

end.
TSingleLinkLabel ist ein Label, das beim Erstellen ein TTabElement über das Label legt.

TTabElement hat die einzige Aufgabe, lediglich einen Rahmen zu zeichnen, sobald es den Fokus hat!

Aber: Großes Problem besteht bei der Transparenz! Ich bekomme TCustomControl nicht transparent, weswegen in meinem Beispiel das Label unter dem TTabElement verschwindet und somit unsichtbar ist.

Bitte helft mir doch endlich mal! Ich habe so wenig Ahnung von Vererbung und VCL und hocke hier jetzt schon seit 1 Woche an diesem Zeug, was eigentlich vollkommen trivial ist! :(

Gruß
blackdrake

hitzi 22. Aug 2008 07:34

Re: VCL für Microsoft-Style URL-Label
 
Zitat:

Zitat von blackdrake
Ich sitze jetzt hier schon seit Tagen daran, mit dem Erstellen einer solchen VCL herumzuexperimentieren und niemand hilft mir...
[...]
Bitte helft mir doch endlich mal!

Ähmm ... wieso hat der Thread hier dann schon zwei Seiten. Über fehlende Hilfe würde ich mich da nicht beklagen!

Zitat:

Zitat von blackdrake
Ich habe so wenig Ahnung von Vererbung und VCL und hocke hier jetzt schon seit 1 Woche an diesem Zeug, was eigentlich vollkommen trivial ist! :(

Wenn du keine Ahnung hast, woher weißt du dann, dass es "vollkommen trivial" ist? Meinst du nicht auch, dass bei einem einfachen Problem, entweder die Lösung schon hier im Forum stehen würde oder mit dir hier schon erarbeitet wäre?

Wegen deiner Transparenz: http://delphi.newswhat.com/geoxml/fo...ps.borland.com

DeddyH 22. Aug 2008 08:08

Re: VCL für Microsoft-Style URL-Label
 
Zitat:

Transparency with TWincontrols on arbitrary containers is next to impossible
to achieve.
Diese Erfahrung habe ich auch schon schmerzhaft machen müssen. Eine Lösung wäre, von TGraphicControl abzuleiten und ein Pseudohandle für die Botschaftsbehandlung anzufordern (AllocateHwnd).

blackdrake 22. Aug 2008 13:17

Re: VCL für Microsoft-Style URL-Label
 
Hallo.

Das Problem, was ich sehe, (wieso ich vorsichtig sage, dass ich - bei dieser Problematik - kaum Hilfe erhalte) ist, dass ich mit den meisten Hinweisen nichts anfangen kann. Wenn jemand schreibt, es wäre doch sehr einfach, ein TLabel abzuleiten und einfach ein Handle zu setzen und dieses mit TabStop-Methoden zu versehen, dann bringt mir das leider nichts.

Schade, dass mein Anlauf von Gestern scheinbar nicht funktionieren wird. Wenn ich das TTabElement nicht transparent bekomme, wird meine Idee vom TLabel+TTabElement-Hybrid nicht funktionieren. Schade, dann muss ich weiter versuchen.

Ich versuche ja sehr, alle Hinweise zu befolgen und versuche auch viel selbst, bevor ich hier frage. Aber wie gesagt habe ich von Handles etc. absolut keine Ahnung und habe Delphi auch (noch) nicht professionell erlernt, sondern alles autonom erfahren. Ich kann auch schlecht beurteilen, ob es nun tatsächlich trivial ist, ein TLabel mit TabStops zu versehen, oder nicht, aber unmöglich kann es ja irgendwie nicht sein. Schade, dass mir niemand einen Codebrocken zuspielt, mit dem ich was richtiges anfangen kann. (soll nicht heißen, ich will sofort eine perfekte Lösung)

@DeddyH: Ich werde mal versuchen, etwas über AllocateHwnd() herauszufinden. Ich habe aber absolut keine Ahnung, wie ich das mit den Tabs handhaben soll.

Ich habe ja ebenfalls auch versucht, einfach ein TLabel abzuleiten und die Tab-Eigenschaften/Methoden einfach per Copy&Paste von TWinControl abzuschreiben. Das funktioniert aber nicht! Innerhalb von TWinControl gibt es eine "FTabList: TList", in der scheinbar alle Tab-Reihenfolgen gespeichert sind. Folglich kann ich hier ja gar nicht eingreifen, da TLabel mit TWinControl absolut nichts zu tun hat, da es kein Vorfahre ist. Außerdem arbeiten diverse Methoden nur mit TWinControl-Objekten und deren Derivaten, zu denen TLabel und TMeinLabel=class(TLabel) nicht zählen.

Gruß
blackdrake

bigg 22. Aug 2008 13:27

Re: VCL für Microsoft-Style URL-Label
 
omata hat doch gezeigt, wie es geht! Wenn du die Hilfe anderer nicht annimmst, brauchst du dich auch nicht zu beklagen.

DeddyH 22. Aug 2008 13:31

Re: VCL für Microsoft-Style URL-Label
 
Zu AllocateHWnd kannst Du Dir ja mal den Source von TTimer ansehen.

blackdrake 22. Aug 2008 13:33

Re: VCL für Microsoft-Style URL-Label
 
Zitat:

Zitat von bigg
omata hat doch gezeigt, wie es geht! Wenn du die Hilfe anderer nicht annimmst, brauchst du dich auch nicht zu beklagen.

Stimmt doch gar nicht. Ich nehme jede Hilfe gerne an und freue mich über Beiträge. Ich habe mich mit dem Beispiel von omata lange beschäftigt und auch einiges daraus gelernt. (Siehe mein darauffolgender Beitrag, in dem ich die Komponente von omata abgeleitet, etwas verbessert und vereinfacht habe!)

Das Problem war aber, dass omata's Beispiel zwar auf den ersten Blick wie ein Label aussieht, aber die properties des TLabel nicht besitzt sowie nicht erkennbar deaktivierbar ist. Sollte ich keine bessere Lösung (= direkte Ableitung von TLabel) erhalten, müsste ich omatas Beispiel noch einmal aufrollen und Canvas.Textout komplett mit einem integrierten TLabel ersetzen, das alle Eigenschaften von der Elternklasse annimmt und ständig abgleicht.

Zitat:

Zitat von DeddyH
Zu AllocateHWnd kannst Du Dir ja mal den Source von TTimer ansehen.

Danke für die Info. Ich schaue mir das jetzt alles einmal an und sammle Informationen.

Angenommen, ich bekomme es hin, ein TLabel abzuleiten und ihm ein Handle zu geben (ohne dass der PC in Flammen aufgeht) - wie gehe ich danach vor? Wie wird aus einem TLabel mit Handle ein Control-Element, das per Tab-Taste angewählt werden kann?

Gruß
blackdrake

DeddyH 22. Aug 2008 13:38

Re: VCL für Microsoft-Style URL-Label
 
Je nach Message, die dein "Pseudo-Handle" bekommt, führst Du die entsprechende Routine aus, sofern nötig. Das Prinzip wird z.B. hier kurz erklärt.

blackdrake 22. Aug 2008 13:46

Re: VCL für Microsoft-Style URL-Label
 
Hallo.

Zitat:

Zitat von DeddyH
Je nach Message, die dein "Pseudo-Handle" bekommt, führst Du die entsprechende Routine aus, sofern nötig. Das Prinzip wird z.B. hier kurz erklärt.

Ja, das kann ich mir vorstellen, dass mein TMeinLabel eine Message erhält (CM_FocusChanged?). Wenn ich das alles gelöst hätte, dann könnte ich das Canvas.DrawFocusRect() ausführen, sofern der Focus vorhanden ist. Andernfalls, den Fokusrahmen wieder entfernen.

Das Problem sehe ich aber in der TabOrder und deren Verwaltung! Die Tab-Order-List befindet sich meines Wissens in TWinControl. Dort wird doch alles reguliert, sodass jedes TWinControl ein eigenes und korrektes TabOrder erhält, die TabOrder bei einer Änderung neu berechnet werden sowie bei einem Tab-Tastendruck das richtige Element gewählt wird.

Es sollte ja möglich sein, dass die TabOrder bestehend aus einem TButton, einem TMeinLabel und einem TEdit besteht. Hier ist aber das Problem, dass TMeinLabel kein TWinControl-Nachkomme ist.

Da mein TMeinLabel also ein absoluter "außenseiter" ist und mit TWinControl nichts zu tun hat (da kein Nachkomme) - kann ich dann überhaupt korrekt mit TabStops arbeiten? Da hab ich im Moment eine Denkblockade.

Gruß
blackdrake

DeddyH 22. Aug 2008 14:02

Re: VCL für Microsoft-Style URL-Label
 
Mit AllocateHwnd bekommst Du doch ein Fensterhandle geliefert, wenn ich das richtig verstanden habe. Dieses muss dann noch den Stil WS_TABSTOP bekommen (zur Not über SetWindowLong) und es sollte klappen. Zur Not probier ich das heute Abend mal selbst aus, im Moment kann ich das gerade nicht.

blackdrake 22. Aug 2008 16:23

Re: VCL für Microsoft-Style URL-Label
 
Hallo.

Ich habe jetzt 2 Dinge Probiert.

Versuch A (von mir bevorzugt):

TLabel ableiten, ein Handle versehen und versuchen, TabStopps setzen zu können.

Problem:
- TabOrder Problematik?
- EACCESS-VIOLATION im Message-Handler

Delphi-Quellcode:
type
  tx = class(TLabel)
  private
    FWindowHandle: HWND;
  protected
    procedure WndProc(var Msg: TMessage); override;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  end;

procedure tx.WndProc(var Msg: TMessage);
var
  Handled: Boolean;
begin
  inherited;

  Handled := True;
  case Msg.Msg of
    WM_DESTROY: ; // ToDo
    else
      Handled := False;
  end;
  if Handled then
    Msg.Result := 0
  else
    Msg.Result := DefWindowProc(FWindowHandle, Msg.Msg, Msg.WParam, Msg.LParam); // EXCEPTION EACCESSVIOLATION (bei Msg.Msg = 71)
end;

constructor tx.Create(AOwner: TComponent);
var
  Style: LongInt;
begin
  inherited Create(AOwner);

{$IFDEF MSWINDOWS}
  FWindowHandle := Classes.AllocateHWnd(WndProc);
{$ENDIF}
{$IFDEF LINUX}
  FWindowHandle := WinUtils.AllocateHWnd(WndProc);
{$ENDIF}

  Style := GetWindowLong(FWindowHandle, GWL_STYLE);
  SetWindowLong(FWindowHandle, GWL_STYLE, Style and WS_TABSTOP);
end;

destructor tx.Destroy;
begin
{$IFDEF MSWINDOWS}
  Classes.DeallocateHWnd(FWindowHandle);
{$ENDIF}
{$IFDEF LINUX}
  WinUtils.DeallocateHWnd(FWindowHandle);
{$ENDIF}

  inherited Destroy;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  x: tx;
begin
  x := tx.Create(self);
  x.Parent := self;

  x.Left := 10;
  x.Top := 10;
  x.Height := 10;
  x.Width := 10;

  x.Visible := true;

  x.Caption := 'Der Versuch eines Labels...';
end;
Versuch B:

Problem:
- Das StaticLabel ist nicht Transparent.
- Das Canvas, das das DrawFocusRect() zeichnen soll, flackert.
- Wird das Control überdeckt, verliert es seine grafischen Informationen. (Ich habe schon versucht, eine TPaintBox als Objekt in die VCL zu integrieren)
- Problem mit dem Focus-Rect anzeigen/löschen

Delphi-Quellcode:
type
  TS = class(TStaticText)
  private
    FCanvas: TCanvas;
    procedure CMFocusChanged(var Message: TCMFocusChanged); message CM_FOCUSCHANGED;
    procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
  protected
    procedure Paint;
    property Canvas: TCanvas read FCanvas;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  end;

procedure ts.WMPaint(var Message: TWMPaint);
begin
  Paint;
end;

procedure ts.CMFocusChanged(var Message: TCMFocusChanged);
begin
  inherited;
  Paint;
end;

procedure ts.Paint;
begin
  inherited;
 
  if Focused then
  begin
    Canvas.DrawFocusRect(Canvas.ClipRect);
  end;

  Repaint;
end;

constructor ts.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FCanvas := TControlCanvas.Create;
  TControlCanvas(FCanvas).Control := Self;

//  DoubleBuffered := true;
end;

destructor ts.Destroy;
begin
  FCanvas.Free;
  inherited Destroy;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  x: ts;
begin
  x := ts.Create(form1);
  x.Parent := form1;

  x.Left := StaticText1.Left;
  x.Top := StaticText1.Top+40;
  x.Height := StaticText1.Height;
  x.Width := StaticText1.Width;
  x.Caption := StaticText1.Caption;
  x.TabStop := true;
end;
Gruß
blackdrake

DeddyH 22. Aug 2008 16:26

Re: VCL für Microsoft-Style URL-Label
 
Zitat:

Delphi-Quellcode:
SetWindowLong(FWindowHandle, GWL_STYLE, Style and WS_TABSTOP);

Nicht and, sondern or. So wie oben hat das Fenster wahrscheinlich überhaupt keinen Style mehr.

blackdrake 22. Aug 2008 20:10

Re: VCL für Microsoft-Style URL-Label
 
Hallo.

Danke für die Info. Habe ich behoben. Es kommt aber weiterhin eine EAccessViolation in user32.dll.

Anmerkung: Fehler kommt auch, wenn ich GetWindowLong/SetWindowLong testweise auskommentiere.

Gruß
blackdrake

grenzgaenger 22. Aug 2008 22:44

Re: VCL für Microsoft-Style URL-Label
 
hast du denn die msg 71 (CM_SETACTIVECONTROL) implementiert?

blackdrake 22. Aug 2008 22:47

Re: VCL für Microsoft-Style URL-Label
 
Ach, 71 = CM_SETACTIVECONTROL. Ich hatte schon recherchiert unter "Message 71", aber keine Liste gefunden. Von CM_SETACTIVECONTROL habe ich bisher noch nichts gehört. Muss ich damit irgendwas machen? Klingt, als ob nur Buttons o.ä. VCLs diese Message benötigen, oder? Ich find es irgendwie komisch, dass es zu einer Exception kommt, obwohl ich einen allgemein gültigen Code zur Message-Abarbeitung verwende. Was muss ich verändern?

PS: Die Erklärung http://docs.codegear.com/docs/radstu...VECONTROL.html "Das ist die Konstante Controls.CM_SETACTIVECONTROL." ist ja irgendwie ein Klassiker - brilliant Formuliert und verständlich :wink:

grenzgaenger 22. Aug 2008 22:55

Re: VCL für Microsoft-Style URL-Label
 
kann aber auch

{$EXTERNALSYM WM_WINDOWPOSCHANGED}
WM_WINDOWPOSCHANGED = $0047;

sein, je nachdem was du angegegeben hast und welches zahlensystem du verwendest...

diese message ist z.b. aus der unit Messages die message zuvor aus der unit controls


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:06 Uhr.
Seite 1 von 2  1 2      

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 by Thomas Breitkreuz