2015-07-29 9 views
5

Chcę ustawić własną procedurę do OnGetText przypadku pól w dynamicznym zapytaniaDelphi: Ustawienie OnGetText Event Handler na polach dynamicznego zapytania

Moja procedura jest tak:

procedure TMainFrm.MyFieldGetText(Sender: TField; var Text: String; 
    DisplayText: Boolean); 
begin 

    ... 

end; 
  • "... Podpisy" jest tablicą String stałe

ustawić obsługi zdarzeń w OnAfterOpen przypadku ADOQuery:

procedure TImportFrm.ADOQueryAfterOpen(DataSet: TDataSet); 
var 
I : Integer; 
begin 
for I := 0 to ADOQuery.FieldCount - 1 do 
    ADOQuery.Fields[I].OnGetText := MainFrm.MyFieldGetText; 
end; 

Ale po otwarciu ADOQuery, nie ma tekstu do wyświetlenia, wygląda na to, że wartość Tekst jest pusta!

Wydaje się, że nie ma znaczenia, co moja procedura zrobić, bo kiedy ustawić pustą procedurę (bez kodu), żaden tekst wyświetlany zbyt

co poszło nie tak?

Dzięki ...

+0

Sprawdź obsługi z Debugger (ustawić punkt przerwania w pierwszym wierszu) – mjn

+0

Dzięki, ale jak mówię: " Wydaje się, że nie ma znaczenia, co robi moja procedura, ponieważ kiedy ustawiłem pustą procedurę (bez kodu), nie wyświetlił się też tekst " –

+1

Czy chcesz sprawdzić w Sender.FieldName zamiast Sender.Name? – Jason

Odpowiedz

3

Spróbuj tego:

procedure TMainFrm.MyFieldGetText(Sender: TField; var Text: String; 
    DisplayText: Boolean); 
begin 
    if Sender.FieldName = 'XX' then 
    begin 
    Text := .... String(Sender.Value);// (or Text := Sender.AsString); 
    end; 
    if Sender.FieldName = 'YY' then 
    begin 
    Text := .... String(Sender.Value);// (or Text := Sender.AsString); 
    end; 
    ... 

end; 
+1

Dlaczego zatem gałąź dla 'FieldName' jest? Możesz bezpośrednio napisać 'Text: = Sender.AsString;'. – TLama

+0

@TLama Ponieważ OP napisał to zanim zredagował pytanie. –

1

Dzięki wszystkim

Problemem było to, że powinienem wspomnieć wszystkie sytuacje Tekst i powinna wykorzystać Sender.value zamiast Tekst po prawej stronie! Zmieniłem tę procedurę i problem rozwiązany:

procedure TMainFrm.MyFieldGetText(Sender: TField; var Text: String; 
    DisplayText: Boolean); 
begin 
if Sender.AsVariant = Null then 
    Exit; 

Text := Sender.AsString; 

if MatchStr(Sender.FieldName, BooleanFieldNames) then 
    Text := BooleanCaptions[Sender.AsInteger]; 

if Sender.FieldName = 'BNStatus' then 
    Text := BNStatusCaptions[Sender.AsInteger]; 

if MatchStr(Sender.FieldName, ['FStatus', 'LStatus', 'FirstStatus']) then 
    Text := FLStatusCaptions[Sender.AsInteger]; 

if Sender.FieldName = 'PayType' then 
    Text := PayTypeCaptions[Sender.AsInteger]; 

if Sender.FieldName = 'BGType' then 
    Text := BGTypeCaptions[Sender.AsInteger]; 

if Sender.FieldName = 'Updated' then 
    Text := UpdatedCaptions[Sender.AsInteger]; 

if Sender.FieldName = 'DieUser' then 
    Text := DieUserCaptions[Sender.AsInteger]; 

if Sender.FieldName = 'LiveUser' then 
    Text := LiveUserCaptions[Sender.AsInteger]; 

if Sender.FieldName = 'NVStatus' then 
    Text := NVStatusCaptions[Sender.AsInteger]; 

if Sender.FieldName = 'BSGender' then 
    Text := BSGenderCaptions[Sender.AsInteger]; 

if Sender.FieldName = 'BSMType' then 
    Text := BSMTypeCaptions[Sender.AsInteger]; 

end; 

Dzięki jeszcze raz ...

+0

Widziałeś moją odpowiedź? –

+0

Tak i oznaczono Up-Vote i zaakceptowano jako odpowiedź teraz!dzięki –

+1

Możesz użyć 'Sender.AsInteger' zamiast' StrToInt (Sender.Value) 'jeśli te pola są typu całkowitego. – TLama

Powiązane problemy