Доброго времени суток! Может кто подсказать как для поля редактирования TEdit сделать что-то на подобии подсказки ввода, т.е. если поле не активно и пустое, вывести в него светло серую надпись с указанием того, что нужно вводить или отображением значения по умолчанию. Но при появления фокуса ввода, поле ведет себя обычным образом, т.е. серая надпись исчезает и мигает курсор ожидая ввода текста. Что то подобное есть в полях ввода 1С: http://joxi.ru/a2XaQgwFwKW9YA.jpg
Есть догадки что это как то можно сделать непосредственным рисованием на канве элемента, но как это все сделать, не могу сообразить. Среда разработки Delphi 10.2.3 Tokyo. Может в новых версия это как то проще делается, но если у кого то есть пример под Delphi 7, то думаю проблем не будет. Заранее спасибо!
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
15-02-2020 23:29
По методу Geo:
// TODO: есть небольшой косячок в этом компоненте: если ввести текст, СОВПАДАЮЩИЙ
// с PlaceHolder (руками, например), то он "исчезнет". Надо бы поправить, но мне пока
// подобные случаи не встречались, так что лень
unit PlaceHolder;
interface
Uses Forms,Controls,Graphics,StdCtrls;
Type
TEdit=class(StdCtrls.TEdit)
private
fPlaceHolder:string;
procedure SetPlaceholder(Value:string);
function GetText:string;
procedure SetText(Value:string);
function IsActive:boolean;
protected
procedure DoEnter;override;
procedure DoExit;override;
public
property PlaceHolder:string read fPlaceHolder write SetPlaceHolder;
property Text:string read GetText write SetText;
end;
implementation
{ TEdit }
procedure TEdit.DoEnter;
begin
inherited;
if inherited Text=PlaceHolder then begin
inherited Text:='';
Font.Color:=clWindowText;
end;
end;
procedure TEdit.DoExit;
begin
inherited;
if inherited Text='' then begin
inherited Text:=PlaceHolder;
Font.Color:=clGray;
end;
end;
function TEdit.GetText: string;
var
S:string;
begin
S:=inherited Text;
if S=PlaceHolder then Result:=''
else Result:=S;
end;
function TEdit.IsActive: boolean;
var
Wc:TWinControl;
begin
Wc:=Parent;
while (Wc<>nil) and (not (Wc is TCustomForm)) do
Wc:=Wc.Parent;
Result:=(Wc<>nil)and(TForm(Wc).ActiveControl=Self);
end;
procedure TEdit.SetPlaceholder(Value: string);
begin
fPlaceHolder:=Value;
if IsActive then exit;
if Text='' then begin
inherited Text:=PlaceHolder;
Font.Color:=clGray;
end;
end;
procedure TEdit.SetText(Value: string);
begin
inherited Text:=Value;
if IsActive then exit;
if Value='' then begin
Font.Color:=clGray;
inherited Text:=PlaceHolder;
end else Font.Color:=clWindowText;
end;
end.
Как пользоваться: указываем Uses Placeholder ПОСЛЕДНИМ используемым модулем (ну или как минимум после StdCtrls), для нужных компонентов в FormCreate (или другом подходящем обработчике) пропишем: Edit1.Placeholder:='часть ФИО';
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.