MessageBox - SetFocus i dziwne zachowanie programu

0

Nie wiem dlaczego program działa nie tak jak wydaje mi się że powinien.
Na formularzu mam dwa elementy edit: edit1 i edit2.
Zawsze aktywny komponent chcę oznaczać kolorem żółtym.
Po uruchomieniu programu aktywny jest edit1. Klikam w edit2 i chcę żeby w edit1 w akcji onExit wykonało się sprawdzenie wartości w edit1.
Pokazuję messagebox-a z dwoma przyciskami Tak/Nie i komunikatem "wartość wydaje się błędna. czy chcesz ją poprawić?"
Jeśli użytkownik kliknie w Tak (czyli chce wartość poprawić) to zostaję na edit1 a edit2 (mimo kliknięci) zostaje w standardowym kolorze.
Jeśli użytkownik kliknie na Nie (czyli NIE chce poprawić wartości) to powinien przejść na edit2 i edit2 powinno zmienić kolor na żółty a edit1 na standardowy kolor.
Niestety po kliknięciu w edit2 i wyborze przycisku NIE, edit2 nie zmienia koloru mimo że jest aktywne bo jak zaczynam klikać coś na klawiaturze to piszę w edit2.
Mój kod wygląda tak.


void __fastcall TForml::EditlExit (TObject *Sender)
{
	Editi->Color=OryginalColor; 
	String info = "Value in Edit1 seems to be wrong. Are You want to change it?";
	int iQuestion = MessageBox (Handle, info.c_str(), L"Warning", MB_YESNO | MB_ICONWARNING | MB_DEFBUTTON1); 
	if (i Question == ID YES) {
		Edit1->SetFocus():
	}	
	else if (i question == ID_NO) {
		Edit1->Color = OryginalColor;
	}
}

void __fastcall TForml::Edit1Enter (Tobject *Sender)
{
	OryginalColor = Edit1->Color;
	Edit1->Color = clYellow;
}

void __fastcall TForml::Edit2Enter (Tobject *Sender)
{
	OryginalColor = Edit2->Color;
	Edit2->Color = clYellow;
}

void __fastcall TForml::Edit1Exit (Tobject *Sender)
{
	Edit2->Color = OryginalColor;
}
0
KiK napisał(a):

Po uruchomieniu programu aktywny jest edit1. Klikam w edit2 i chcę żeby w edit1 w akcji onExit wykonało się sprawdzenie wartości w edit1.
Pokazuję messagebox-a z dwoma przyciskami Tak/Nie i komunikatem "wartość wydaje się błędna. czy chcesz ją poprawić?"
Jeśli użytkownik kliknie w Tak (czyli chce wartość poprawić) to zostaję na edit1 a edit2 (mimo kliknięci) zostaje w standardowym kolorze.
Jeśli użytkownik kliknie na Nie (czyli NIE chce poprawić wartości) to powinien przejść na edit2 i edit2 powinno zmienić kolor na żółty a edit1 na standardowy kolor.

Offtopic: czy ty lubisz wnerwiać użytkownika? Pomysł na funkcjonalność może się wydawać dobry, ale jest to jedno z bardziej frasujących rozwiązań.

A to wygląda na literówkę (a nawet dwie):

if (i Question == ID YES) {

Offtipic2: mam nadzieje, że nie korzystasz z pana Z...ta. Tak jak on najwyraźniej nie masz pojęcia co to jest Sender.

0

Masz niekompilujący się kod (trzy pisowni jednej zmiennej iQuestion, i Question, i question.
A skoro kod się nie kompiluje to IDE odpala jakąś starą wersje.

0
KiK napisał(a):

Pokazuję messagebox-a z dwoma przyciskami Tak/Nie i komunikatem "wartość wydaje się błędna. czy chcesz ją poprawić?"

Ja się tylko przyczepię w ramach ciekawostki, że Microsoft zaleca używanie czasownika zamiast Tak/Nie, czyli w tym przypadku "Popraw" i "Nie poprawiaj".

Przykład można zobaczyć np. w Notatniku, gdzie obecnie jest Zapisz/Nie zapisuj/Anuluj zamiast (jak to było dawniej) Tak/Nie/Anuluj.

screenshot-20220330150011.png

Taki message box można wyświetlić za pomocą TaskDialogIndirect.

0

@Azarien: Pewne trochę bardziej przyjaźnie dla użytkowników.

0

Tutaj cały kompilujący się kod (na początku pisałem z palucha bo na kompie nie miałem Buildera także sorki ):


#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TColor OryginalColor;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1Exit(TObject *Sender)
{
	Edit1->Color = OryginalColor;
	String info = "Value in Edit1 seems to be wrong. Are You want to change it?";
	int iQuestion = MessageBox(Handle, info.c_str(), L"Warning", MB_YESNO | MB_ICONWARNING | MB_DEFBUTTON1);
	if (iQuestion == ID_YES) {
		Edit1->SetFocus();
	}
	else if (iQuestion == ID_NO) {
		Edit1->Color = OryginalColor;
	}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1Enter(TObject *Sender)
{
    OryginalColor = Edit1->Color;
	Edit1->Color = clYellow;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit2Enter(TObject *Sender)
{
	OryginalColor = Edit2->Color;
	Edit2->Color = clYellow;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit2Exit(TObject *Sender)
{
	Edit2->Color = OryginalColor;
}
//---------------------------------------------------------------------------


0

@MarekR22: dla jednego usera coś może być wkurzające a dla drugiego nie. Ja już się nauczyłem że nie dyskutuję z gustami użytkowników. Jak większość chce tak to tak będzie !!!
Jakbym się miał za każdym razem zastanawiać czy wszystkim się spodoba to bym wyłysiał. A nie wiem jak będziesz chciał uszczęśliwić userów to i tak znajdzie się chociażby jeden który i tak Cię skrytykuję. Także ja już na to nie zwracam uwagi.

0

Twój wybór, skoro wolisz się przekonać na własnej skórze.

W twoim kodzie wnerwia mnie jedno, nie jest DRY (pisane z pamięci):

void __fastcall TForm1::EditAnyEnter(TObject *Sender)
{
    TEdit* edit = static_cast<TEdit*>(Sender);
    edit->Tag = edit->Color;
	edit->Color = static_cast<NativeInt>(clYellow);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::EditAnyExit(TObject *Sender)
{
    TEdit* edit = static_cast<TEdit*>(Sender);
	edit->Color = static_cast<TColor>(edit->Tag);
}
0

To i tak słabe rozwiązanie. O wiele lepsze będzie stosowanie zdarzenia Screen->OnActiveControlChange Pisałem coś takiego u siebie, jednak w tej chwili nie mam dostępu do źródeł. Nie mniej jednak można to zrobić na kilka sposobów. Pierwszy lepszy jest tutaj https://zarko-gajic.iz.hr/generic-solution-to-coloring-the-focused-entry-control-in-delphi-applications/ Składnia Delphi nie jest trudna i pisząc w VLC'u trzeba się przygotować, że większość przykładów artykułów będzie pisana z użyciem tego języka.

0

Pewnie to dlatego że ta koncepcja zaburza trochę zmianę aktywnej kontrolki !
Lepiej było by uruchomic sprawdzanie danych "po skonczeniu onExit"

1 użytkowników online, w tym zalogowanych: 0, gości: 1