powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TEdit с DisplayFormat
11 сообщений из 11, страница 1 из 1
TEdit с DisplayFormat
    #40038268
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может кто-нибудь знает, существует ли в природе аналог TEdit, который поддерживает DisplayFormat?..
Т.е. чтобы мог при редактировании нормально отображать числа с группами и десятичными разрядами.

Я знаю про TMaskEdit, но он убог чуть менее чем полностью 😒
...
Рейтинг: 0 / 0
TEdit с DisplayFormat
    #40038283
Michael Longneck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TDBEdit ?
...
Рейтинг: 0 / 0
TEdit с DisplayFormat
    #40038286
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Michael Longneck,

А без DB его как использовать?..
...
Рейтинг: 0 / 0
TEdit с DisplayFormat
    #40038290
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Michael LongneckTDBEdit ?

Внезапно, но это наследник TMaskEdit.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
TEdit с DisplayFormat
    #40038295
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если вкратце, то мне нужен редактор для суммы денег.
Причём не различающий '.' и ',' (но это легко делается через OnKeyPress) и группирующий разряды по три.

TMaskEdit не подходит потому что он не умеет в динамические маски (требует жёстко указывать количество символов).
...
Рейтинг: 0 / 0
TEdit с DisplayFormat
    #40038296
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpмне нужен редактор для суммы денег.

Внезапно: TMoneyEdit.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
TEdit с DisplayFormat
    #40038297
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

alekcvpмне нужен редактор для суммы денег.

Внезапно: TMoneyEdit.

Это TMSовский?
...
Рейтинг: 0 / 0
TEdit с DisplayFormat
    #40038308
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче, оказалось быстрее свой суррогат накидать.
...
Рейтинг: 0 / 0
TEdit с DisplayFormat
    #40038341
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

в джедаях смотрел? Я уже не помню, откуда он у меня. А ставить D2007 лень :)
...
Рейтинг: 0 / 0
TEdit с DisplayFormat
    #40038361
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,

Да мне вот эта ботва с калькулятором как раз и не нужна, нужно было тупо отображение по разрядам и ограничение на 2 десятичных разряда.
...
Рейтинг: 0 / 0
TEdit с DisplayFormat
    #40038364
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если ещё кому вдруг понадобится такое без дополнительной нагрузки
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
unit mkMoneyEdit;

interface

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

type
  TMKMoneyEdit = class(TEdit)
  private
    function GetAsValue: Integer; inline;
    procedure SetByValue(const Value: Integer); inline;
  protected
    procedure CMEnter(var Message: TCMEnter); message CM_ENTER;
    procedure CMExit(var Message: TCMExit); message CM_EXIT;
    procedure KeyPress(var Key: Char); override;
    procedure WMPaste(var Message: TWMPaste); message WM_PASTE;
  public
    property Value: Integer read GetAsValue write SetByValue;
  end;

function FormatAsDecimal(const SourceText: string): string;
function RemoveNonDigits(const SourceText: string; AsPenny: Boolean): string;

procedure Register;

implementation

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

function FormatAsDecimal(const SourceText: string): string;
const
  PennyChars: Integer = 3;
var
  CharIndex: Integer;     // индекс текущего символа
  TextLength: Integer;    // длина строки
  PennyValue: string;
begin
  { Проверка на пустую строку }
  if SourceText.IsEmpty then
    Exit(SourceText);

  CharIndex := SourceText.IndexOf(FormatSettings.DecimalSeparator);
  if CharIndex < 0 then
  begin
    PennyValue := FormatSettings.DecimalSeparator + '00';
    TextLength := SourceText.Length
  end else begin
    PennyValue := SourceText.Substring(CharIndex, PennyChars) + '00';
    SetLength(PennyValue, 3);
    TextLength := CharIndex;
  end;

  { Тривиальный вариант: 3 или менее цифр }
  if TextLength <= 3 then
    Exit(SourceText.Substring(0, TextLength) + PennyValue);

  { Пример: '12345678' = 8 + (7 div 3) пробелов + копейки = 13 символов ('12 345 678.00') }
  SetLength(Result, TextLength + (TextLength - 1) div 3 + PennyChars);

  { Копируем копейки }
  CharIndex := Result.Length - PennyChars + 1;
  Move(PennyValue[1], Result[CharIndex], PennyChars * SizeOf(Char));

  { Копируем число по группам из 3х разрядов }
  while TextLength > 3 do
  begin
    Dec(TextLength, 3);
    Move(SourceText[TextLength + 1], Result[CharIndex - 3], 6);
    Dec(CharIndex, 4);
    Result[CharIndex] := #32;
  end;
  Move(SourceText[1], Result[1], TextLength * SizeOf(Char));

end;

function RemoveNonDigits(const SourceText: string; AsPenny: Boolean): string;
var
  CharIndex: Integer;  // индекс символа в новой строке
  LastIndex: Integer;  // индекс десятичного разделителя
  SourceChar: Char;    // текущий символ
begin
  CharIndex := 1;
  LastIndex := 0;
  SetLength(Result, SourceText.Length);
  for SourceChar in SourceText do
  begin
    case SourceChar of
      '0'..'9': Result[CharIndex] := SourceChar;
      ',', '.':
        if AsPenny then
        begin
          LastIndex := CharIndex;
          Continue;
        end else begin
          LastIndex := CharIndex + 1;
          Result[CharIndex] := FormatSettings.DecimalSeparator;
        end
    else
      Continue;
    end;
    Inc(CharIndex);
    if (LastIndex > 0) and (CharIndex - LastIndex >= 2) then
      Break;
  end;
  SetLength(Result, CharIndex - 1);
end;

{ TMKMoneyEdit }

procedure TMKMoneyEdit.CMEnter(var Message: TCMEnter);
begin
  inherited;
  Text := RemoveNonDigits(Text, False);
end;

procedure TMKMoneyEdit.CMExit(var Message: TCMExit);
begin
  inherited;
  Text := FormatAsDecimal(Text);
end;

function TMKMoneyEdit.GetAsValue: Integer;
begin
  Result := StrToIntDef(RemoveNonDigits(Text, True), 0);
end;

procedure TMKMoneyEdit.KeyPress(var Key: Char);
begin
  case Key of
    '0'..'9', #8: inherited KeyPress(Key);
    ',', '.':
      if Pos(FormatSettings.DecimalSeparator, Text) = 0 then
      begin
        Key := FormatSettings.DecimalSeparator;
        inherited KeyPress(Key);
      end else
        Key := #0;
  else
    Key := #0;
  end;
end;

procedure TMKMoneyEdit.SetByValue(const Value: Integer);
begin
  Text := FormatAsDecimal((Value / 100).ToString);
end;

procedure TMKMoneyEdit.WMPaste(var Message: TWMPaste);
var
  ValidText: string;
begin
  inherited;
  ValidText := RemoveNonDigits(Text, False);
  if not Focused then
    ValidText := FormatAsDecimal(ValidText);
  Text := ValidText;
end;

end.

...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TEdit с DisplayFormat
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]