Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Курсор в Memo


Автор: Rick 12.5.2006, 13:50
Доброго времени суток!
У меня такая проблема...Нужно Memo полностью защитить от копирования.
ReadOnly поставил, контекстное меню убрал, но когда щелкаешь по полю правой кнопкой курсор встает на него и можно уже зажав Shift копировать...smile
Можно его совсем оключить? 

Автор: Alexeis 12.5.2006, 13:57
Rick, Эта тема уже обсуждалсь см. поиск 

http://forum.vingrad.ru/index.php?showtopic=91091&view=all&hl=%D0%BA%D0%BE%D0%BF%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5,and,%D1%82%D0%B5%D0%BA%D1%81%D1%82%D0%B0 

Автор: Rick 12.5.2006, 14:44
С Clipboard хороший способ. А как узнать активно сейчас окно программы или нет? 

Автор: Alexeis 12.5.2006, 15:06
Вот пример из DelphiWorld

У формы
Код

private
    procedure wmActivate (var Msg:TWMACTIVATE); message wm_Activate;


Код

procedure TForm1.WMActivate (var Msg:TWMActivate);
begin
  {если окно получило фокус ввода по щелчку мыши или как иначе...}
  if (Msg.Active = WA_ACTIVE) or (Msg.Active = WA_CLICKACTIVE)then
  begin
    {...тогда цвет панели делаем равным цвету активной заголовочной полосы окна}
    Pnl1.Color := clActiveCaption
  end
  {иначе...}
  else
    {...цвет панели будет соответствовать НЕактивной заголовочной полосе окна}
    Pnl1.Color := clInactiveCaption;
  inherited;
end;


Работает - сам проверял.
  

Автор: Poseidon 12.5.2006, 18:25
А не проще Tlabel использовать? Поставить белый фон, растянуть по высоте, убрать AutoSize и не отлечишь (визуально) от Memo 

Автор: Rick 12.5.2006, 18:50
Хм...неплохая идея, но Memo, к сожалению, уже реализована в программе...Clipboard в принципе подходит, но тогда буфер обмена в других программах тоже не работает. 
Таким образом можно отследить активацию окна
Код

(Msg.Active = WA_ACTIVE) or (Msg.Active = WA_CLICKACTIVE)


А как, наоборот, определить, что окно свернули? 

Автор: Poseidon 12.5.2006, 19:29
Цитата(Rick @  12.5.2006,  18:50 Найти цитируемый пост)
Хм...неплохая идея, но Memo, к сожалению, уже реализована в программе...
 Значит прикручивать защиту не влом, а переделать под Label влом?
Да там по сути все сводится к замене Memo.Text на Label.Caption. Если использовал Memo.Lines, то немного повозится нужно. Но все же повозится нужно менше, чем с защитой от копирования из Мемо, т.к. все варианты предусматреть очень сложно!
 

Автор: dimazu 12.5.2006, 21:16
Если в лом на Label менять, то можно просто обработать wmPaint, а потом поставить enabled в false и 
все дела...
Типа вот так (где-то в примерах видел):

Код

unit my_memo;
interface
uses
  SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  Forms, Dialogs, StdCtrls;

type
  TMyMemo = class(TMemo)
  private
    { Private declarations }
    procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
  protected
    { Protected declarations }
  public
    { Public declarations }
  published
    { Published declarations }
  end;

procedure Register;

implementation

procedure TMyMemo.WMPaint(var Message: TWMPaint);
var
  Buffer: array[0..255] of Char;
  PaintStruc: TPaintStruct;
  DC: HDC;
  i: Integer;
  X, Y, Z: Word;
begin
  DC := Message.DC;
  if DC = 0 then
    DC := BeginPaint(Handle, PaintStruc);
  try
    X := 5;
    Y := 5;
    SetBkColor(DC, Color);
    SetBkMode(DC, Transparent);
    for i := 0 to Pred(Lines.Count) do
    begin
      SetTextColor(DC, clBlack);
      Z := Length(Lines[i]);
      StrPCopy(Buffer, Lines[i]);
      Buffer[Z] := #0;
      TextOut(DC, X, Y, Buffer, Z);
      Inc(Y, abs(Font.Height));
    end;
  finally
    if Message.DC = 0 then
      EndPaint(Handle, PaintStruc);
  end;
end;

procedure Register;
begin
  RegisterComponents('Custom', [TMyMemo]);
end;

end.

 

Автор: Rick 13.5.2006, 22:28
Все же как отследить свертывание окна? 

Автор: Poseidon 13.5.2006, 23:21
Цитата(Rick @  13.5.2006,  22:28 Найти цитируемый пост)
Все же как отследить свертывание окна? 
 Один топик - один вопрос!

Самый простой способ: кидаешь на форму TApplicationEvents и обрабатываешь в нем OnMinimize

можно еще так:
Код
type
  TForm1 = class(TForm)
  private
    Procedure WMSysCommand(var Message :TMessage); message WM_SYSCOMMAND;

{...}

procedure TForm1.WMSysCommand(var Message: TMessage);
begin
if Message.wParam = SC_MINIMIZE
then
  if MessageDLG('Хотите минимизировать?', mtConfirmation    , [mbYes,mbNo], 0) = mrYes
  then inherited
  else
else inherited;
end;
 

Автор: Rick 14.5.2006, 18:16
Благодарю всех за помощь!

Проблему решил с помощью clipboard, но отслеживая активность окна. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)