Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.11.12;
Скачать: CL | DM;

Вниз

Пара простых вопросов...   Найти похожие ветки 

 
Max.66RUS ©   (2006-10-27 20:53) [0]

1) Как можно сделать такую опцию, чтобы в Edit1.Text с клавиатуры вводились только цифры, а попытка ввода других символов игнорировалась.

2) Подскажите процедуру сохранения содержимого Edit1.Text в текстовый файл по нажатию на копку, с возможностью выбрать нужный каталог и ввести нужное имя файла.

Заранее спасибо.


 
Ketmar ©   (2006-10-27 21:14) [1]

оффтоп: тебя спасает только правильный выбор конференции... %-)


 
Джо ©   (2006-10-27 21:20) [2]

1)
procedure TMainForm.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
 if not (Key in ["0".."9"]) then
   Key := #0
end;

Не спасет от вставки из буфера обмена.

2)
На форму положи компонент TSaveDialog со вкладки Dialogs.
procedure TMainForm.Button1Click(Sender: TObject);
var
 F: TextFile;
begin
 if SaveDialog1.Execute then
 begin
   AssignFile (F,SaveDialog1.FileName);
   Rewrite (F);
   try
     WriteLn (F,Edit1.Text)
   finally
     CloseFile (F);
   end;
 end;
end;


 
Gero ©   (2006-10-27 21:25) [3]

Вот, писал когда-то. Если сможешь заюзать, все будет, и проверка при вставке, и контроль максимального значения, даже подсказка будет показываться, когда не то нажимаешь.


interface

const
 MaxInt64    =  9223372036854775807;
 MaxInt64Str = "9223372036854775807";

TDMCEdit = class(TEdit)
 private
   FNumberStyle: Boolean;
   FMaxValue: Int64;
   procedure SetNumberStyle(const Value: Boolean);
   function GetValue: Int64;
   procedure SetValue(const Value: Int64);
   procedure SetMaxValue(const Value: Int64);

   procedure WMPaste(var Msg: TMessage); message WM_PASTE;
 protected
   procedure Change; override;
 public
   constructor Create(AOwner: TComponent); override;
 published
   property NumberStyle: Boolean read FNumberStyle write SetNumberStyle;
   property Value: Int64 read GetValue write SetValue;
   property MaxValue: Int64 read FMaxValue write SetMaxValue;
 end;
 TEdit = class(TDMCEdit);

implemenatation

constructor TDMCEdit.Create(AOwner: TComponent);
begin
 inherited;
 FNumberStyle := False;
 FMaxValue := -1;
 PopupMenu := MainForm.mnuIEInput;
end;

procedure TDMCEdit.Change;
var
 S: string;
 SStart, SLength: Integer;
begin
 inherited;
 if NumberStyle then
   begin
     S := Text;
     SStart := SelStart;
     SLength := SelLength;
     while (Length(S) > 0) and (S[1] = "0") do
       begin
         Delete(S, 1, 1);
         Dec(SStart);
       end; { while }
     if SStart < 0 then
       begin
         Inc(SLength, SStart);
         if SLength < 0 then SLength := 0;
         SStart := 0;
       end; { if }
     if S = "" then
       begin
         Text := "0";
         SelectAll;
         Exit;
       end
     else if S > MaxInt64Str then
       Value := MaxInt64
     else if (MaxValue > -1) and (Value > MaxValue) then
       Value := MaxValue
     else
       Text := S;
     SelStart := SStart;
     SelLength := SLength;
   end; { if }
end;

procedure TDMCEdit.WMPaste(var Msg: TMessage);
begin
 if NumberStyle and not IsNumber(Clipboard.AsText) then
   begin
     Perform(WM_CHAR, VK_SPACE, 0);
     Msg.Result := 0;
   end
 else
   inherited;
end;

procedure TDMCEdit.SetNumberStyle(const Value: Boolean);
var
 Long: Integer;
begin
 if FNumberStyle <> Value then
   begin
     FNumberStyle := Value;
     if FNumberStyle then
       Long := GetWindowLong(Handle, GWL_STYLE) or ES_NUMBER
     else
       Long := GetWindowLong(Handle, GWL_STYLE) and ES_NUMBER;
     SetWindowLong(Handle, GWL_STYLE, Long);
     if FNumberStyle then Change;
   end; { if }
end;

function TDMCEdit.GetValue: Int64;
begin
 if NumberStyle then
   Result := StrToInt64Def(Text, -1)
 else
   Result := -1;
end;

procedure TDMCEdit.SetValue(const Value: Int64);
begin
 if NumberStyle then
   Text := IntToStr(Value);
end;

procedure TDMCEdit.SetMaxValue(const Value: Int64);
begin
 if FMaxValue <> Value then
   FMaxValue := Value;
end;


 
Gero ©   (2006-10-27 21:26) [4]

> PopupMenu := MainForm.mnuIEInput;

Это лишнее )


 
Gero ©   (2006-10-27 21:27) [5]

> Если сможешь заюзать

Прочитал второй вопрос. Видимо, напрасно я выкладывал (


 
Gydvin ©   (2006-10-27 22:42) [6]


> Джо ©   (27.10.06 21:20) [2]
>
> 1)
> procedure TMainForm.Edit1KeyPress(Sender: TObject; var Key:
>  Char);
> begin
>  if not (Key in ["0".."9"]) then
>    Key := #0
> end;
> Не спасет от вставки из буфера обмена.

кинь на форму пустой popurmenu и подключи его к edit"y


 
Gero ©   (2006-10-27 22:49) [7]

> [6] Gydvin ©   (27.10.06 22:42)

Зачем так издеваться над пользователем?


 
Leonid Troyanovsky ©   (2006-10-27 22:59) [8]


> Gero ©   (27.10.06 22:49) [7]
> > [6] Gydvin ©   (27.10.06 22:42)
>
> Зачем так издеваться над пользователем?


Ведь пользователи любят попменю.

--
Regards, LVT.


 
Gydvin ©   (2006-10-27 23:00) [9]


> Зачем так издеваться над пользователем?

набирать, так набирать )))))


 
Gydvin ©   (2006-10-27 23:01) [10]

или пусть подключает и добавляет свои меню с нужной обработкой


 
Gero ©   (2006-10-27 23:04) [11]

> [10] Gydvin ©   (27.10.06 23:01)

Зачем свои меню, стандартного достаточно.


 
Gydvin ©   (2006-10-27 23:11) [12]

да знаю, что достаточно, просто проще заблокировать вставку из clipboard через popurmenu (как говорится через ж...)


 
Gero ©   (2006-10-27 23:12) [13]

> [12] Gydvin ©   (27.10.06 23:11)

См. [7]


 
Gydvin ©   (2006-10-27 23:15) [14]


> Gero ©   (27.10.06 23:12) [13]
>
> > [12] Gydvin ©   (27.10.06 23:11)
>
> См. [7]


Это уже цикл получается )))))


 
Max.66RUS ©   (2006-10-28 18:23) [15]

Спасибо всем. Воспользовался процедурой, которую выложил Джо. Всё отлично работает, только у меня по ней возник один вопрос: как можно сделать, чтобы при сохранении текстового файла, при открытии диалога сохранения, имя файла было уже вписано, и при этом оно бралось из Edit1.Text. Т.е. например, если в Edit1.Text написано слово "Файл", то при сохранении, это слово должно быть именем файла...? Заранее спасибо.


 
Ketmar ©   (2006-10-28 18:52) [16]

нет. это не "начинающим". это "надмозгам". а у него ещё (судя по анкете) -- высшее образование... %-(


 
Desdechado ©   (2006-10-28 19:33) [17]

TsaveDialog + F1


 
MsGuns ©   (2006-10-28 19:50) [18]

В событии OnChange проверять содержимое Text и, если ошибка, то "бибикать" и восстанавливать предыдущее корректное содержимое, сохраненное в этом же обработчике в случае правильного ввода.


 
Max.66RUS ©   (2006-10-28 19:57) [19]

MsGuns, Desdechado - спасибо большое.

Ketmar - я могу назвать кучу областей знаний, в которой ты даже "надмозгом" называться не сможешь...


 
Ketmar ©   (2006-10-28 20:40) [20]

>[19] Max.66RUS(c) 28-Oct-2006, 19:57
>Ketmar - я могу назвать кучу областей знаний, в которой ты
>даже "надмозгом" называться не сможешь...
я могу ещё больше. но нежелание элементарно нажать F1 и почитать -- это даже не "надмозговость". это обыкновенная наглость. если не хуже -- тупость.


 
Anatoly Podgoretsky ©   (2006-10-28 21:43) [21]


> Ketmar - я могу назвать кучу областей знаний

Не надо, вопрос про программирование и про твое плавание в нем. Пока налицо явная лень, всего то нажать F1 и посмотреть доступные свойства, ума для этого много не надо.


 
MsGuns ©   (2006-10-28 22:45) [22]

Для сохранения введенных в предыдущем сеансе значений придуманы "установки", механизм которых исчерпывающе реализованы в TIniFile (use IniFiles). Сама внда вовсю пользуется этим механизмом. Никакие "файлы" придумывать не надо, если конечно, сохраняемая информация не имет большой объем и сложную структуру - тогда дорога в Базы Данных.



Страницы: 1 вся ветка

Текущий архив: 2006.11.12;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.048 c
2-1162118210
ymy1
2006-10-29 13:36
2006.11.12
неиспользуемое в классе


1-1159274135
tester's
2006-09-26 16:35
2006.11.12
руссификация проги


6-1150616634
Windows
2006-06-18 11:43
2006.11.12
Сокеты и Делфи


1-1159766347
СержК
2006-10-02 09:19
2006.11.12
Как поменять кодировку в RxRichEdit


2-1161953980
m-kirill-2003
2006-10-27 16:59
2006.11.12
Панели и кнопки. Помогите