![]() |
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 |
Re: VCL für Microsoft-Style URL-Label
TJvLinkLabel
|
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 |
Re: VCL für Microsoft-Style URL-Label
Schonmal
![]() |
Re: VCL für Microsoft-Style URL-Label
Liste der Anhänge anzeigen (Anzahl: 1)
Moin,
das TLinkLabel aus Delphi 2009. :-) Zitat:
Zitat:
(Mein Screen-Capture-Programm hat hier einen falschen (!) Cursor eingesetzt. Es ist die IE-typische Hand.) Zitat:
Zitat:
|
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 |
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. |
Re: VCL für Microsoft-Style URL-Label
Zitat:
|
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.
|
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 |
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';
|
Re: VCL für Microsoft-Style URL-Label
Zitat:
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 |
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 |
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 :-) |
Re: VCL für Microsoft-Style URL-Label
Zitat:
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. |
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 |
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?
|
Re: VCL für Microsoft-Style URL-Label
Zitat:
noch viel erfolg und spass dabei ... GG |
Re: VCL für Microsoft-Style URL-Label
Anhang scheint keinen zu interessieren, egal.
|
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.
|
Re: VCL für Microsoft-Style URL-Label
Hi Daniel,
Zitat:
Gruß Assertor |
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 |
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:
Gruß
{
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. blackdrake |
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) :( :( |
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:
TSingleLinkLabel ist ein Label, das beim Erstellen ein TTabElement über das Label legt.
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. 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 |
Re: VCL für Microsoft-Style URL-Label
Zitat:
Zitat:
Wegen deiner Transparenz: ![]() |
Re: VCL für Microsoft-Style URL-Label
Zitat:
|
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 |
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.
|
Re: VCL für Microsoft-Style URL-Label
Zu AllocateHWnd kannst Du Dir ja mal den Source von TTimer ansehen.
|
Re: VCL für Microsoft-Style URL-Label
Zitat:
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:
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 |
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.
![]() |
Re: VCL für Microsoft-Style URL-Label
Hallo.
Zitat:
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 |
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.
|
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:
Versuch B:
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; 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:
Gruß
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; blackdrake |
Re: VCL für Microsoft-Style URL-Label
Zitat:
|
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 |
Re: VCL für Microsoft-Style URL-Label
hast du denn die msg 71 (CM_SETACTIVECONTROL) implementiert?
|
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 ![]() |
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. |
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