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/)
-   -   VCL - spezielles Edit gesucht (https://www.delphipraxis.net/200803-vcl-spezielles-edit-gesucht.html)

TurboMagic 27. Mai 2019 19:59

VCL - spezielles Edit gesucht
 
Hallo,

suche ein Tokyo kompatibles Edit mit
folgenden Fähigkeiten:
  • es soll immer im Überschreiben Modus sein
  • die Rücktaste muss deaktiviert werden können
    oder kein Zeichen löschen
  • es soll eine feste Textlänge (32 oder 64) definiert
    werden können
  • eingegebene Zeichen sollen gefiltert werden können
    um in einem Fall nur Hex Zeichen zu akzeptieren
  • Es soll im OnExit nicht meckern, wenn weniger als
    die maximale Zeichen Zahl eingegeben wurde
  • Vorzugsweise kostenlos aber nicht Voraussetzung

Grüße
TurboMagic

Aviator 27. Mai 2019 22:41

AW: VCL - spezielles Edit gesucht
 
Ich glaube kaum, dass es eine TEdit Komponente gibt, die dir genau das bietet. Aber mal ehrlich. Die Funktionen hast du doch in nicht mal einer Stunde mit einem normalen TEdit selbst programmiert.

TurboMagic 28. Mai 2019 05:38

AW: VCL - spezielles Edit gesucht
 
Wenn du mir sagst wie...
Habe im Keypressednach vkBack geschaut
und wenn gedrückt key auf #0
gesetzt, hat aber trotzdem
Zeichen gelöscht :-(

jziersch 28. Mai 2019 06:10

AW: VCL - spezielles Edit gesucht
 
Mit einem MaskEdit sollte sich das eigentlich realisieren lassen.

Für die Sondertasten abfrage musst Du OnKeyUp und OnKeyDown überschreiben.

TurboMagic 28. Mai 2019 07:28

AW: VCL - spezielles Edit gesucht
 
Zitat:

Zitat von jziersch (Beitrag 1433227)
Mit einem MaskEdit sollte sich das eigentlich realisieren lassen.

Für die Sondertasten abfrage musst Du OnKeyUp und OnKeyDown überschreiben.

Hallo,

TMaskEdit habe ich schon ausprobiert. Wird zuweing eingegeben gibt es immer eine
Ferhlermeldung im OnExit, ohne , dass ich vorher eingreifen konnte.

Ich werde aber Mal TEdit mit OnKeyDown/KeyUp statt KeyPressed ausprobieren.

Grüße
TurboMagic

TurboMagic 28. Mai 2019 07:45

AW: VCL - spezielles Edit gesucht
 
Hallo,

Delphi-Quellcode:
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftSTate);
begin
  if Key = vk_Back then
    Key := 0;
end;
Das funktioniert nicht auch nicht im OnKeyUp.
Die Zeile mit der Zuweisung wird zwar erreicht (Breakpoint zeigt das), das
eingegebene Zeichen wird aber trotzdem gelöscht.

Und wie ich ein Edit dauerhaft in Überschreibenmodus umstelle, weiß ich auch noch nicht.

Grüße
TurboMagic

Klaus01 28. Mai 2019 07:52

AW: VCL - spezielles Edit gesucht
 
.. das hilft Dir nicht? -> http://www.delphigroups.info/2/be/163347.html

Grüße
Klaus

Michael II 28. Mai 2019 08:49

AW: VCL - spezielles Edit gesucht
 
Hast du's mit OnKeyPress versucht? Zum Beispiel so:

Delphi-Quellcode:
procedure TForm103.Edit1KeyPress(Sender: TObject; var Key: Char);
var cursorpos : integer;
begin
  // Filter:
  if not ( key in ['0'..'9', 'A'..'F', 'a'..'f'] ) then
  begin
    key := #0;
    exit;
  end;

  // Überschreibmodus:
(PeterBelow macht das in #9 [unten] viel besser ;-))
  cursorpos := Edit1.SelStart + Edit1.SelLength;
  if cursorpos < length(edit1.text) then Edit1.Text := Copy(Edit1.Text,1,cursorpos) +
  Copy(Edit1.Text,cursorpos+2,maxint);
  Edit1.SelStart := cursorpos;
end;

peterbelow 28. Mai 2019 10:12

AW: VCL - spezielles Edit gesucht
 
Zitat:

Zitat von TurboMagic (Beitrag 1433212)
Hallo,

suche ein Tokyo kompatibles Edit mit
folgenden Fähigkeiten:

Gehen wir mal der Reihe nach durch. Leider sind die Sepzifikationen, wie üblich, ziemlich unvollständig :wink:.
  • es soll immer im Überschreiben Modus sein

Das läßt sich erreichen, wenn man in OnKeyPress SelLength auf 1 setzt, wenn das Zeichen kein Steuerzeichen ist, SelLength nicht 0 ist und SelStart nicht gleich GetTextLength ist.
  • die Rücktaste muss deaktiviert werden können oder kein Zeichen löschen

Wie sieht es mit anderen Tasten aus, die auch Zeichen löschen? Entf, Strg-X? Wie mit Einfügen aus der Zwischenablage?
  • es soll eine feste Textlänge (32 oder 64) definiert werden können

TEdit hat eine Eigenschaft MaxLength, die man entspreched setzen kann.
  • eingegebene Zeichen sollen gefiltert werden können um in einem Fall nur Hex Zeichen zu akzeptieren

Das geht in OnKeyPress. Auch hier stellt sich die Frage, wie man Einfügen aus der Zwischenablage behandeln soll.
  • Es soll im OnExit nicht meckern, wenn weniger als die maximale Zeichen Zahl eingegeben wurde

Das ist der Default, da muss man nichts programmieren.
  • Vorzugsweise kostenlos aber nicht Voraussetzung

Selber machen kostet nix :wink:

Ich habe gerade ein Bißchen Zeit und werde mal sehen, was ich da zusammenschrauben kann.

TurboMagic 28. Mai 2019 10:49

AW: VCL - spezielles Edit gesucht
 
Zitat:

Zitat von Klaus01 (Beitrag 1433231)
.. das hilft Dir nicht? -> http://www.delphigroups.info/2/be/163347.html

Grüße
Klaus

Hallo,

das ermöglich zumindest dauerhaft Überschreibmodus zu aktivieren
und auch vk_delete kann im OnKeyDown gefiltert werden, nur vk_Back Filterung wird dort
ignoriert.

Danke schon mal für diese teilweise Hilfe!

Grüße
TurboMagic

TurboMagic 28. Mai 2019 10:56

AW: VCL - spezielles Edit gesucht
 
Ok, nochmal die Filterung der Rücktaste in OnKeypressed eingebaut:
siehe da im Testprogramm geht es jetzt.

Komisch. Jetzt mal ins richtige einbauen und wieder testen.

Danke für die Hilfe!

peterbelow 28. Mai 2019 12:34

AW: VCL - spezielles Edit gesucht
 
OK, hier ist das Ergebnis meiner Bemühungen, allerdings nur oberflächlich getestet.
Für das Filtern der Eingabe gibt es drei Möglichkeiten.
  • Die DefaultFilter-Eigenschaft bietet einige eingebaute Filter an. dfCustom läßt sich zwar auswählen, man muß aber einen CustomFilter zuweisen, sonst akzeptiert das Control keine Zeichen.
  • Der CustomFilter-Eigenschaft kann man einen eigenen Charset zuweisen, allerdings nur zur Laufzeit.
  • Der OnAcceptChar-Event wird ausgelöst, nachdem die internen Filter angewendet wurden, man kann den Accept-Parameter im Handler ändern, wenn die gefällte Entscheidung nicht passt.

MaxLength wird auf 32 initialisiert, OvertypeMode ist true by default. Wenn man OvertypeMode auf false setzt sollte man Zeichen löschen können, wie bei einem normalen Tedit, allerdings wird das Filtern angewendet.

Delphi-Quellcode:
unit PB.Vcl.FilteredEdit;

interface

uses
  System.SysUtils, System.Classes, Vcl.Controls, Vcl.StdCtrls,
  Winapi.Windows, Winapi.Messages;

type
  TPBAcceptCharEventHandler = procedure (Sender: TComponent;
    const aChar: Char; var Accept: boolean) of object;

  TPBDefaultFilter = (dfNone, dfCustom, dfHexDigits, dfDecimalDigits, dfOctalDigits);

  TPBCustomFilteredEdit = class(TCustomEdit)
  strict private
    FCustomFilter: TSysCharset;
    FDefaultFilter: TPBDefaultFilter;
    FOnAcceptChar: TPBAcceptCharEventHandler;
    FOvertypeMode: boolean;
    FPasteReplacesAll: boolean;
  strict protected
    function CharIsAcceptable(const aChar: Char): boolean; virtual;
    function ClipboardContentIsAcceptable: boolean;
    procedure SetCustomFilter(const Value: TSysCharset);
  protected
    procedure KeyDown(var Key: Word; Shift: TShiftState); override;
    procedure KeyPress(var Key: Char); override;
    procedure WMCut(var Message: TWMCut); message WM_CUT;
    procedure WMPaste(var Message: TWMPaste); message WM_PASTE;
  public
    constructor Create(aOwner: TComponent); override;
    property CustomFilter: TSysCharset read FCustomFilter write SetCustomFilter;
    property DefaultFilter: TPBDefaultFilter read FDefaultFilter write
        FDefaultFilter default dfNone;
    property OvertypeMode: boolean read FOvertypeMode write FOvertypeMode default
        true;
    property PasteReplacesAll: boolean read FPasteReplacesAll write
        FPasteReplacesAll default true;
    property OnAcceptChar: TPBAcceptCharEventHandler read FOnAcceptChar write
        FOnAcceptChar;
  end;

  TPBFilteredEdit = class(TPBCustomFilteredEdit)
  published
    property Align;
    property Alignment;
    property Anchors;
    property AutoSize;
    property BevelEdges;
    property BevelInner;
    property BevelKind default bkNone;
    property BevelOuter;
    property BevelWidth;
    property BiDiMode;
    property BorderStyle;
    property CharCase;
    property Color;
    property Constraints;
    property Ctl3D;
    property DefaultFilter;
    property DoubleBuffered;
    property DragCursor;
    property DragKind;
    property DragMode;
    property Enabled;
    property Font;
    property HideSelection;
    property ImeMode;
    property ImeName;
    property MaxLength;
    property OEMConvert;
    property OvertypeMode;
    property ParentBiDiMode;
    property ParentColor;
    property ParentCtl3D;
    property ParentDoubleBuffered;
    property ParentFont;
    property ParentShowHint;
    property PopupMenu;
    property PasteReplacesAll;
    property ReadOnly;
    property ShowHint;
    property TabOrder;
    property TabStop;
    property Text;
    property TextHint;
    property Touch;
    property Visible;
    property StyleElements;
    property OnAcceptChar;
    property OnChange;
    property OnClick;
    property OnContextPopup;
    property OnDblClick;
    property OnDragDrop;
    property OnDragOver;
    property OnEndDock;
    property OnEndDrag;
    property OnEnter;
    property OnExit;
    property OnGesture;
    property OnKeyDown;
    property OnKeyPress;
    property OnKeyUp;
    property OnMouseActivate;
    property OnMouseDown;
    property OnMouseEnter;
    property OnMouseLeave;
    property OnMouseMove;
    property OnMouseUp;
    property OnStartDock;
    property OnStartDrag;
  end;

procedure Register;

implementation

uses Vcl.Clipbrd;

const
  PredefinedFilters: array [TPBDefaultFilter] of TSysCharSet =
  ([], // dfNone
   [], // dfCustom
   ['0'..'9','A'..'F','a'..'f'], //dfHexDigits
   ['0'..'9'], //dfDecimalDigits,
   ['0'..'7'] // dfOctalDigits
  );

procedure Register;
begin
  RegisterComponents('Samples', [TPBFilteredEdit]);
end;

constructor TPBCustomFilteredEdit.Create(aOwner: TComponent);
begin
  inherited;
  // set defaults
  MaxLength := 32;
  FDefaultFilter := dfNone;
  FCustomFilter := [];
  FOvertypeMode := true;
  FPasteReplacesAll := true;
end;

function TPBCustomFilteredEdit.CharIsAcceptable(const aChar: Char): boolean;
begin
  case DefaultFilter of
    dfNone : Result := true;
    dfCustom: Result := CharInSet(aChar, FCustomFilter);
  else
    Result := CharInSet(aChar, PredefinedFilters[DefaultFilter]);
  end; {case}

  if Assigned(FOnAcceptChar) then
    FOnAcceptChar(self, aChar, Result);
end;

function TPBCustomFilteredEdit.ClipboardContentIsAcceptable: boolean;
var
  LLen: Integer;
  LText: string;
  I: Integer;
begin
  Result := Clipboard.HasFormat(CF_TEXT);
  if Result then begin
    LText := Clipboard.AsText;
    if PasteReplacesAll then
      LLen := LText.Length
    else
      LLen := LText.Length + GetTextLen - SelLength;
    Result := LLen <= MaxLength;
    if Result then begin
      for I := Low(LText) to High(LText) do
        if not CharIsAcceptable(LText[I]) then begin
          Result := false;
          Break;
        end; {if}
    end; {if}
  end; {if}
end;

procedure TPBCustomFilteredEdit.KeyDown(var Key: Word; Shift: TShiftState);
begin
  // block delete and old-style clipboard keys to simplify the logic
  if OvertypeMode and (Key in [VK_DELETE, VK_INSERT]) then
    Key := 0;
  inherited;
end;

procedure TPBCustomFilteredEdit.KeyPress(var Key: Char);
begin
  // Ctrl-A, Ctrl-C and Ctrl-V are the only acceptable control characters!
  // We need those to support clipboard copy and paste and select all.
  if (Key < #32) and not CharInSet(Key, [^A, ^C, ^V]) then
    if OvertypeMode then
      Key := #0
    else
      if Key <> ^H then //allow backspace if insert mode
        Key := #0;

  if (Key >= #32) and not CharIsAcceptable(Key) then
    Key := #0;

  if (Key <> #0) and OvertypeMode then begin
  // emulate overtype mode by selecting one character, but only if this
  // is not a clipboard shortcut
    if Key >= #32 then
      SelLength := 1;
  end; {if}
  inherited;
end;

procedure TPBCustomFilteredEdit.SetCustomFilter(const Value: TSysCharset);
begin
  FCustomFilter := Value;
  if Value = [] then
    FDefaultFilter := dfNone
  else
    FDefaultFilter := dfCustom;
end;

procedure TPBCustomFilteredEdit.WMCut(var Message: TWMCut);
begin
  // block cut to clipboard
  Message.Result := 0;
end;

procedure TPBCustomFilteredEdit.WMPaste(var Message: TWMPaste);
begin
  if ClipboardContentIsAcceptable then begin
    if PasteReplacesAll then
      SelectAll;
    inherited;
  end;
end;

end.

TurboMagic 28. Mai 2019 21:53

AW: VCL - spezielles Edit gesucht
 
Zitat:

Zitat von peterbelow (Beitrag 1433262)
OK, hier ist das Ergebnis meiner Bemühungen, allerdings nur oberflächlich getestet.
MaxLength wird auf 32 initialisiert, OvertypeMode ist true by default. Wenn man OvertypeMode auf false setzt sollte man Zeichen löschen können, wie bei einem normalen Tedit, allerdings wird das Filtern angewendet.

Delphi-Quellcode:
type
  TPBCustomFilteredEdit = class(TCustomEdit)

Ich schaue mir gerade das Edit an, frage mich aber, warum es von TCustomEdit und nicht TEdit abgeleitet ist.
An die Font Eigenschaft zum Beispiel scheine ich nicht heran zu kommen (bräuchte ich aber).
Auch MaxLength kann ich so nicht erreichen, muss das aber ggf. zu Laufzeit ändern.
Ok, muss mir das noch genauer anschauen, aber so passt es noch nicht zu 100% und daher frage ich mich eben,
warum von einer Komponente mit weniger Möglichkeiten abgeleitet wurde.

Gäbe es irgendwelche Probleme bei der Ableitung von TEdit?
Geht dann was nicht richtig oder nur mit hohem Aufwand?

Grüße und Danke trotzdem mal für diese Umsetzung!
TurboMagick

Schokohase 28. Mai 2019 22:01

AW: VCL - spezielles Edit gesucht
 
In den Custom Controls liegt die gesamte Logik. In den "normalen" Controls werden nur die Eigenschaften veröffentlicht.

Das kann man sehen, wenn man sich den Quellcode von TCustomEdit und TEdit anschaut.

Manchmal möchte man eine ganz bestimmte Eigenschaft nicht veröffentlichen, wenn der Vorgänger diese aber schon veröffentlichst hat, dann wird da nix von.

Aviator 28. Mai 2019 22:01

AW: VCL - spezielles Edit gesucht
 
Der Unterschied von TCustomEdit und TEdit ist nur, dass bei TEdit bereits alle benötigten Properties published wurden. Das kannst du ja bei der eigens abgeleiteten Komponente noch machen.

TurboMagic 28. Mai 2019 22:14

AW: VCL - spezielles Edit gesucht
 
Zitat:

Zitat von Aviator (Beitrag 1433314)
Der Unterschied von TCustomEdit und TEdit ist nur, dass bei TEdit bereits alle benötigten Properties published wurden. Das kannst du ja bei der eigens abgeleiteten Komponente noch machen.

Hallo,

danke ja. Erst Quellcode lesen, dann hier posten ;-)
Er hat da ja auch eine Klasse für drin ;-)

Seine Unit funktioniert schon recht gut, ich habe aber trotzdem noch
etwas verändert. Ich habe die Längenprüfung in der ClipboardContentIsAcceptable Methode ausgebaut,
weil man dann an beliebiger Stelle den Clipboard Inhalt überschreibend einfügen kann, auch wenn
dann ggf. ein teil davon abgeschnitten wird, weil MaxLength überschritten würde.

Dafür habe ich die WM_Paste abgeändert:
Delphi-Quellcode:
procedure TPBCustomFilteredEdit.WMPaste(var Message: TWMPaste);
begin
  if ClipboardContentIsAcceptable then begin
    if PasteReplacesAll then
      SelectAll
    else
    begin
      // This allows to select only parts of the text in the edit. That selected
      // part only will be replaced by the text pasted.
      if SelLength <= 1 then
        SelLength := Clipboard.AsText.Length;
    end;
    inherited;
  end;
end;
Damit kann ich auch Teile des Edit textes die selektiert sind überschreiben, wobei dann
nur der selektierte Teil überschrieben wird.

Man könnte überlegen, ob man diese Komponente (natürlich nach Zustimmung von Peter Below)
nicht bei der JVCL einbringt.

Grüße
TurboMagic

TurboMagic 28. Mai 2019 22:22

AW: VCL - spezielles Edit gesucht
 
Zitat:

Zitat von Aviator (Beitrag 1433314)
Der Unterschied von TCustomEdit und TEdit ist nur, dass bei TEdit bereits alle benötigten Properties published wurden. Das kannst du ja bei der eigens abgeleiteten Komponente noch machen.

Nur eines noch festgestellt was alte Hasen an Peter's Unit stören könnte:
Einfügen mittels Shift-Einf geht nicht mehr. ;-)

Grüße
TurboMagic

peterbelow 28. Mai 2019 23:22

AW: VCL - spezielles Edit gesucht
 
Zitat:

Zitat von TurboMagic (Beitrag 1433316)
Zitat:

Zitat von Aviator (Beitrag 1433314)
Der Unterschied von TCustomEdit und TEdit ist nur, dass bei TEdit bereits alle benötigten Properties published wurden. Das kannst du ja bei der eigens abgeleiteten Komponente noch machen.

Nur eines noch festgestellt was alte Hasen an Peter's Unit stören könnte:
Einfügen mittels Shift-Einf geht nicht mehr. ;-)

Grüße
TurboMagic

Ja, das habe ich explizit (in KeyDown) abgestellt, damit der Kode nicht zu komplex wird. Die Leute, die diese alten Windows 1.0 Shortcuts noch kennen sind eine aussterbende Spezies :wink:.

Aviator 28. Mai 2019 23:28

AW: VCL - spezielles Edit gesucht
 
Oh oh. Ich bin noch nicht alt. Bei weitem nicht. Aber ich nutze STRG+Einfg, SHIFT+Einfg und SHIFT+Delete fast ausschließlich. Selten einmal, dass ich STRG+C, STRG+V und STRG+X nutze.

Zitat:

Zitat von TurboMagic (Beitrag 1433315)
Zitat:

Zitat von Aviator (Beitrag 1433314)
Der Unterschied von TCustomEdit und TEdit ist nur, dass bei TEdit bereits alle benötigten Properties published wurden. Das kannst du ja bei der eigens abgeleiteten Komponente noch machen.

Hallo,

danke ja. Erst Quellcode lesen, dann hier posten ;-)
Er hat da ja auch eine Klasse für drin ;-)

Ich hoffe mal, das bezog sich auf dich. :|

TurboMagic 29. Mai 2019 07:58

AW: VCL - spezielles Edit gesucht
 
Zitat:

Zitat von peterbelow (Beitrag 1433317)
Zitat:

Zitat von TurboMagic (Beitrag 1433316)
Zitat:

Zitat von Aviator (Beitrag 1433314)
Der Unterschied von TCustomEdit und TEdit ist nur, dass bei TEdit bereits alle benötigten Properties published wurden. Das kannst du ja bei der eigens abgeleiteten Komponente noch machen.

Nur eines noch festgestellt was alte Hasen an Peter's Unit stören könnte:
Einfügen mittels Shift-Einf geht nicht mehr. ;-)

Grüße
TurboMagic

Ja, das habe ich explizit (in KeyDown) abgestellt, damit der Kode nicht zu komplex wird. Die Leute, die diese alten Windows 1.0 Shortcuts noch kennen sind eine aussterbende Spezies :wink:.

Naja, ich hab's noch etwas hin bis zur Rente! ;-)
Noch etwas ist mir aufgefallen: im Kontextmenü des Edits gibt es noch AUsschneiden, das geht aber nach meinen Tests ja nicht mehr.

Grüße
TurboMagic

TurboMagic 29. Mai 2019 07:58

AW: VCL - spezielles Edit gesucht
 
Zitat:

Zitat von Aviator (Beitrag 1433318)
Oh oh. Ich bin noch nicht alt. Bei weitem nicht. Aber ich nutze STRG+Einfg, SHIFT+Einfg und SHIFT+Delete fast ausschließlich. Selten einmal, dass ich STRG+C, STRG+V und STRG+X nutze.

Zitat:

Zitat von TurboMagic (Beitrag 1433315)
Zitat:

Zitat von Aviator (Beitrag 1433314)
Der Unterschied von TCustomEdit und TEdit ist nur, dass bei TEdit bereits alle benötigten Properties published wurden. Das kannst du ja bei der eigens abgeleiteten Komponente noch machen.

Hallo,

danke ja. Erst Quellcode lesen, dann hier posten ;-)
Er hat da ja auch eine Klasse für drin ;-)

Ich hoffe mal, das bezog sich auf dich. :|

Ja!!!

peterbelow 29. Mai 2019 11:39

AW: VCL - spezielles Edit gesucht
 
Zitat:

Zitat von TurboMagic (Beitrag 1433335)

Naja, ich hab's noch etwas hin bis zur Rente! ;-)
Noch etwas ist mir aufgefallen: im Kontextmenü des Edits gibt es noch AUsschneiden, das geht aber nach meinen Tests ja nicht mehr.

Das Kontextmenu eines TEdits ist quasi eingebaut, das wird von Windows erzeugt. Leider kann man das Menu nur komplett ersetzen, nicht einfach nur modifizieren um z. B. den "ausschneiden"-Punkt zu deaktivieren. Die Funktion ist aber einfach zu blockieren, da die Menueinträge nur Messages (in diesem Fall WM_CUT) an das Control schicken.

Ich habe halt nicht so viel Arbeit in den Kode investieren wollen (daher auch die Radikallösung für die klassischen Clipboard-Shortcuts), schließlich sind die French Open im Gange und da gibt es gute Spiele zu sehen :-D

TurboMagic 29. Mai 2019 20:24

AW: VCL - spezielles Edit gesucht
 
Zitat:

Zitat von peterbelow (Beitrag 1433365)
Das Kontextmenu eines TEdits ist quasi eingebaut, das wird von Windows erzeugt. Leider kann man das Menu nur komplett ersetzen, nicht einfach nur modifizieren um z. B. den "ausschneiden"-Punkt zu deaktivieren. Die Funktion ist aber einfach zu blockieren, da die Menueinträge nur Messages (in diesem Fall WM_CUT) an das Control schicken.

Ich habe halt nicht so viel Arbeit in den Kode investieren wollen (daher auch die Radikallösung für die klassischen Clipboard-Shortcuts), schließlich sind die French Open im Gange und da gibt es gute Spiele zu sehen :-D

Ok, verstehe ich natürlich. Diem klassischen SHortcuts sollten glaube ich nicht zu schwierig nachzurüsten sein.
Blöder ist die Ausschneiden Geschichte. Wie bekommt man mit, dass jemand den Punkt ausgewählt hat? Dann könnte
man das nämlich als alternative in "Kopieren" ummünzen... ;-)

Dann täte sich da wenigstens was und da man ja im Dauer Überschreiben Modus ist, haben viele Benutzer ja
hoffentlich Verständnis dafür.

Was ich noch geändert habe ist, dass ein Einfügen eines Textes der länger ist als der Text von der aktuellen
Cursor Position bis zum Ende des Edit auch geht. Der wird halt abgeschnitten.

Grüße
TurboMagic

Luckie 29. Mai 2019 20:36

AW: VCL - spezielles Edit gesucht
 
Zitat:

Das Kontextmenu eines TEdits ist quasi eingebaut, das wird von Windows erzeugt. Leider kann man das Menu nur komplett ersetzen, nicht einfach nur modifizieren um z. B. den "ausschneiden"-Punkt zu deaktivieren.
Doch, das müsste gehen. Bei OnPopUp das Handle ses Menüs holen und dann mittels einen Windows Message den entsprechenden Menüeintrag deaktivieren oder ganz entfernen.

TurboMagic 29. Mai 2019 20:38

AW: VCL - spezielles Edit gesucht
 
Zitat:

Zitat von Luckie (Beitrag 1433423)
Zitat:

Das Kontextmenu eines TEdits ist quasi eingebaut, das wird von Windows erzeugt. Leider kann man das Menu nur komplett ersetzen, nicht einfach nur modifizieren um z. B. den "ausschneiden"-Punkt zu deaktivieren.
Doch, das müsste gehen. Bei OnPopUp das Handle ses Menüs holen und dann mittels einen Windows Message den entsprechenden Menüeintrag deaktivieren oder ganz entfernen.

Ein beispiel dafür wäre echt super! Dann wär's ein Stückchen perfekter... ;-)

Aviator 29. Mai 2019 22:44

AW: VCL - spezielles Edit gesucht
 
Alternativ kannst du auch ein eigenes PopupMenu dran hängen in dem es bspw. nur Kopieren und Ausschneiden gibt. Das Menü ersetzt dann das Windows eigene Menü.

TurboMagic 29. Mai 2019 23:44

AW: VCL - spezielles Edit gesucht
 
Zitat:

Zitat von Aviator (Beitrag 1433436)
Alternativ kannst du auch ein eigenes PopupMenu dran hängen in dem es bspw. nur Kopieren und Ausschneiden gibt. Das Menü ersetzt dann das Windows eigene Menü.

Hast du dafür mal ein Beispiel?

Aviator 30. Mai 2019 09:02

AW: VCL - spezielles Edit gesucht
 
Zieh dir einfach ein neues TPopupMenu auf die Form und setz die PopupMenu Eigenschaft des TEdit auf das neue TPopupMenu. Im Designer (Doppelklick auf das TPopupMenu) kannst du dir dann die Schaltflächen einfach definieren und den Code hinterlegen der ausgeführt wird.

Dafür braucht es nun wirklich kein Beispiel. Zumal ich gerade am Smartphone schreibe ;)

peterbelow 30. Mai 2019 12:40

AW: VCL - spezielles Edit gesucht
 
Zitat:

Zitat von Luckie (Beitrag 1433423)
Zitat:

Das Kontextmenu eines TEdits ist quasi eingebaut, das wird von Windows erzeugt. Leider kann man das Menu nur komplett ersetzen, nicht einfach nur modifizieren um z. B. den "ausschneiden"-Punkt zu deaktivieren.
Doch, das müsste gehen. Bei OnPopUp das Handle ses Menüs holen und dann mittels einen Windows Message den entsprechenden Menüeintrag deaktivieren oder ganz entfernen.

Es geht schon, aber nicht so. Das Default-Menu eines Tedits ist kein Delphi TPopupMenu, und es ist alles andere als einfach, das Menuhandle zu bekommen. Das Control erzeugt das Menu, wenn es die WM_CONTEXTMENU-Meldung weitergereicht bekommt (die VCL macht das, wenn das Control kein PopupMenu zugewiesen bekommen hat). Danach bekommt die Anwendung aber die Kontrolle erst wieder zurück, wenn der Benutzer das Menu geschlossen hat. Man hat also keinen guten Interventionspunkt, um an das Menuhandle zu kommen und muss sich daher einiger übler Klimmzüge bedienen. Der Aufwand lohnt einfach nicht, das Menu zu ersetzen ist viel einfacher.

peterbelow 30. Mai 2019 12:42

AW: VCL - spezielles Edit gesucht
 
Zitat:

Zitat von TurboMagic (Beitrag 1433421)
Zitat:

Zitat von peterbelow (Beitrag 1433365)
Das Kontextmenu eines TEdits ist quasi eingebaut, das wird von Windows erzeugt. Leider kann man das Menu nur komplett ersetzen, nicht einfach nur modifizieren um z. B. den "ausschneiden"-Punkt zu deaktivieren. Die Funktion ist aber einfach zu blockieren, da die Menueinträge nur Messages (in diesem Fall WM_CUT) an das Control schicken.

Ich habe halt nicht so viel Arbeit in den Kode investieren wollen (daher auch die Radikallösung für die klassischen Clipboard-Shortcuts), schließlich sind die French Open im Gange und da gibt es gute Spiele zu sehen :-D

Ok, verstehe ich natürlich. Diem klassischen SHortcuts sollten glaube ich nicht zu schwierig nachzurüsten sein.
Blöder ist die Ausschneiden Geschichte. Wie bekommt man mit, dass jemand den Punkt ausgewählt hat?

Mach das im Message-Handler für wm_cut.

TurboMagic 30. Mai 2019 21:52

AW: VCL - spezielles Edit gesucht
 
Danke für die weiteren Antworten.
Habe verstanden, dass ich einfach das Popup durch ein eigenes ersetzen kann.
An wm_cut habe ich inzwischen auch schon selber gedacht, danke trotzdem für den Hinweis!


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:17 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