Przepraszam. Zagmatwałem. Jest tak:
Edit -> onEditValueChange
Button -> onClick
kiedy user wpisuje jakąś wartość i opuszcza pole (np. Tabulatorem) odpalane jest zdarzenie onEditValueChange. Sprawdzam wtedy czy wprowadzona wartość odpowiada jakiejś jednej konkretne wartości z konkretnej tabeli (odpalam zapytanie SQL). Jeżeli tak - w drugim polu Edit pojawia się opis do tej wprowadzonej wartości - np. po wprowadzeniu konkretnego nr PESEL - w drugim Editcie pojawia się Imię i nazwisko.
Wizualnie jest tak: | EDIT1 - wartość | Button (...) | EDIT2 - opisowy |
Teraz - jeżeli wprowadzimy część wartości i i ta wartość nie odpowiada wprost jednemu rekordowi (jest wiele odpowiedników lub brak odpowiedników) - wywoływane jest zdarzenie Button->onClick, które pokazuje okienko z listą dostępnych wartości - z tym, że lista jest już przefiltrowana już wstępnie. np. jeżeli wprowadzimy pierwsze trzy cyfry nr PESEL - pojawia się okienko z listą osób, których PESELe zaczynają się tak jak wprowadzona wartość. User wybiera interesującą wartość z listy i ta przepisuje się do Edita (potem jest jeszcze raz wykonywane sprawdzenie czy wprowadzona wartość odpowiada dokładnie jednej wartośc - wiem glupota, ale na razie nie chce rozbijać aplikacji, która robi swoją robotę)
Kłopot pojawia się w momencie, kiedy User wprowadzi część wartości (np. pierwsze trzy cyfry nr PESEL) i od razu kliknie przycisk (Button) - wtedy odpala się w pierwszej kolejności zdarzenie Edit -> onEditValueChanged, a później Button -> onClick.
teraz jeżeli utworzę sobie jakąś zmienną globalną np. ExitFromEdit i w zdarzeniu onEditValueChange po wywolaniu zdarzeni onClick ustawię ją na TRUE, a w zdarzeniu onClick sprawdzę czy ExitFromEdit = TRUE - nie wykonuję treści onClick. Jednakże na końcu - poza if-em daję ExitFromEdit:=FALSE.
Taki układ generalnie działa - ale. Jeżeli wyjdę z edita Tabem (nie klikam Buttona) - pozostaje wartość TRUE w ExitFromEdit - pochodzę trochę po aplikacji, poklikam w inne pola, powprowadzam inne dane, a następnie stwierdzam, że jednak chciałbym wywolać okienko spod Buttona -> onClick - za pierwszym kliknięciem nadal mam ExitFromEdit = TRUE. Na końcu przestawiam zawsze na FALSE więc drugie kliknięcie pozwala na wykonanie treści onClick.
No dobra to teraz bardziej konkretnie:
Zdarzenie onEditValueChanged - pesel = Edit
procedure Tfrm_Glowne.peselPropertiesEditValueChanged(Sender: TObject);
begin
if pesel.Text<>'' then begin
Pacjent.SQL.Clear;
Pacjent.SQL.Add('SELECT p.nazwisko ,p.imiona ,p.data_ur ,p.pesel ,p.plec ,p.miasto ,p.ulica ');
Pacjent.SQL.Add(' ,p.nr_domu ,p.nr_lokalu ,p.id_pac ,p.id_dodatkowy ,p.status_nr_pesel ');
Pacjent.SQL.Add(' ,p.uprawnienie ,p.uprawnienia_po ,p.status_potw_ub ,p.kod_kasa_ch ');
Pacjent.SQL.Add(' ,COALESCE(CAST(p.nr_karty_ubezp AS VARCHAR(12)),'''') || COALESCE(CAST(p.nr_dupl_karty_ub AS VARCHAR(12)), '''') AS nr_karty ');
Pacjent.SQL.Add(' ,CAST(p.nazwisko || '', '' || p.imiona AS VARCHAR(52)) AS pacjent ');
Pacjent.SQL.Add('FROM pacjent p ');
Pacjent.SQL.Add('WHERE (czy_archiwalny=0) ');
Pacjent.SQL.Add(' AND UPPER(p.pesel)=UPPER('''+pesel.Text+''') ');
Pacjent.Active:=TRUE;
LogDebug(Pacjent.SQL.Text);
if not Pacjent.Eof then begin
pesel.Text:=Pacjent.FieldByName('pesel').AsString;
cxTextEdit1.Text:=Pacjent.FieldByName('pacjent').AsString;
end else begin
JvXPButton1Click(Self);
ReturnFromPacjent:=TRUE;
end;
end else begin
ClearPacjent;
end;
end;
Button - onClick
procedure Tfrm_Glowne.JvXPButton1Click(Sender: TObject);
begin
if not ReturnFromPacjent then begin
if Tabelka=nil then
Tabelka:=TTabelka.Create(Self);
if Tabelka<>nil then begin
Tabelka.Czysc;
Tabelka.tytul:='Pacjenci';
Tabelka.dopasuj:=TRUE;
Tabelka.Query.SQL.Clear;
Tabelka.Query.SQL.Add('SELECT p.nazwisko, p.imiona, p.data_ur, p.pesel, p.plec, p.miasto, p.ulica ');
Tabelka.Query.SQL.Add(' ,p.nr_domu, p.nr_lokalu, p.id_pac, p.id_dodatkowy ');
Tabelka.Query.SQL.Add(' ,COALESCE(CAST(p.nr_karty_ubezp AS VARCHAR(12)),'''') || COALESCE(CAST(p.nr_dupl_karty_ub AS VARCHAR(12)), '''') AS nr_karty ');
Tabelka.Query.SQL.Add('FROM pacjent p ');
Tabelka.Query.SQL.Add('WHERE (czy_archiwalny=0) ');
if pesel.Text<>'' then begin
Tabelka.Query.SQL.Add(' AND ( ');
Tabelka.Query.SQL.Add(' (p.nazwisko || p.imiona LIKE '''+pesel.Text+'%'') ');
Tabelka.Query.SQL.Add(' OR (p.pesel LIKE '''+pesel.Text+'%'') ');
Tabelka.Query.SQL.Add(' ) ');
end;
Tabelka.Query.SQL.Add('ORDER BY UPPER(nazwisko), UPPER(imiona) ');
Tabelka.Query.Active:=TRUE;
LogDebug(Tabelka.Query.SQL.Text);
if Tabelka.Query.Active then begin
//--------------------------------------------
Tabelka.IDField.Clear;
Tabelka.IDField.Add('pesel');
//--------------------------------------------
Tabelka.ToggleVisible('id_pac',FALSE);
Tabelka.ToggleVisible('id_dodatkowy',FALSE);
//--------------------------------------------
Tabelka.SetColumnCaption('nazwisko','Nazwisko');
Tabelka.SetColumnCaption('imiona','Imię');
Tabelka.SetColumnCaption('data_ur','Urodzony');
Tabelka.SetColumnCaption('pesel','PESEL');
Tabelka.SetColumnCaption('plec','Płeć');
Tabelka.SetColumnCaption('miasto','Miejscowość');
Tabelka.SetColumnCaption('ulica','Ulica');
Tabelka.SetColumnCaption('nr_domu','Nr domu');
Tabelka.SetColumnCaption('nr_lokalu','Nr lokalu');
Tabelka.SetColumnCaption('id_pac','id_pac');
Tabelka.SetColumnCaption('id_dodatkowy','id_dodatkowy');
//--------------------------------------------
end;
if Tabelka.ShowModal=mrOK then begin
if Tabelka.num_wynik>=0 then begin
pesel.Text:=Tabelka.wynik[0][0];
end;
end;
end else begin
Application.MessageBox('Błąd podczas wywoływania okna dialogowego','Błąd wywołania okna',MB_ICONERROR+MB_OK);
end;
end;
ReturnFromPacjent:=FALSE;
end;