Delphi - ярлыки TEdit не отображаются (только для Windows 7 / Vista) - PullRequest
3 голосов
/ 02 декабря 2011

Я получил несколько форм TEdit, вставленных в другую форму, но их метки не отображаются, пока я не изменю размер окна. Это происходит только в Windows Vista / Windows 7. В Windows XP все помечено правильно.

Я уже тестировал перерисовку / обновление (просто TEdit / все формы и т. Д.) Без результата.

Delphi 7.

Спасибо за ваш ответ

плохая версия enter image description here

Правильная версия enter image description here

код будет добавлен достаточно скоро:)

Ответы [ 5 ]

2 голосов
/ 20 января 2012

Мне удалось решить эту проблему в моем проекте. Кажется, это проблема порядка рисования. В конечном счете, решение было вызвать frame.Refresh; на кадре, который не отображался должным образом. Но, выбирая правильное место, чтобы указать, что Refresh был немного хитрым, я попробовал несколько мест, прежде чем нашел место, которое сработало. Для меня это работало в том методе, где я выбираю, какой вложенный фрейм отображать на панели параметров, и физически отображаю вложенный фрейм, чтобы вызвать frame.Refresh; для самого внутреннего фрейма, окружающего метки, которые не отображаются должным образом. Казалось, что вызывать обновление для внутреннего фрейма, а не для фрейма всего окна

Из снимков экрана, которые вы показываете, вы выглядите так, как будто у вас, вероятно, есть подобная сложная настройка рамок, где могут быть кадры, отображаемые поверх рамок, которые могут динамически меняться после первоначального отображения рамки. Похоже, это была установка, которая создаст проблему в первую очередь, изначально показанный кадр никогда не имел проблем.

Однако, одна заметка: если окно смещается с экрана или изменяется в размерах, перед ним перетаскивается другое окно или исчезают кнопки при наведении курсора мыши на то, что эти действия могут вызвать повторное возникновение проблемы. появляются спонтанно. Могут быть дополнительные места, например, в специальном обработчике для изменения размера окна и т. Д. Или в таймере, где вы должны периодически вызывать обновление для фрейма, аналогично некоторым решениям, упомянутым для ошибки ALT Key. Кажется, что есть некоторое совпадение в типе проблемы и способах ее устранения, но это не та же самая причина (эта ошибка, кажется, происходит независимо от клавиши Alt)

2 голосов
/ 03 декабря 2011
0 голосов
/ 20 апреля 2017

На самом деле это намного проще, чем любое из представленных решений.Единственное, что нужно, это ответить на сообщение WM_UPDATEUISTATE.Добавьте в форму процедуру, подобную приведенной ниже:

...
  protected
  procedure WmUpdateUIState(var Msg: TMessage); message WM_UPDATEUISTATE;
...

procedure TForm1.WmUpdateUIState(var Msg: TMessage);
begin
  inherited;
  Invalidate;
end; { WmUpdateUIState }

Готово!

Проверено на Windows 10 64 бит.

Можно ускорить процесс, создав модульнапример:

unit FixAltKeyForm;

interface

uses
  Windows, Messages, Classes, Forms;


type
  TForm = class(Forms.TForm)
  protected
    procedure WmUpdateUIState(var Msg: TMessage); message WM_UPDATEUISTATE;
  end; { TForm }

implementation

{ TForm }

procedure TForm.WmUpdateUIState(var Msg: TMessage);
begin
  inherited;
  Invalidate;
end; { WmUpdateUIState }

end.

Добавьте имя модуля в предложение использования сеанса интерфейса любой формы, где это поведение требуется, и все готово.Обязательно указывайте имя устройства ПОСЛЕ «Формы» в разделе «Использование».Не нужно ни создавать пакет, ни устанавливать что-либо вообще.Это то, что я называю Visual Subclassing, из-за отсутствия лучшего термина.

0 голосов
/ 25 февраля 2015

Я получаю то же самое, за исключением того, что кажется, что проблема возникает только тогда, когда приложение тематически.Если он не обработан (то есть Project-> Options-> Application-> Appearance-> Default Style = Windows), он работает нормально, не требует обновления или перерисовки.

Кажется, что он связан конкретно с классом TFrame, поэтому яИнтересно, что-то не так с обработчиком перерисовки (связано с Invalidate).Что-то в процессе ChangeNotify или в обработчике сообщений Windows в VCL может не пробраться вверх по цепочке родительского контроля и ответить каскадным перерисовкой, перенаправляющей обратно на все «недействительные».

Еще один кластер, который я пробовалс успехом устанавливал свойство Visible для элемента управления хоста в False в одной строке, а затем в true в следующей строке, то есть:

procedure TFrame1.UpdatePanel;
  Panel1.Visible := False;
  Panel1.Visible := True;
end;

Затем вызывал этот метод там, где необходим правильный рисунок.

Все остальные дочерние элементы управления Panel1 были нарисованы отлично.Возможно, вам придется кэшировать расположение текстового курсора, если ваше обновление происходит при изменении содержимого одного из дочерних элементов управления, такого как TEdit или TMemo.Это должно быть тривиально по сравнению с часами поиска причины проблемы.Возможно, поиск в источнике VCL метода Setter для свойства Visible на управляющем хосте-нарушителе (таком как TPanel) может дать некоторое представление об общей проблеме того, почему Repaint и Refresh не работают должным образом в этом случае..

0 голосов
/ 04 февраля 2013
{ Labels no Windows Vista, 7, 8 to Fix the problem, Delphi 7 32 bits }

в FormShow:

var
  i : Integer;
begin
   For i := 0 to (Form1.ComponentCount - 1) do
     begin
        If (Form1.Components[i].ClassType = TLabel) then
            TLabel(Form1.Components[i]).Refresh;
     end;
end;

Просто запустите это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...