Tedit, як відрізнити user введення від присвоєння text нового значення

TEdit, як відрізнити user введення від присвоєння Text нового значення?

І то і то викликає OnChange. Як же тоді відрізнити?

Завдання така: є два TEdit, призначений для користувача введення в одному Edit1 змінює значення і в іншому Edit2, але тільки до тих пір, поки користувач сам не змінить значення в Edit2. Після цього будь-яке редагування Edit1 не впливає на Edit2. Як відрізнити користувача введення в Edit2 від Edit2.Text = "Щось"? Таким чином я міг би встановити прапорець flagEdit2UserChanged і далі, при зміні Edit1 дивитися, якщо прапорець встановлений, то вже не змінюємо Edit2. Реагувати на натискання клавіш в Edit2? тобто використовувати Edit2.OnKeyPress? Поки що так і роблю, фільтруючи символ # 13. Чи є якесь інше рішення? може бути засноване на Win Api?

Ах да, проблема ще в тому що показі форми йде привласнення началних значень в тому числі і в Edit1, що впливає на Edit2. Звичайно це все не проблема, потрібно просто стежити коли edit1 може влият на Edit2, але все ж хотілося б дізнатися спосіб змінити властивість Text без виклику OnChange?

І текст і ончейндж - це властивості.
крім цього є ще купа властивостей наприклад активний контрол форми


> sanx # XA0; (26.08.09 22:43) # XA0;

> Edit1 змінює значення і в іншому Edit2, але тільки до тих
> Пір, поки користувач сам не змінить значення в Edit2.

Edit2.Modified?

Ведмедик П'ятачок, не зовсім зрозумів як це може допомогти?
Leonid Troyanovsky спс, дійсно при зміні Edit2.Text, властивість Edit2.Modified не змінюється. Воно змінюється лише при зміні тексту самим користувачем.

Але залишилося навчиться змінювати текст в TEdit без виклику TEdit.OnChange, таке можливо?

> sanx # XA0; (26.08.09 23:46) [4]

Ви ж уже самі відповіли на своє запитання (за допомогою Леоніда). Початкове значення Edit2.Modified = False, воно зміниться тільки при юзерскій введенні. Це і є той самий прапорець, який Ви хотіли:


procedure Edit1Change:
begin
# XA0 ;.
# XA0; if not Edit2.Modified then
# XA0; begin
# XA0; # XA0 ;. // Юзер ще не міняв текст в Edit2, тому змінюємо його програмно
# XA0; end;
# XA0 ;.
end;

Юрій Зотов, це так, але у мене йде ініціалізація значень для Edit1 при відкритті вікна, і в цей момент (edit1.text = "початковий текст") спрацьовує edit1.onChange, той в якому йде перевірка if not edit2.modified then. А в цей момент це мені не потрібно.

Так Вооще проблем вирішити це немає звичайно, можна флажек зробити типу flagThisInit, просто цікаво як змінити властивість text / caption для будь-якого компонента, але так щоб # XA0, не було OnChange. Як я розумію проблема в тому що VCL реагує на події вінди, а вінду попросив не слати ця подія не вийде. ) Це вже просто цікаво :)

> Просто цікаво як змінити властивість text / caption для
> Будь-якого компонента, але так щоб # XA0, не було OnChange

Для тих, кому "просто цікаво", є очевидний спосіб - прибрати обробник OnChange на час присвоювання.


var
# XA0; Temp: TNotifyEvent;
begin
# XA0; Temp: = Edit1.OnChange;
# XA0; try
# XA0; # XA0; Edit1.OnChange: = nil;
# XA0; # XA0; Edit1.Text: = "some new text";
# XA0; finally
# XA0; # XA0; Edit1.OnChange: = Temp;
# XA0; end;

> sanx # XA0; (27.08.09 2:53) [6]

> У мене йде ініціалізація значень для Edit1 при відкритті вікна,
> І в цей момент (edit1.text = "початковий текст") спрацьовує
> Edit1.onChange, той в якому йде перевірка
> If not edit2.modified then.
> А в цей момент це мені не потрібно.

Призначайте обробник події edit1.onChange не в design-time, а кодом, після ініціалізації edit1.text = "початковий текст".

Пам'ять: 0.74 MB
Час: 0.094 c