AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Selbsterstelltes property TabStop darf nicht kopiert werden!
Thema durchsuchen
Ansicht
Themen-Optionen

Selbsterstelltes property TabStop darf nicht kopiert werden!

Offene Frage von "blackdrake"
Ein Thema von blackdrake · begonnen am 12. Okt 2008 · letzter Beitrag vom 14. Okt 2008
Antwort Antwort
blackdrake

Registriert seit: 21. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#1

Selbsterstelltes property TabStop darf nicht kopiert werden!

  Alt 12. Okt 2008, 23:32
Hallo.

Ich hab mal wieder ein sehr exotisches Problem.

Ich möchte ein URL-Link-Label haben, das einen Fokus erhalten kann (wie bei Windows XP in der Systemsteuerung) - dies natürlich auf VCL Ebene und kompatibel mit allen Windows Versionen.

Das Problem ist natürlich, dass ein GraphicControl kein Handle haben kann und das Setzen des Handles auch nur zu Problemen führt - desweiteren kann ich auch nicht auf die offizielle TabList des TWinControl zugreifen.

Ich habe daher mich an http://www.delphipraxis.net/internal...ct.php?t=89215 orientiert und diesen Codeteil erheblich verbessert sowie es auf Labels angepasst. Diese Klasse schleift einfach ein TWinControl mit, das den Focus des Graphic-Controls bestimmt. Dies ist zwar generell eine eher unsaubere Variante, jedoch hier die einzigst mögliche.

Mittlerweile funktioniert es zwar zur Laufzeit gut, jedoch gibt es ein gravierendes Problem, mit dem ich mich mehrere Wochen beschäftigt habe...

Das funktioniert:

Wenn man die VCL auf das Form platziert, erhält sie den korrekten TabStop. Existieren also 3 Objekte mit den Tabstopps 0..2, erhält die neu gesetzte Komponente den TabStop = 3. Das ist OK.

Problem:

KOPIERT man die VCL mittels Strg+C und Strg+V, so wird der TabStop Wert mitkopiert (in diesem Falle 2) und auch tatsächlich eingefügt! Das heißt, die NEUE VCL erhält den TabStop 2 anstelle 3. Die VCL, die den TabStop = 2 hatte, wird dadurch automatisch auf 3 gestuft, was absolut falsch ist. Kopiert man nun also LinkLabel-VCLs, so werden die TabStopps total verwustet. (PS: Dieser Bug existiert bereits in dem Originalcode der CodeLib)

Bitte helft mir! Ich hab schon alles mögliche versucht und nichts hat gefruchtet

Gruß
blackdrake
Angehängte Dateien
Dateityp: pas focusgraphiccontrol_164.pas (10,8 KB, 4x aufgerufen)
Daniel Marschall
  Mit Zitat antworten Zitat
blackdrake

Registriert seit: 21. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#2

Re: Selbsterstelltes property TabStop darf nicht kopiert wer

  Alt 14. Okt 2008, 20:52
Hat denn keiner eine Idee? Ich stell mal einen Quelltextauszug rein, da die PAS nur 2 Mal (und das von mir!) heruntergeladen wurde

Delphi-Quellcode:
  TFocusLabel = class(TLabel, IFocusEvents)
  private
    FFocusControl: TFocusHandler;
    function GetTabOrder: TTabOrder;
    procedure SetTabOrder(const Value: TTabOrder);
    function GetTabStop: Boolean;
    procedure SetTabStop(const Value: Boolean);
    function GetFocused: Boolean;
    function GetCanFocus: Boolean;
  public
    procedure SetFocus;
    property CanFocus: Boolean read GetCanFocus;
    property Focused: Boolean read GetFocused;
  published
    property TabStop: Boolean read GetTabStop write SetTabStop default False;
    property TabOrder: TTabOrder read GetTabOrder write SetTabOrder default -1;
  end;

function TFocusLabel.GetCanFocus: Boolean;
begin
  if Assigned(FFocusControl) then
    result := FFocusControl.CanFocus
  else
    result := False;
end;

function TFocusLabel.GetFocused: Boolean;
begin
  if Assigned(FFocusControl) then
    result := FFocusControl.Focused
  else
    result := False;
end;

function TFocusLabel.GetTabOrder: TTabOrder;
begin
  if Assigned(FFocusControl) then
    result := FFocusControl.TabOrder
  else
    result := -1;
end;

function TFocusLabel.GetTabStop: Boolean;
begin
  if Assigned(FFocusControl) then
    result := FFocusControl.TabStop
  else
    result := False;
end;

procedure TFocusLabel.SetFocus;
begin
  if Assigned(FFocusControl) then
     if FFocusControl.CanFocus then
        FFocusControl.SetFocus;
end;

procedure TFocusLabel.SetTabOrder(const Value: TTabOrder);
begin
  if Assigned(FFocusControl) then
    FFocusControl.TabOrder := Value;
end;

procedure TFocusLabel.SetTabStop(const Value: Boolean);
begin
  if Assigned(FFocusControl) then
    FFocusControl.TabStop := Value;
end;
TabStop wird neu eingeführt und die Werte werden einfach vom internen FFocusControl (ist ein TWinControl, das mit Create erzeugt wird) gelesen und geschrieben werden. Wie gesagt funktioniert das Setzen gut, das Kopieren schlägt absolut fehl.

Gruß
blackdrake
Daniel Marschall
  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 01:41 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