Ersteinmal herzlichen Dank an Euch beide.
Die Lösung mit dem "verbiegen" der Propertys Cursor und ReadOnly hatte ich schon. Aber das finde ich nicht sehr elegant.
Vor allem ist es ein imenser zusätzlicher Aufwand, welchen ich bei der Portierung meiner Delphi-Komponenten nach Lazarus noch zusätzlich machen muss,
Ausserdem ist in Eueren Ausführungen ein kleiner Fehler. Wenn bereits die Property ReadOnly auf true gesetzt ist und dann der ExtCursorReadOnly gesetzt wird, dann wird Cursor nicht aktuallisiert.
So sah meine erste Lösung aus, nachdem ich merkte, dass die Benutzung der Messages durch irgendetwas nicht korrekt ausgelöst wird. Um das zu finden muss ich mich wohl erst noch weiter in die LCL einarbeiten und die Widgets einmal komplett verstehen.
Code: Alles auswählen
unit HGMemo;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Controls, StdCtrls, LclType;
type
THGMemo = class(TMemo)
private
FEnhCursor: TCursor;
FExtCursorReadOnly: TCursor;
protected
function GetEnhCursor(): TCursor; virtual;
function GetEnhReadOnly(): Boolean; virtual;
procedure SetEnhCursor(AValue: TCursor); virtual;
procedure SetEnhReadOnly(AValue: Boolean); virtual;
procedure SetExtCursorReadOnly(AValue: TCursor); virtual;
procedure UpdateInhCursor(); virtual;
public
constructor Create(AOwner: TComponent); override;
published
property Cursor: TCursor read GetEnhCursor write SetEnhCursor;
property ExtCursorReadOnly: TCursor read FExtCursorReadOnly write SetExtCursorReadOnly default crDefault;
property ReadOnly read GetEnhReadOnly write SetEnhReadOnly;
end;
procedure Register;
implementation
constructor THGMemo.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FEnhCursor := inherited Cursor;
FExtCursorReadOnly := crDefault;
UpdateInhCursor();
end;
function THGMemo.GetEnhCursor(): TCursor;
begin
Result := FEnhCursor;
end;
function THGMemo.GetEnhReadOnly(): Boolean;
begin
Result := inherited ReadOnly;
end;
procedure THGMemo.SetEnhCursor(AValue: TCursor);
begin
if (FEnhCursor <> AValue) then
begin
FEnhCursor := AValue;
UpdateInhCursor();
end;
end;
procedure THGMemo.SetEnhReadOnly(AValue: Boolean);
begin
if (inherited ReadOnly <> AValue) then
begin
inherited ReadOnly := AValue;
UpdateInhCursor();
end;
end;
procedure THGMemo.SetExtCursorReadOnly(AValue: TCursor);
begin
if (FExtCursorReadOnly <> AValue) then
begin
FExtCursorReadOnly := AValue;
UpdateInhCursor();
end;
end;
procedure THGMemo.UpdateInhCursor();
begin
if ((ReadOnly) and (FExtCursorReadOnly <> crDefault)) then
begin
inherited Cursor := FExtCursorReadOnly;
end
else
begin
inherited Cursor := FEnhCursor;
end;
end;
procedure Register;
begin
RegisterComponents('HG Edit', [THGMemo]);
end;
end.
wp_xyz hat geschrieben:Generell: Ist dir bewusst, dass trotz aktiviertem ReadOnly das TEdit-Control weiterhin noch für Mauseingaben zugänglich ist? Du kannst also durchaus noch den Text mit der Maus markieren,um ihn zum Beispiel in die Zwischenablage zu kopieren (was ich für sehr sinnvoll erachte). Da ist es natürlich wenig hilfreich, wenn plötzlich der Mauszeiger weg ist oder sich ins abschreckende "Verboten"-Icon meiner Demo verwandelt...
In meiner Delphi-Version dieser Komponenten habe ich dies so gelöst, dass beim Drücken der Maustasten der Cursor wieder umgeschalten wird. Es gibt dort zum Beispiel auch noch eine Property "CopyProtected" welche das Kopieren verhindert.
wp_xyz hat geschrieben:Bin mir nicht sicher, ob du dir dein Projekt gut überlegt hast.
Da gibt es nichts zu überlegen.
Wenn ich Lazarus verwenden möchte, dann muss ich wohl oder übel meine eigenen Delphi-Komponenten nach Lazarus portieren.
Das die Umstellung etwas Arbeit nach sich zieht war mir schon bewußt. Aber mit solchen Klimmzügen habe ich nicht gerechnet. Und dies schon bei den 0815-Komponenten. Wie soll es dann erst bei den Aufwändigeren sein, die mit echter Semi-Transparenz oder NC-Areas ausgerüstet sind.
Hat denn niemand eine Idee, weshalb/wo/von wen der Cursor wieder auf den Cursor gesetzt wird, welcher in der Property Cursor gepeichert ist?