Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Verhindern aus einem Memo zu kopieren (https://www.delphipraxis.net/4564-verhindern-aus-einem-memo-zu-kopieren.html)

Catbytes 5. Mai 2003 18:37

Hi,

meine Lösung ist wohl etwas untergegangen:

Ich nehme an, in diesem Formular gibt es auch einen "OK" Button oder sowas ähnliches. Erzeuge einfach im OnEnter-Event der Memo folgenden Code:

Code:
ActiveControl:=Button1;

Jens Schumann 6. Mai 2003 07:31

Hallo,
mit folgendem Source sollte das Kopieren aus einem Memo nicht mehr möglich sein.
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ClipBrd, AppEvnts;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    ApplicationEvents1: TApplicationEvents;
    procedure ApplicationEvents1Deactivate(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Memo1Exit(Sender: TObject);
  private
    { Private-Deklarationen }
    FWndProc : TWndMethod;
    procedure MemoWndProc(var Msg: TMessage);
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ApplicationEvents1Deactivate(Sender: TObject);
begin
  ClipBoard.Clear; // Anwendungsübergreifendes kopieren verhindern
end;

procedure TForm1.MemoWndProc(var Msg: TMessage);
begin
  if Msg.Msg = WM_GETTEXT then
    begin
    Msg.Result := 1;
    end
      else FWndProc(Msg); // alte Fensterproceure aufrufen
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  FWndProc := Memo1.WindowProc; // alte Fensterproceure merken
  Memo1.WindowProc := MemoWndProc; // Fensterproceure auf eigene Fensterprocedure umbiegen
end;

procedure TForm1.Memo1Exit(Sender: TObject);
begin
  ClipBoard.Clear; // Anwendungsinternes kopieren verhindern
end;

end.

Luckie 6. Mai 2003 07:34

Zitat:

Zitat von Jens Schumann
Delphi-Quellcode:
procedure TForm1.Memo1Exit(Sender: TObject);
begin
  ClipBoard.Clear; // Anwendungsinternes kopieren verhindern
end;

Und was ist mit dem Inhalt der Zwischenablage, der aus eien anderen Programm stammt? Den verliere ich nämlich wenn ich deinen Code verwende.

Jens Schumann 6. Mai 2003 07:46

Hallo
Zitat:

Zitat von Luckie
Und was ist mit dem Inhalt der Zwischenablage, der aus eien anderen Programm stammt? Den verliere ich nämlich wenn ich deinen Code verwende.

Ja, das stimmt.
Wenn Du etwas aus einer anderen Anwendung in die eigene Anwendung kopieren willst und beim aktivieren der eigenen Anwendung Memo1 den Focus hat, dann lasse Memo1OnExit einfach weg, wenn Du den Inhalt der ZwA nicht in Memo1 kopieren möchtest.
Wenn Du aus Deiner Anwendung etwas in eine andere Anwendung kopieren möchtest, aber nur nicht aus Memo1 dann schreibe folgendes
Delphi-Quellcode:
procedure TForm1.ApplicationEvents1Deactivate(Sender: TObject);
begin
  If ActiveControl=Memo1 then
    ClipBoard.Clear; // Anwendungsübergreifendes kopieren verhindern
end;

Specialwork 6. Mai 2003 09:56

Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Dopeline,

Im Anhang findest Du ein Demoprojekt, das Dir ein wenig weiterhelfen wird.

Gruß, Tom

:bouncing4:

sakura 6. Mai 2003 10:37

Ich habe den Thread nicht mitverfolgt, aber es hat mich gerade mal in den Fingern gejuckt. Anbei eine kleine Komponente, welche wie das TMemo ist, allerdings copy, cut & paste nicht zulässt. Wenn es passt: schön; wenn nicht: na ja :mrgreen:

Delphi-Quellcode:
unit NoCopyMemo;

interface

uses
  Windows, Messages, StdCtrls;

type
  TNoCopyMemo = class(TMemo)
  private
    procedure WMCOPY(var Msg: TWMCopy); message WM_COPY;
    procedure WMCUT(var Msg: TWMCut); message WM_CUT;
    procedure WMPASTE(var Msg: TWMPaste); message WM_PASTE;
    procedure WMGETTEXT(var Msg: TWMGetText); message WM_GETTEXT;
  end;

implementation

{ TNoCopyMemo }

procedure TNoCopyMemo.WMCOPY(var Msg: TWMCopy);
begin
  Msg.Result := -1;
end;

procedure TNoCopyMemo.WMCUT(var Msg: TWMCut);
begin
  Msg.Result := -1;
end;

procedure TNoCopyMemo.WMGETTEXT(var Msg: TWMGetText);
begin
  if Msg.TextMax >= 5 then
    StrPCopy(Msg.Text, 'doch')
  else
    Msg.TextMax := 5;
  Msg.Result := -1;
end;

procedure TNoCopyMemo.WMPASTE(var Msg: TWMPaste);
begin
  Msg.Result := -1;
end;

end.
...:cat:...

P.S. Damit sind auch die Funktionen des Kontextmenüs inaktiv - auch wenn diese noch angezeigt werden. Das Kopieren und ähnliches läuft i.A. über entsprechende Windowsmessages, welche einfach abgefangen werden können.

Jens Schumann 6. Mai 2003 10:39

Hallo Sakura,
damit ist aber nocht nicht das WM_GETTEXT Problem gelöst.

sakura 6. Mai 2003 10:43

Hi Jens,

ich sag doch, habe nicht alles durchgelesen. Gehts jetzt? Ich habe obiges Beispiel einfach mal angepasst und frech "doch" zurückliefern lassen :mrgreen:

...:cat:...


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:38 Uhr.
Seite 3 von 3     123   

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