Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 17.07.2009, 18:32   #21
Polotenchik
Форумчанин
 
Аватар для Polotenchik
 
Регистрация: 04.12.2008
Сообщений: 260
По умолчанию

Цитата:
Сообщение от Denager Посмотреть сообщение
Тогда такой вариант могу предложить
В onChange пиши
Код:
begin
If ClipBoard.HasFormat(CF_TEXT) then
  if not AllIsFloat(clipboard.AsText) then
    clipboard.AsText:='';
end;
Функция AllIsFloat:
Код:
Function AllIsFloat (const S : String) : Boolean;
var i : Extended;
Begin
 Result := TryStrToFloat(S, I);
End;
Не работает, собственно как и просто
Код:
clipboard.AsText:='';
Может это надо не в onChange писать?

Притом если положить на форму кнопку и прописать в ней:
Код:
clipboard.AsText:='';
то после её нажатия буфет отчищается.

Видимо дело в том, что мы ведь не изменяем ничего в едит, когда копируем из буфера поэтому событие onChange и не работает! мы ведь просто курсор поставили в едит и нажали вставить.

P.S Собственно, а если нам прописать не в onChange, а в OnClick ?!!!
Я бы изменил мир, но Бог не дает исходники...

Последний раз редактировалось Polotenchik; 17.07.2009 в 18:39.
Polotenchik вне форума
Старый 17.07.2009, 18:49   #22
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Ну вы и намудрили. Есть такая полезная вещь, как сабклассинг окна

Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TFloatEdit = class(TEdit)
  private
    foo: extended;
    CaretPos: TPoint;
  protected
    procedure WndProc(var Msg: TMessage); override;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TFloatEdit.WndProc(var Msg: TMessage);
begin
  case Msg.Msg of
    WM_KEYDOWN: begin
                  //эээээ
                  If (GetKeyState(VK_CONTROL)<0) and (msg.WParam=ord('V')) then SendMessage(self.Handle,WM_PASTE,0,0);
                  If (GetKeyState(VK_CONTROL)<0) and (msg.WParam=ord('C')) then SendMessage(self.Handle,WM_COPY,0,0);
                  If (GetKeyState(VK_CONTROL)<0) and (msg.WParam=ord('X')) then SendMessage(self.Handle,WM_CUT,0,0);
                end;
    WM_CHAR:  
                  Begin
                  GetCaretPos(CaretPos);                                   //координаты каретки
                  if Msg.WParam = ord(DecimalSeparator) then               //разделитель целой/дробной части
                    begin
                      if pos(DecimalSeparator, self.Text)<>0 then          //только один?
                        begin
                          Msg.Result := 0;
                          exit;
                        end;
                    end
                  else
                  If msg.WParam = ord('-') then                            //минус
                    begin
                      if (pos('-', self.Text)<>0) or (CaretPos.x>1) then   //только один и в начале?
                        begin
                          Msg.Result := 0;
                          exit;
                        end;
                    end
                  else
                  if not (Msg.WParam in [ord('0')..ord('9'), 8, 13]) then exit  //цифры, backspace, del
                end;
    WM_PASTE: begin
                if (Clipboard.HasFormat(CF_TEXT)) then                //в буффере текст?
                  if ((not TryStrToFloat(clipboard.AsText, foo))      //валидное число с плавающей точкой?
                  or (not TryStrToFloat(self.text+clipboard.AsText, foo))) //и будет валидным, если вставить?
                then exit
              end;
  end;
  inherited WndProc(Msg);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  with TFloatEdit.Create(Self) do
  begin
    Parent := Self;
    Left := 100;
    Top := 100;
    Width := 100
  end;
end;

end.
Можно не делать наследника, а просто переопределить оконную процедуру существующего edit'а через SetWindowLong, но этот способ универсальнее

Clipboard.AsText:='' - а вот за такое в нашем деле канделябром бьют
пыщь
JTG вне форума
Старый 17.07.2009, 19:12   #23
Polotenchik
Форумчанин
 
Аватар для Polotenchik
 
Регистрация: 04.12.2008
Сообщений: 260
По умолчанию

JTG, а можно этот код как-нибудь присобачить к уже созданным на форуме едитам?

Просто я не пойму если мне надо 6 едитов - это мне в FormCreate надо 6 раз прописать:
Код:
  with TFloatEdit.Create(Self) do
  begin
    Parent := Self;
    Left := 100;
    Top := 100;
    Width := 100
  end;
с разными параметрами?!
И как мне потом к ним обращаться?

А потом мне надо будет потом, чтобы в некоторых цифра сохранялась в ini файле и при создании формы потом выводилась из ini в определенном едите. Если можно подскажите, как сделать данный код для уже лежащих на форме едитов.
Я бы изменил мир, но Бог не дает исходники...
Polotenchik вне форума
Старый 17.07.2009, 20:42   #24
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Вот, распакуй куда-нибудь (в /delphi/lib или отдельную папку под компоненты) открой FloatEditControl.dpk -> compile -> install
На вкладке Additional появится FloatEdit

Можешь дописать свойство Value, которое будет "на ходу" в текст конвертироваться, чтоб можно было писать FloatEdit1.Value := 3,14 и чего там ещё надо. Короче, шевели мозгами
Вложения
Тип файла: rar TFoatEdit.rar (3.3 Кб, 125 просмотров)
пыщь

Последний раз редактировалось JTG; 17.07.2009 в 20:47.
JTG вне форума
Старый 17.07.2009, 21:29   #25
Polotenchik
Форумчанин
 
Аватар для Polotenchik
 
Регистрация: 04.12.2008
Сообщений: 260
По умолчанию

Цитата:
Сообщение от JTG Посмотреть сообщение
Вот, распакуй куда-нибудь (в /delphi/lib или отдельную папку под компоненты) открой FloatEditControl.dpk -> compile -> install
На вкладке Additional появится FloatEdit

Можешь дописать свойство Value, которое будет "на ходу" в текст конвертироваться, чтоб можно было писать FloatEdit1.Value := 3,14 и чего там ещё надо. Короче, шевели мозгами
Ну громаднейшее спасибо! Тему можно закрывать!
Я бы изменил мир, но Бог не дает исходники...
Polotenchik вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подскажите пожалуйста, как сделать, чтобы в Edit можно было ввести цифры от 0 до 12. ciev Общие вопросы Delphi 6 14.05.2016 17:45
Как в Edit вводить только цифры subsonic Общие вопросы Delphi 5 29.03.2010 23:39
Сортирует цифры по строкам, а надо чтобы сортировала цифры , записанные через пробелы Алексей_xXx Помощь студентам 14 06.05.2009 17:42
Как сделать, чтобы форму можно было перемещать только внутри главной формы SeregaKo Общие вопросы Delphi 7 26.03.2009 12:48
Как сделать так, чтобы форму можно было тостать не только за заголовок? Никки Общие вопросы Delphi 1 04.09.2008 14:34